@idsoftsource/initial-process 3.7.4 → 3.7.5

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.
@@ -1850,11 +1850,11 @@ class AddressMapPickerComponent {
1850
1850
  this.cancelled.emit();
1851
1851
  }
1852
1852
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AddressMapPickerComponent, deps: [{ token: i0.NgZone }, { token: i1$1.BsModalService }], target: i0.ɵɵFactoryTarget.Component });
1853
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AddressMapPickerComponent, isStandalone: false, selector: "im-address-map-picker", inputs: { visible: "visible", title: "title", searchPlaceholder: "searchPlaceholder", options: "options", initialLat: "initialLat", initialLng: "initialLng", initialAddress: "initialAddress" }, outputs: { confirmed: "confirmed", cancelled: "cancelled" }, viewQueries: [{ propertyName: "pickerModalTpl", first: true, predicate: ["pickerModal"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #pickerModal>\r\n <div class=\"im-map-picker-modal__header\">\r\n <h5 class=\"im-map-picker-modal__title\">{{ title }}</h5>\r\n <button type=\"button\" class=\"im-map-picker-modal__close\" aria-label=\"Close\" (click)=\"cancel()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"im-map-picker-modal__body\">\r\n <div class=\"im-map-picker\" *ngIf=\"mapsApiReady; else mapsLoadingTpl\">\r\n <div class=\"im-map-picker__search\">\r\n <span class=\"im-map-picker__search-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.8\" />\r\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"im-map-picker__search-input\" ngx-google-places-autocomplete [options]=\"options\"\r\n [(ngModel)]=\"searchText\" (onAddressChange)=\"onSearchAddressChange($event)\"\r\n [placeholder]=\"searchPlaceholder\" />\r\n\r\n <button type=\"button\" class=\"im-map-picker__locate-btn\" (click)=\"useCurrentLocation()\"\r\n [disabled]=\"isLocating\" title=\"Use my current location\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.8\" />\r\n <path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" />\r\n </svg>\r\n <span>{{ isLocating ? 'Locating\u2026' : 'Current location' }}</span>\r\n </button>\r\n </div>\r\n\r\n <p class=\"im-map-picker__hint\">Click on the map or drag the pin to set the exact address location.\r\n <strong>US addresses only.</strong>\r\n </p>\r\n\r\n <div class=\"im-map-picker__map-wrap\">\r\n <google-map class=\"im-map-picker__map\" height=\"380px\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\"\r\n [options]=\"mapOptions\" (mapClick)=\"onMapClick($event)\">\r\n <map-marker *ngIf=\"markerPosition\" [position]=\"markerPosition\" [options]=\"markerOptions\"\r\n (mapDragend)=\"onMarkerDragEnd($event)\">\r\n </map-marker>\r\n </google-map>\r\n\r\n <button type=\"button\" class=\"im-map-picker__view-toggle\" [class.im-map-picker__view-toggle--active]=\"isSatelliteView\"\r\n (click)=\"toggleSatelliteView()\" [title]=\"isSatelliteView ? 'Switch to map view' : 'Switch to satellite view'\">\r\n <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\">\r\n <path d=\"M12 2 2 7l10 5 10-5-10-5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\r\n <path d=\"m2 12 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"m2 17 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ isSatelliteView ? 'Map' : 'Satellite' }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result im-map-picker__result--warn\" *ngIf=\"isOutOfCountry && !isResolving\">\r\n <span class=\"im-map-picker__result-icon\">!</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">This location is outside the United States.</div>\r\n <div class=\"im-map-picker__result-coords\">Please choose an address within the US.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\r\n *ngIf=\"isNonAddressFeature && !isResolving\">\r\n <span class=\"im-map-picker__result-icon\">!</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">This looks like water, parkland, a rail line, or similar \u2014\r\n not a street address.</div>\r\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\r\n address above.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\r\n *ngIf=\"isMissingStreetAddress && !isNonAddressFeature && !isResolving\">\r\n <span class=\"im-map-picker__result-icon\">!</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">We couldn't find an exact street address here.</div>\r\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\r\n address above.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result\"\r\n *ngIf=\"resolvedAddress && !isResolving && !isOutOfCountry && !isMissingStreetAddress && !isNonAddressFeature\">\r\n <span class=\"im-map-picker__result-icon\">&#10003;</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">{{ resolvedAddress.formattedAddress }}</div>\r\n <div class=\"im-map-picker__result-coords\">\r\n {{ resolvedAddress.latitude.toFixed(5) }}, {{ resolvedAddress.longitude.toFixed(5) }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__empty\" *ngIf=\"!resolvedAddress && !isResolving\">\r\n No location selected yet \u2014 search above or click the map.\r\n </div>\r\n\r\n <div class=\"im-map-picker__loading\" *ngIf=\"isResolving\">Resolving address\u2026</div>\r\n </div>\r\n\r\n <ng-template #mapsLoadingTpl>\r\n <div class=\"im-map-picker im-map-picker__loading-state\">Loading map\u2026</div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"im-map-picker-modal__footer\">\r\n <div class=\"im-map-picker__actions\">\r\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--secondary\" (click)=\"cancel()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--primary\"\r\n [disabled]=\"!resolvedAddress || isResolving || isOutOfCountry || isMissingStreetAddress || isNonAddressFeature\"\r\n (click)=\"confirm()\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path d=\"m5 13 4 4L19 7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Confirm Location\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["::ng-deep .im-map-picker-modal .modal-content{border-radius:12px;overflow:hidden;background:#fff!important}::ng-deep .pac-container{z-index:1075!important}.im-map-picker-modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #eef1f5}.im-map-picker-modal__title{margin:0;font-size:16px;font-weight:600;color:#1a2535}.im-map-picker-modal__close{border:none;background:transparent;color:#64748b;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:6px}.im-map-picker-modal__close:hover{background:#f1f5f9;color:#1a2535}.im-map-picker-modal__body{padding:16px 20px}.im-map-picker-modal__footer{padding:14px 20px;border-top:1px solid #eef1f5}.im-map-picker__search{position:relative;display:flex;align-items:center;gap:8px;margin-bottom:10px}.im-map-picker__search-icon{position:absolute;left:12px;color:#94a3b8;display:flex}.im-map-picker__search-input{flex:1;padding:10px 12px 10px 36px;border:1px solid #d1d9e6;border-radius:8px;font-size:13.5px;outline:none}.im-map-picker__search-input:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.im-map-picker__locate-btn{display:flex;align-items:center;gap:6px;padding:9px 12px;border:1px solid #d1d9e6;border-radius:8px;background:#fff;color:#4077ad;font-size:12.5px;white-space:nowrap;cursor:pointer}.im-map-picker__locate-btn:hover{background:#eef4ff}.im-map-picker__locate-btn:disabled{opacity:.6;cursor:default}.im-map-picker__hint{font-size:12px;color:#64748b;margin:0 0 10px}.im-map-picker__map-wrap{position:relative;border-radius:10px;overflow:hidden;border:1px solid #e2e8f0}.im-map-picker__view-toggle{position:absolute;right:10px;bottom:10px;display:flex;align-items:center;gap:6px;padding:7px 10px;border:none;border-radius:8px;background:#fff;box-shadow:0 2px 8px #00000026;font-size:12px;cursor:pointer}.im-map-picker__view-toggle--active{background:#1a2535;color:#fff}.im-map-picker__result{display:flex;align-items:flex-start;gap:10px;margin-top:12px;padding:10px 12px;border-radius:8px;background:#f0fdf7;border:1px solid #bbf7d0}.im-map-picker__result--warn{background:#fffaf0;border-color:#fde68a}.im-map-picker__result-icon{font-weight:700;color:#16a34a}.im-map-picker__result--warn .im-map-picker__result-icon{color:#b45309}.im-map-picker__result-address{font-size:13px;font-weight:600;color:#1a2535}.im-map-picker__result-coords{font-size:11.5px;color:#64748b;margin-top:2px}.im-map-picker__empty,.im-map-picker__loading,.im-map-picker__loading-state{margin-top:12px;font-size:12.5px;color:#64748b;text-align:center;padding:14px}.im-map-picker__actions{display:flex;justify-content:flex-end;gap:10px}.im-map-picker__btn{display:flex;align-items:center;gap:6px;padding:9px 16px;border-radius:8px;font-size:13px;font-weight:600;border:none;cursor:pointer}.im-map-picker__btn--secondary{background:#f1f5f9;color:#334155}.im-map-picker__btn--secondary:hover{background:#e2e8f0}.im-map-picker__btn--primary{background:#4077ad;color:#fff}.im-map-picker__btn--primary:hover{background:#2e5c8a}.im-map-picker__btn--primary:disabled{opacity:.5;cursor:default}\n"], dependencies: [{ kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i4.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "directive", type: GooglePlaceDirective, selector: "[ngx-google-places-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }] });
1853
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AddressMapPickerComponent, isStandalone: false, selector: "im-address-map-picker", inputs: { visible: "visible", title: "title", searchPlaceholder: "searchPlaceholder", options: "options", initialLat: "initialLat", initialLng: "initialLng", initialAddress: "initialAddress" }, outputs: { confirmed: "confirmed", cancelled: "cancelled" }, viewQueries: [{ propertyName: "pickerModalTpl", first: true, predicate: ["pickerModal"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #pickerModal>\n <div class=\"im-map-picker-modal__header\">\n <h5 class=\"im-map-picker-modal__title\">{{ title }}</h5>\n <button type=\"button\" class=\"im-map-picker-modal__close\" aria-label=\"Close\" (click)=\"cancel()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <div class=\"im-map-picker-modal__body\">\n <div class=\"im-map-picker\" *ngIf=\"mapsApiReady; else mapsLoadingTpl\">\n <div class=\"im-map-picker__search\">\n <span class=\"im-map-picker__search-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.8\" />\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\n </svg>\n </span>\n <input type=\"text\" class=\"im-map-picker__search-input\" ngx-google-places-autocomplete [options]=\"options\"\n [(ngModel)]=\"searchText\" (onAddressChange)=\"onSearchAddressChange($event)\"\n [placeholder]=\"searchPlaceholder\" />\n\n <button type=\"button\" class=\"im-map-picker__locate-btn\" (click)=\"useCurrentLocation()\"\n [disabled]=\"isLocating\" title=\"Use my current location\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.8\" />\n <path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" />\n </svg>\n <span>{{ isLocating ? 'Locating\u2026' : 'Current location' }}</span>\n </button>\n </div>\n\n <p class=\"im-map-picker__hint\">Click on the map or drag the pin to set the exact address location.\n <strong>US addresses only.</strong>\n </p>\n\n <div class=\"im-map-picker__map-wrap\">\n <google-map class=\"im-map-picker__map\" height=\"380px\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\"\n [options]=\"mapOptions\" (mapClick)=\"onMapClick($event)\">\n <map-marker *ngIf=\"markerPosition\" [position]=\"markerPosition\" [options]=\"markerOptions\"\n (mapDragend)=\"onMarkerDragEnd($event)\">\n </map-marker>\n </google-map>\n\n <button type=\"button\" class=\"im-map-picker__view-toggle\" [class.im-map-picker__view-toggle--active]=\"isSatelliteView\"\n (click)=\"toggleSatelliteView()\" [title]=\"isSatelliteView ? 'Switch to map view' : 'Switch to satellite view'\">\n <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\">\n <path d=\"M12 2 2 7l10 5 10-5-10-5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\n <path d=\"m2 12 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"m2 17 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span>{{ isSatelliteView ? 'Map' : 'Satellite' }}</span>\n </button>\n </div>\n\n <div class=\"im-map-picker__result im-map-picker__result--warn\" *ngIf=\"isOutOfCountry && !isResolving\">\n <span class=\"im-map-picker__result-icon\">!</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">This location is outside the United States.</div>\n <div class=\"im-map-picker__result-coords\">Please choose an address within the US.</div>\n </div>\n </div>\n\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\n *ngIf=\"isNonAddressFeature && !isResolving\">\n <span class=\"im-map-picker__result-icon\">!</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">This looks like water, parkland, a rail line, or similar \u2014\n not a street address.</div>\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\n address above.</div>\n </div>\n </div>\n\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\n *ngIf=\"isMissingStreetAddress && !isNonAddressFeature && !isResolving\">\n <span class=\"im-map-picker__result-icon\">!</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">We couldn't find an exact street address here.</div>\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\n address above.</div>\n </div>\n </div>\n\n <div class=\"im-map-picker__result\"\n *ngIf=\"resolvedAddress && !isResolving && !isOutOfCountry && !isMissingStreetAddress && !isNonAddressFeature\">\n <span class=\"im-map-picker__result-icon\">&#10003;</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">{{ resolvedAddress.formattedAddress }}</div>\n <div class=\"im-map-picker__result-coords\">\n {{ resolvedAddress.latitude.toFixed(5) }}, {{ resolvedAddress.longitude.toFixed(5) }}\n </div>\n </div>\n </div>\n\n <div class=\"im-map-picker__empty\" *ngIf=\"!resolvedAddress && !isResolving\">\n No location selected yet \u2014 search above or click the map.\n </div>\n\n <div class=\"im-map-picker__loading\" *ngIf=\"isResolving\">Resolving address\u2026</div>\n </div>\n\n <ng-template #mapsLoadingTpl>\n <div class=\"im-map-picker im-map-picker__loading-state\">Loading map\u2026</div>\n </ng-template>\n </div>\n\n <div class=\"im-map-picker-modal__footer\">\n <div class=\"im-map-picker__actions\">\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--secondary\" (click)=\"cancel()\">\n Cancel\n </button>\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--primary\"\n [disabled]=\"!resolvedAddress || isResolving || isOutOfCountry || isMissingStreetAddress || isNonAddressFeature\"\n (click)=\"confirm()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <path d=\"m5 13 4 4L19 7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n Confirm Location\n </button>\n </div>\n </div>\n</ng-template>\n", styles: ["::ng-deep .im-map-picker-modal .modal-content{border-radius:12px;overflow:hidden;background:#fff!important}::ng-deep .pac-container{z-index:1075!important}.im-map-picker-modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #eef1f5}.im-map-picker-modal__title{margin:0;font-size:16px;font-weight:600;color:#1a2535}.im-map-picker-modal__close{border:none;background:transparent;color:#64748b;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:6px}.im-map-picker-modal__close:hover{background:#f1f5f9;color:#1a2535}.im-map-picker-modal__body{padding:16px 20px}.im-map-picker-modal__footer{padding:14px 20px;border-top:1px solid #eef1f5}.im-map-picker__search{position:relative;display:flex;align-items:center;gap:8px;margin-bottom:10px}.im-map-picker__search-icon{position:absolute;left:12px;color:#94a3b8;display:flex}.im-map-picker__search-input{flex:1;padding:10px 12px 10px 36px;border:1px solid #d1d9e6;border-radius:8px;font-size:13.5px;outline:none}.im-map-picker__search-input:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.im-map-picker__locate-btn{display:flex;align-items:center;gap:6px;padding:9px 12px;border:1px solid #d1d9e6;border-radius:8px;background:#fff;color:#4077ad;font-size:12.5px;white-space:nowrap;cursor:pointer}.im-map-picker__locate-btn:hover{background:#eef4ff}.im-map-picker__locate-btn:disabled{opacity:.6;cursor:default}.im-map-picker__hint{font-size:12px;color:#64748b;margin:0 0 10px}.im-map-picker__map-wrap{position:relative;border-radius:10px;overflow:hidden;border:1px solid #e2e8f0}.im-map-picker__view-toggle{position:absolute;right:10px;bottom:10px;display:flex;align-items:center;gap:6px;padding:7px 10px;border:none;border-radius:8px;background:#fff;box-shadow:0 2px 8px #00000026;font-size:12px;cursor:pointer}.im-map-picker__view-toggle--active{background:#1a2535;color:#fff}.im-map-picker__result{display:flex;align-items:flex-start;gap:10px;margin-top:12px;padding:10px 12px;border-radius:8px;background:#f0fdf7;border:1px solid #bbf7d0}.im-map-picker__result--warn{background:#fffaf0;border-color:#fde68a}.im-map-picker__result-icon{font-weight:700;color:#16a34a}.im-map-picker__result--warn .im-map-picker__result-icon{color:#b45309}.im-map-picker__result-address{font-size:13px;font-weight:600;color:#1a2535}.im-map-picker__result-coords{font-size:11.5px;color:#64748b;margin-top:2px}.im-map-picker__empty,.im-map-picker__loading,.im-map-picker__loading-state{margin-top:12px;font-size:12.5px;color:#64748b;text-align:center;padding:14px}.im-map-picker__actions{display:flex;justify-content:flex-end;gap:10px}.im-map-picker__btn{display:flex;align-items:center;gap:6px;padding:9px 16px;border-radius:8px;font-size:13px;font-weight:600;border:none;cursor:pointer}.im-map-picker__btn--secondary{background:#f1f5f9;color:#334155}.im-map-picker__btn--secondary:hover{background:#e2e8f0}.im-map-picker__btn--primary{background:#4077ad;color:#fff}.im-map-picker__btn--primary:hover{background:#2e5c8a}.im-map-picker__btn--primary:disabled{opacity:.5;cursor:default}\n"], dependencies: [{ kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i4.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "directive", type: GooglePlaceDirective, selector: "[ngx-google-places-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }] });
1854
1854
  }
1855
1855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AddressMapPickerComponent, decorators: [{
1856
1856
  type: Component,
1857
- args: [{ selector: 'im-address-map-picker', standalone: false, template: "<ng-template #pickerModal>\r\n <div class=\"im-map-picker-modal__header\">\r\n <h5 class=\"im-map-picker-modal__title\">{{ title }}</h5>\r\n <button type=\"button\" class=\"im-map-picker-modal__close\" aria-label=\"Close\" (click)=\"cancel()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"im-map-picker-modal__body\">\r\n <div class=\"im-map-picker\" *ngIf=\"mapsApiReady; else mapsLoadingTpl\">\r\n <div class=\"im-map-picker__search\">\r\n <span class=\"im-map-picker__search-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.8\" />\r\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"im-map-picker__search-input\" ngx-google-places-autocomplete [options]=\"options\"\r\n [(ngModel)]=\"searchText\" (onAddressChange)=\"onSearchAddressChange($event)\"\r\n [placeholder]=\"searchPlaceholder\" />\r\n\r\n <button type=\"button\" class=\"im-map-picker__locate-btn\" (click)=\"useCurrentLocation()\"\r\n [disabled]=\"isLocating\" title=\"Use my current location\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.8\" />\r\n <path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" />\r\n </svg>\r\n <span>{{ isLocating ? 'Locating\u2026' : 'Current location' }}</span>\r\n </button>\r\n </div>\r\n\r\n <p class=\"im-map-picker__hint\">Click on the map or drag the pin to set the exact address location.\r\n <strong>US addresses only.</strong>\r\n </p>\r\n\r\n <div class=\"im-map-picker__map-wrap\">\r\n <google-map class=\"im-map-picker__map\" height=\"380px\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\"\r\n [options]=\"mapOptions\" (mapClick)=\"onMapClick($event)\">\r\n <map-marker *ngIf=\"markerPosition\" [position]=\"markerPosition\" [options]=\"markerOptions\"\r\n (mapDragend)=\"onMarkerDragEnd($event)\">\r\n </map-marker>\r\n </google-map>\r\n\r\n <button type=\"button\" class=\"im-map-picker__view-toggle\" [class.im-map-picker__view-toggle--active]=\"isSatelliteView\"\r\n (click)=\"toggleSatelliteView()\" [title]=\"isSatelliteView ? 'Switch to map view' : 'Switch to satellite view'\">\r\n <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\">\r\n <path d=\"M12 2 2 7l10 5 10-5-10-5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\r\n <path d=\"m2 12 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"m2 17 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ isSatelliteView ? 'Map' : 'Satellite' }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result im-map-picker__result--warn\" *ngIf=\"isOutOfCountry && !isResolving\">\r\n <span class=\"im-map-picker__result-icon\">!</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">This location is outside the United States.</div>\r\n <div class=\"im-map-picker__result-coords\">Please choose an address within the US.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\r\n *ngIf=\"isNonAddressFeature && !isResolving\">\r\n <span class=\"im-map-picker__result-icon\">!</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">This looks like water, parkland, a rail line, or similar \u2014\r\n not a street address.</div>\r\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\r\n address above.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\r\n *ngIf=\"isMissingStreetAddress && !isNonAddressFeature && !isResolving\">\r\n <span class=\"im-map-picker__result-icon\">!</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">We couldn't find an exact street address here.</div>\r\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\r\n address above.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__result\"\r\n *ngIf=\"resolvedAddress && !isResolving && !isOutOfCountry && !isMissingStreetAddress && !isNonAddressFeature\">\r\n <span class=\"im-map-picker__result-icon\">&#10003;</span>\r\n <div class=\"im-map-picker__result-text\">\r\n <div class=\"im-map-picker__result-address\">{{ resolvedAddress.formattedAddress }}</div>\r\n <div class=\"im-map-picker__result-coords\">\r\n {{ resolvedAddress.latitude.toFixed(5) }}, {{ resolvedAddress.longitude.toFixed(5) }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"im-map-picker__empty\" *ngIf=\"!resolvedAddress && !isResolving\">\r\n No location selected yet \u2014 search above or click the map.\r\n </div>\r\n\r\n <div class=\"im-map-picker__loading\" *ngIf=\"isResolving\">Resolving address\u2026</div>\r\n </div>\r\n\r\n <ng-template #mapsLoadingTpl>\r\n <div class=\"im-map-picker im-map-picker__loading-state\">Loading map\u2026</div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"im-map-picker-modal__footer\">\r\n <div class=\"im-map-picker__actions\">\r\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--secondary\" (click)=\"cancel()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--primary\"\r\n [disabled]=\"!resolvedAddress || isResolving || isOutOfCountry || isMissingStreetAddress || isNonAddressFeature\"\r\n (click)=\"confirm()\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path d=\"m5 13 4 4L19 7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Confirm Location\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["::ng-deep .im-map-picker-modal .modal-content{border-radius:12px;overflow:hidden;background:#fff!important}::ng-deep .pac-container{z-index:1075!important}.im-map-picker-modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #eef1f5}.im-map-picker-modal__title{margin:0;font-size:16px;font-weight:600;color:#1a2535}.im-map-picker-modal__close{border:none;background:transparent;color:#64748b;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:6px}.im-map-picker-modal__close:hover{background:#f1f5f9;color:#1a2535}.im-map-picker-modal__body{padding:16px 20px}.im-map-picker-modal__footer{padding:14px 20px;border-top:1px solid #eef1f5}.im-map-picker__search{position:relative;display:flex;align-items:center;gap:8px;margin-bottom:10px}.im-map-picker__search-icon{position:absolute;left:12px;color:#94a3b8;display:flex}.im-map-picker__search-input{flex:1;padding:10px 12px 10px 36px;border:1px solid #d1d9e6;border-radius:8px;font-size:13.5px;outline:none}.im-map-picker__search-input:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.im-map-picker__locate-btn{display:flex;align-items:center;gap:6px;padding:9px 12px;border:1px solid #d1d9e6;border-radius:8px;background:#fff;color:#4077ad;font-size:12.5px;white-space:nowrap;cursor:pointer}.im-map-picker__locate-btn:hover{background:#eef4ff}.im-map-picker__locate-btn:disabled{opacity:.6;cursor:default}.im-map-picker__hint{font-size:12px;color:#64748b;margin:0 0 10px}.im-map-picker__map-wrap{position:relative;border-radius:10px;overflow:hidden;border:1px solid #e2e8f0}.im-map-picker__view-toggle{position:absolute;right:10px;bottom:10px;display:flex;align-items:center;gap:6px;padding:7px 10px;border:none;border-radius:8px;background:#fff;box-shadow:0 2px 8px #00000026;font-size:12px;cursor:pointer}.im-map-picker__view-toggle--active{background:#1a2535;color:#fff}.im-map-picker__result{display:flex;align-items:flex-start;gap:10px;margin-top:12px;padding:10px 12px;border-radius:8px;background:#f0fdf7;border:1px solid #bbf7d0}.im-map-picker__result--warn{background:#fffaf0;border-color:#fde68a}.im-map-picker__result-icon{font-weight:700;color:#16a34a}.im-map-picker__result--warn .im-map-picker__result-icon{color:#b45309}.im-map-picker__result-address{font-size:13px;font-weight:600;color:#1a2535}.im-map-picker__result-coords{font-size:11.5px;color:#64748b;margin-top:2px}.im-map-picker__empty,.im-map-picker__loading,.im-map-picker__loading-state{margin-top:12px;font-size:12.5px;color:#64748b;text-align:center;padding:14px}.im-map-picker__actions{display:flex;justify-content:flex-end;gap:10px}.im-map-picker__btn{display:flex;align-items:center;gap:6px;padding:9px 16px;border-radius:8px;font-size:13px;font-weight:600;border:none;cursor:pointer}.im-map-picker__btn--secondary{background:#f1f5f9;color:#334155}.im-map-picker__btn--secondary:hover{background:#e2e8f0}.im-map-picker__btn--primary{background:#4077ad;color:#fff}.im-map-picker__btn--primary:hover{background:#2e5c8a}.im-map-picker__btn--primary:disabled{opacity:.5;cursor:default}\n"] }]
1857
+ args: [{ selector: 'im-address-map-picker', standalone: false, template: "<ng-template #pickerModal>\n <div class=\"im-map-picker-modal__header\">\n <h5 class=\"im-map-picker-modal__title\">{{ title }}</h5>\n <button type=\"button\" class=\"im-map-picker-modal__close\" aria-label=\"Close\" (click)=\"cancel()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <div class=\"im-map-picker-modal__body\">\n <div class=\"im-map-picker\" *ngIf=\"mapsApiReady; else mapsLoadingTpl\">\n <div class=\"im-map-picker__search\">\n <span class=\"im-map-picker__search-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.8\" />\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\n </svg>\n </span>\n <input type=\"text\" class=\"im-map-picker__search-input\" ngx-google-places-autocomplete [options]=\"options\"\n [(ngModel)]=\"searchText\" (onAddressChange)=\"onSearchAddressChange($event)\"\n [placeholder]=\"searchPlaceholder\" />\n\n <button type=\"button\" class=\"im-map-picker__locate-btn\" (click)=\"useCurrentLocation()\"\n [disabled]=\"isLocating\" title=\"Use my current location\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.8\" />\n <path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" />\n </svg>\n <span>{{ isLocating ? 'Locating\u2026' : 'Current location' }}</span>\n </button>\n </div>\n\n <p class=\"im-map-picker__hint\">Click on the map or drag the pin to set the exact address location.\n <strong>US addresses only.</strong>\n </p>\n\n <div class=\"im-map-picker__map-wrap\">\n <google-map class=\"im-map-picker__map\" height=\"380px\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\"\n [options]=\"mapOptions\" (mapClick)=\"onMapClick($event)\">\n <map-marker *ngIf=\"markerPosition\" [position]=\"markerPosition\" [options]=\"markerOptions\"\n (mapDragend)=\"onMarkerDragEnd($event)\">\n </map-marker>\n </google-map>\n\n <button type=\"button\" class=\"im-map-picker__view-toggle\" [class.im-map-picker__view-toggle--active]=\"isSatelliteView\"\n (click)=\"toggleSatelliteView()\" [title]=\"isSatelliteView ? 'Switch to map view' : 'Switch to satellite view'\">\n <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\">\n <path d=\"M12 2 2 7l10 5 10-5-10-5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\n <path d=\"m2 12 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"m2 17 10 5 10-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span>{{ isSatelliteView ? 'Map' : 'Satellite' }}</span>\n </button>\n </div>\n\n <div class=\"im-map-picker__result im-map-picker__result--warn\" *ngIf=\"isOutOfCountry && !isResolving\">\n <span class=\"im-map-picker__result-icon\">!</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">This location is outside the United States.</div>\n <div class=\"im-map-picker__result-coords\">Please choose an address within the US.</div>\n </div>\n </div>\n\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\n *ngIf=\"isNonAddressFeature && !isResolving\">\n <span class=\"im-map-picker__result-icon\">!</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">This looks like water, parkland, a rail line, or similar \u2014\n not a street address.</div>\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\n address above.</div>\n </div>\n </div>\n\n <div class=\"im-map-picker__result im-map-picker__result--warn\"\n *ngIf=\"isMissingStreetAddress && !isNonAddressFeature && !isResolving\">\n <span class=\"im-map-picker__result-icon\">!</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">We couldn't find an exact street address here.</div>\n <div class=\"im-map-picker__result-coords\">Zoom in and click directly on a building, or search for the\n address above.</div>\n </div>\n </div>\n\n <div class=\"im-map-picker__result\"\n *ngIf=\"resolvedAddress && !isResolving && !isOutOfCountry && !isMissingStreetAddress && !isNonAddressFeature\">\n <span class=\"im-map-picker__result-icon\">&#10003;</span>\n <div class=\"im-map-picker__result-text\">\n <div class=\"im-map-picker__result-address\">{{ resolvedAddress.formattedAddress }}</div>\n <div class=\"im-map-picker__result-coords\">\n {{ resolvedAddress.latitude.toFixed(5) }}, {{ resolvedAddress.longitude.toFixed(5) }}\n </div>\n </div>\n </div>\n\n <div class=\"im-map-picker__empty\" *ngIf=\"!resolvedAddress && !isResolving\">\n No location selected yet \u2014 search above or click the map.\n </div>\n\n <div class=\"im-map-picker__loading\" *ngIf=\"isResolving\">Resolving address\u2026</div>\n </div>\n\n <ng-template #mapsLoadingTpl>\n <div class=\"im-map-picker im-map-picker__loading-state\">Loading map\u2026</div>\n </ng-template>\n </div>\n\n <div class=\"im-map-picker-modal__footer\">\n <div class=\"im-map-picker__actions\">\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--secondary\" (click)=\"cancel()\">\n Cancel\n </button>\n <button type=\"button\" class=\"im-map-picker__btn im-map-picker__btn--primary\"\n [disabled]=\"!resolvedAddress || isResolving || isOutOfCountry || isMissingStreetAddress || isNonAddressFeature\"\n (click)=\"confirm()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <path d=\"m5 13 4 4L19 7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n Confirm Location\n </button>\n </div>\n </div>\n</ng-template>\n", styles: ["::ng-deep .im-map-picker-modal .modal-content{border-radius:12px;overflow:hidden;background:#fff!important}::ng-deep .pac-container{z-index:1075!important}.im-map-picker-modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #eef1f5}.im-map-picker-modal__title{margin:0;font-size:16px;font-weight:600;color:#1a2535}.im-map-picker-modal__close{border:none;background:transparent;color:#64748b;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:6px}.im-map-picker-modal__close:hover{background:#f1f5f9;color:#1a2535}.im-map-picker-modal__body{padding:16px 20px}.im-map-picker-modal__footer{padding:14px 20px;border-top:1px solid #eef1f5}.im-map-picker__search{position:relative;display:flex;align-items:center;gap:8px;margin-bottom:10px}.im-map-picker__search-icon{position:absolute;left:12px;color:#94a3b8;display:flex}.im-map-picker__search-input{flex:1;padding:10px 12px 10px 36px;border:1px solid #d1d9e6;border-radius:8px;font-size:13.5px;outline:none}.im-map-picker__search-input:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.im-map-picker__locate-btn{display:flex;align-items:center;gap:6px;padding:9px 12px;border:1px solid #d1d9e6;border-radius:8px;background:#fff;color:#4077ad;font-size:12.5px;white-space:nowrap;cursor:pointer}.im-map-picker__locate-btn:hover{background:#eef4ff}.im-map-picker__locate-btn:disabled{opacity:.6;cursor:default}.im-map-picker__hint{font-size:12px;color:#64748b;margin:0 0 10px}.im-map-picker__map-wrap{position:relative;border-radius:10px;overflow:hidden;border:1px solid #e2e8f0}.im-map-picker__view-toggle{position:absolute;right:10px;bottom:10px;display:flex;align-items:center;gap:6px;padding:7px 10px;border:none;border-radius:8px;background:#fff;box-shadow:0 2px 8px #00000026;font-size:12px;cursor:pointer}.im-map-picker__view-toggle--active{background:#1a2535;color:#fff}.im-map-picker__result{display:flex;align-items:flex-start;gap:10px;margin-top:12px;padding:10px 12px;border-radius:8px;background:#f0fdf7;border:1px solid #bbf7d0}.im-map-picker__result--warn{background:#fffaf0;border-color:#fde68a}.im-map-picker__result-icon{font-weight:700;color:#16a34a}.im-map-picker__result--warn .im-map-picker__result-icon{color:#b45309}.im-map-picker__result-address{font-size:13px;font-weight:600;color:#1a2535}.im-map-picker__result-coords{font-size:11.5px;color:#64748b;margin-top:2px}.im-map-picker__empty,.im-map-picker__loading,.im-map-picker__loading-state{margin-top:12px;font-size:12.5px;color:#64748b;text-align:center;padding:14px}.im-map-picker__actions{display:flex;justify-content:flex-end;gap:10px}.im-map-picker__btn{display:flex;align-items:center;gap:6px;padding:9px 16px;border-radius:8px;font-size:13px;font-weight:600;border:none;cursor:pointer}.im-map-picker__btn--secondary{background:#f1f5f9;color:#334155}.im-map-picker__btn--secondary:hover{background:#e2e8f0}.im-map-picker__btn--primary{background:#4077ad;color:#fff}.im-map-picker__btn--primary:hover{background:#2e5c8a}.im-map-picker__btn--primary:disabled{opacity:.5;cursor:default}\n"] }]
1858
1858
  }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1$1.BsModalService }], propDecorators: { visible: [{
1859
1859
  type: Input
1860
1860
  }], title: [{
@@ -2016,7 +2016,7 @@ class AddressVerifyFieldComponent {
2016
2016
  useExisting: forwardRef(() => AddressVerifyFieldComponent),
2017
2017
  multi: true,
2018
2018
  },
2019
- ], ngImport: i0, template: "<div class=\"im-avf\">\r\n <div class=\"im-avf__group\">\r\n <input type=\"text\" [id]=\"inputId\" [name]=\"name\" [class]=\"'im-avf__input ' + inputClass\"\r\n [class.is-invalid]=\"invalid\" [ngStyle]=\"computedInputStyle\" [placeholder]=\"placeholder\"\r\n [attr.maxlength]=\"maxLength\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\"\r\n ngx-google-places-autocomplete [options]=\"options\" [ngModel]=\"value\" (ngModelChange)=\"notifyChange($event)\"\r\n (onAddressChange)=\"onAutocompleteChange($event)\" (input)=\"onManualEdit()\" (blur)=\"notifyTouched()\">\r\n\r\n <button type=\"button\" class=\"im-avf__map-btn\" [class.im-avf__map-btn--verified]=\"isVerified()\"\r\n [tooltip]=\"isVerified() ? 'Location verified \u2014 click to change' : 'Not verified \u2014 click to confirm the location on a map'\"\r\n container=\"body\"\r\n (click)=\"openMapPicker()\">\r\n <svg *ngIf=\"!isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <circle cx=\"12\" cy=\"10\" r=\"2.4\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n </svg>\r\n <svg *ngIf=\"isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"m9 10 2 2 4-4\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <small class=\"im-avf__status im-avf__status--verified\" *ngIf=\"isVerified()\">\r\n Address verified\r\n </small>\r\n <small class=\"im-avf__status im-avf__status--unverified\" *ngIf=\"!isVerified() && value\">\r\n Location not verified \u2014 <span (click)=\"openMapPicker()\">confirm on map</span>\r\n </small>\r\n</div>\r\n\r\n<im-address-map-picker [visible]=\"mapPickerVisible\" [options]=\"options\" [initialLat]=\"mapInitialLat\"\r\n [initialLng]=\"mapInitialLng\" [initialAddress]=\"value\" (confirmed)=\"onMapPickerConfirmed($event)\"\r\n (cancelled)=\"onMapPickerCancelled()\">\r\n</im-address-map-picker>\r\n", styles: [":host{display:block;width:100%}.im-avf__group{position:relative;display:flex;align-items:center}.im-avf__input{width:100%;padding-right:44px!important}.im-avf__map-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:30px;height:30px;border:none;border-radius:8px;background:transparent;color:#4077ad;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease,color .15s ease}.im-avf__map-btn:hover{background:#4077ad1a;transform:translateY(-50%)}.im-avf__map-btn--verified{color:#4077ad}.im-avf__status{display:block;margin-top:4px;font-size:11px}.im-avf__status--verified{color:#1ea672}.im-avf__status--unverified{color:#a0762a}.im-avf__status--unverified span{color:#4077ad;text-decoration:underline;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i13.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: GooglePlaceDirective, selector: "[ngx-google-places-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "component", type: AddressMapPickerComponent, selector: "im-address-map-picker", inputs: ["visible", "title", "searchPlaceholder", "options", "initialLat", "initialLng", "initialAddress"], outputs: ["confirmed", "cancelled"] }] });
2019
+ ], ngImport: i0, template: "<div class=\"im-avf\">\n <div class=\"im-avf__group\">\n <input type=\"text\" [id]=\"inputId\" [name]=\"name\" [class]=\"'im-avf__input ' + inputClass\"\n [class.is-invalid]=\"invalid\" [ngStyle]=\"computedInputStyle\" [placeholder]=\"placeholder\"\n [attr.maxlength]=\"maxLength\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\"\n ngx-google-places-autocomplete [options]=\"options\" [ngModel]=\"value\" (ngModelChange)=\"notifyChange($event)\"\n (onAddressChange)=\"onAutocompleteChange($event)\" (input)=\"onManualEdit()\" (blur)=\"notifyTouched()\">\n\n <button type=\"button\" class=\"im-avf__map-btn\" [class.im-avf__map-btn--verified]=\"isVerified()\"\n [tooltip]=\"isVerified() ? 'Location verified \u2014 click to change' : 'Not verified \u2014 click to confirm the location on a map'\"\n container=\"body\"\n (click)=\"openMapPicker()\">\n <svg *ngIf=\"!isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <circle cx=\"12\" cy=\"10\" r=\"2.4\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n </svg>\n <svg *ngIf=\"isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"m9 10 2 2 4-4\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <small class=\"im-avf__status im-avf__status--verified\" *ngIf=\"isVerified()\">\n Address verified\n </small>\n <small class=\"im-avf__status im-avf__status--unverified\" *ngIf=\"!isVerified() && value\">\n Location not verified \u2014 <span (click)=\"openMapPicker()\">confirm on map</span>\n </small>\n</div>\n\n<im-address-map-picker [visible]=\"mapPickerVisible\" [options]=\"options\" [initialLat]=\"mapInitialLat\"\n [initialLng]=\"mapInitialLng\" [initialAddress]=\"value\" (confirmed)=\"onMapPickerConfirmed($event)\"\n (cancelled)=\"onMapPickerCancelled()\">\n</im-address-map-picker>\n", styles: [":host{display:block;width:100%}.im-avf__group{position:relative;display:flex;align-items:center}.im-avf__input{width:100%;padding-right:44px!important}.im-avf__map-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:30px;height:30px;border:none;border-radius:8px;background:transparent;color:#4077ad;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease,color .15s ease}.im-avf__map-btn:hover{background:#4077ad1a;transform:translateY(-50%)}.im-avf__map-btn--verified{color:#4077ad}.im-avf__status{display:block;margin-top:4px;font-size:11px}.im-avf__status--verified{color:#1ea672}.im-avf__status--unverified{color:#a0762a}.im-avf__status--unverified span{color:#4077ad;text-decoration:underline;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i13.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: GooglePlaceDirective, selector: "[ngx-google-places-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "component", type: AddressMapPickerComponent, selector: "im-address-map-picker", inputs: ["visible", "title", "searchPlaceholder", "options", "initialLat", "initialLng", "initialAddress"], outputs: ["confirmed", "cancelled"] }] });
2020
2020
  }
2021
2021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AddressVerifyFieldComponent, decorators: [{
2022
2022
  type: Component,
@@ -2026,7 +2026,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2026
2026
  useExisting: forwardRef(() => AddressVerifyFieldComponent),
2027
2027
  multi: true,
2028
2028
  },
2029
- ], template: "<div class=\"im-avf\">\r\n <div class=\"im-avf__group\">\r\n <input type=\"text\" [id]=\"inputId\" [name]=\"name\" [class]=\"'im-avf__input ' + inputClass\"\r\n [class.is-invalid]=\"invalid\" [ngStyle]=\"computedInputStyle\" [placeholder]=\"placeholder\"\r\n [attr.maxlength]=\"maxLength\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\"\r\n ngx-google-places-autocomplete [options]=\"options\" [ngModel]=\"value\" (ngModelChange)=\"notifyChange($event)\"\r\n (onAddressChange)=\"onAutocompleteChange($event)\" (input)=\"onManualEdit()\" (blur)=\"notifyTouched()\">\r\n\r\n <button type=\"button\" class=\"im-avf__map-btn\" [class.im-avf__map-btn--verified]=\"isVerified()\"\r\n [tooltip]=\"isVerified() ? 'Location verified \u2014 click to change' : 'Not verified \u2014 click to confirm the location on a map'\"\r\n container=\"body\"\r\n (click)=\"openMapPicker()\">\r\n <svg *ngIf=\"!isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <circle cx=\"12\" cy=\"10\" r=\"2.4\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n </svg>\r\n <svg *ngIf=\"isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"m9 10 2 2 4-4\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <small class=\"im-avf__status im-avf__status--verified\" *ngIf=\"isVerified()\">\r\n Address verified\r\n </small>\r\n <small class=\"im-avf__status im-avf__status--unverified\" *ngIf=\"!isVerified() && value\">\r\n Location not verified \u2014 <span (click)=\"openMapPicker()\">confirm on map</span>\r\n </small>\r\n</div>\r\n\r\n<im-address-map-picker [visible]=\"mapPickerVisible\" [options]=\"options\" [initialLat]=\"mapInitialLat\"\r\n [initialLng]=\"mapInitialLng\" [initialAddress]=\"value\" (confirmed)=\"onMapPickerConfirmed($event)\"\r\n (cancelled)=\"onMapPickerCancelled()\">\r\n</im-address-map-picker>\r\n", styles: [":host{display:block;width:100%}.im-avf__group{position:relative;display:flex;align-items:center}.im-avf__input{width:100%;padding-right:44px!important}.im-avf__map-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:30px;height:30px;border:none;border-radius:8px;background:transparent;color:#4077ad;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease,color .15s ease}.im-avf__map-btn:hover{background:#4077ad1a;transform:translateY(-50%)}.im-avf__map-btn--verified{color:#4077ad}.im-avf__status{display:block;margin-top:4px;font-size:11px}.im-avf__status--verified{color:#1ea672}.im-avf__status--unverified{color:#a0762a}.im-avf__status--unverified span{color:#4077ad;text-decoration:underline;cursor:pointer}\n"] }]
2029
+ ], template: "<div class=\"im-avf\">\n <div class=\"im-avf__group\">\n <input type=\"text\" [id]=\"inputId\" [name]=\"name\" [class]=\"'im-avf__input ' + inputClass\"\n [class.is-invalid]=\"invalid\" [ngStyle]=\"computedInputStyle\" [placeholder]=\"placeholder\"\n [attr.maxlength]=\"maxLength\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\"\n ngx-google-places-autocomplete [options]=\"options\" [ngModel]=\"value\" (ngModelChange)=\"notifyChange($event)\"\n (onAddressChange)=\"onAutocompleteChange($event)\" (input)=\"onManualEdit()\" (blur)=\"notifyTouched()\">\n\n <button type=\"button\" class=\"im-avf__map-btn\" [class.im-avf__map-btn--verified]=\"isVerified()\"\n [tooltip]=\"isVerified() ? 'Location verified \u2014 click to change' : 'Not verified \u2014 click to confirm the location on a map'\"\n container=\"body\"\n (click)=\"openMapPicker()\">\n <svg *ngIf=\"!isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <circle cx=\"12\" cy=\"10\" r=\"2.4\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n </svg>\n <svg *ngIf=\"isVerified()\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\">\n <path d=\"M12 21s-7-6.2-7-11a7 7 0 1 1 14 0c0 4.8-7 11-7 11Z\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"m9 10 2 2 4-4\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <small class=\"im-avf__status im-avf__status--verified\" *ngIf=\"isVerified()\">\n Address verified\n </small>\n <small class=\"im-avf__status im-avf__status--unverified\" *ngIf=\"!isVerified() && value\">\n Location not verified \u2014 <span (click)=\"openMapPicker()\">confirm on map</span>\n </small>\n</div>\n\n<im-address-map-picker [visible]=\"mapPickerVisible\" [options]=\"options\" [initialLat]=\"mapInitialLat\"\n [initialLng]=\"mapInitialLng\" [initialAddress]=\"value\" (confirmed)=\"onMapPickerConfirmed($event)\"\n (cancelled)=\"onMapPickerCancelled()\">\n</im-address-map-picker>\n", styles: [":host{display:block;width:100%}.im-avf__group{position:relative;display:flex;align-items:center}.im-avf__input{width:100%;padding-right:44px!important}.im-avf__map-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:30px;height:30px;border:none;border-radius:8px;background:transparent;color:#4077ad;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease,color .15s ease}.im-avf__map-btn:hover{background:#4077ad1a;transform:translateY(-50%)}.im-avf__map-btn--verified{color:#4077ad}.im-avf__status{display:block;margin-top:4px;font-size:11px}.im-avf__status--verified{color:#1ea672}.im-avf__status--unverified{color:#a0762a}.im-avf__status--unverified span{color:#4077ad;text-decoration:underline;cursor:pointer}\n"] }]
2030
2030
  }], propDecorators: { placeholder: [{
2031
2031
  type: Input
2032
2032
  }], options: [{
@@ -6593,8 +6593,8 @@ class PreviewComponent {
6593
6593
  try {
6594
6594
  const res = (isEdit && hasServerId)
6595
6595
  ? await firstValueFrom(this.userDocumentService
6596
- .updateUserDocument([payload]))
6597
- : await firstValueFrom(this.userDocumentService.createUserDocument([payload]));
6596
+ .updateUserDocument(payload))
6597
+ : await firstValueFrom(this.userDocumentService.createUserDocument(payload));
6598
6598
  if (res?.failed) {
6599
6599
  console.error('Certification validation failed:', res.failures);
6600
6600
  this.certificationLocallySaved[index] = false;
@@ -6623,8 +6623,8 @@ class PreviewComponent {
6623
6623
  try {
6624
6624
  const res = (isEdit && hasServerId)
6625
6625
  ? await firstValueFrom(this.userDocumentService
6626
- .updateUserDocument([payload]))
6627
- : await firstValueFrom(this.userDocumentService.createUserDocument([payload]));
6626
+ .updateUserDocument(payload))
6627
+ : await firstValueFrom(this.userDocumentService.createUserDocument(payload));
6628
6628
  if (res?.failed) {
6629
6629
  console.error('License validation failed:', res.failures);
6630
6630
  this.licenseLocallySaved[index] = false;
@@ -7250,9 +7250,9 @@ class PreviewComponent {
7250
7250
  return {
7251
7251
  // forUser: this.resolvedForUser,
7252
7252
  targetProviderId: this.effectiveTargetProviderId,
7253
- providerName: this.effectiveProviderName,
7253
+ // providerName: this.effectiveProviderName,
7254
7254
  targetUserId: this.effectiveTargetUserId,
7255
- userName: this.payloadUserName,
7255
+ // userName: this.payloadUserName,
7256
7256
  skillSetId: null,
7257
7257
  skillSetName: exp,
7258
7258
  userProfessionId: m.professionId ?? null,
@@ -7262,9 +7262,9 @@ class PreviewComponent {
7262
7262
  starRating: m.starRating ?? 0,
7263
7263
  profileVisibility: !!m.profileVisibility,
7264
7264
  status: 2,
7265
- emailId,
7266
- phoneNumber,
7267
- userHeadShotUrl: ""
7265
+ // emailId,
7266
+ // phoneNumber,
7267
+ // userHeadShotUrl: ""
7268
7268
  };
7269
7269
  });
7270
7270
  }
@@ -7276,9 +7276,9 @@ class PreviewComponent {
7276
7276
  return {
7277
7277
  // forUser: this.resolvedForUser,
7278
7278
  targetProviderId: this.effectiveTargetProviderId,
7279
- providerName: this.effectiveProviderName,
7279
+ // providerName: this.effectiveProviderName,
7280
7280
  targetUserId: this.effectiveTargetUserId,
7281
- userName: this.payloadUserName,
7281
+ // userName: this.payloadUserName,
7282
7282
  toolId: null,
7283
7283
  toolName: exp,
7284
7284
  userProfessionId: m.professionId ?? null,
@@ -7294,7 +7294,7 @@ class PreviewComponent {
7294
7294
  notes: m.notes ?? "",
7295
7295
  profileVisibility: !!m.profileVisibility,
7296
7296
  status: 2,
7297
- emailId,
7297
+ // emailId,
7298
7298
  };
7299
7299
  });
7300
7300
  }
@@ -7781,7 +7781,7 @@ class PreviewComponent {
7781
7781
  }
7782
7782
  }
7783
7783
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PreviewComponent, deps: [{ token: CredentialingStore }, { token: FileService }, { token: UserSkillSetService }, { token: UserToolService }, { token: ProfessionService }, { token: UserProfessionService }, { token: UserDocumentService }, { token: UserEducationService }, { token: UserDetailService }, { token: UserExperienceService }, { token: i1$3.TokenService }, { token: i1$3.RoleContextService }, { token: ProvidersService }, { token: FrontEndProvidersService }, { token: i0.ChangeDetectorRef }, { token: LIBRARY_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
7784
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: PreviewComponent, isStandalone: true, selector: "app-preview", inputs: { providerId: "providerId", isResume: "isResume", resumeModel: "resumeModel", providerName: "providerName", roleData: "roleData", cloudfrontUrl: "cloudfrontUrl", signatureFileId: "signatureFileId", signatureUrl: "signatureUrl" }, outputs: { backToParent: "backToParent" }, viewQueries: [{ propertyName: "companyForm", first: true, predicate: ["companyForm"], descendants: true }], ngImport: i0, template: "<div class=\"preview-page-header\" *ngIf=\"!isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h2 class=\"preview-title mb-0\">Review Extracted Information</h2>\r\n </div>\r\n <p class=\"preview-subtitle text-muted\">We\u2019ve automatically extracted details from your uploaded resume. Please review and confirm accuracy before proceeding.</p>\r\n</div>\r\n\r\n\r\n<div [ngClass]=\"isResume ? '' : 'container py-4 pt-0'\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- Provider initial setup: combined company + personal form (shown until both APIs succeed) -->\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && !hasUserDetailData && !isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-3 section-header-title\">\r\n <img src=\"/assets/images/icons/building.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Personal & Company Details</h5>\r\n <span class=\"badge border section-flag bg-warning-subtle text-warning\">Required to continue</span>\r\n </div>\r\n <div class=\"card shadow-sm border-0\">\r\n <div class=\"card-header bg-white fw-semibold\">Personal Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.firstName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.firstName\" name=\"setupFirstName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.firstName?.trim() && companyFormSubmitted\">First name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.lastName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.lastName\" name=\"setupLastName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.lastName?.trim() && companyFormSubmitted\">Last name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.email?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.email\" name=\"setupEmail\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.email?.trim() && companyFormSubmitted\">Email is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'profile')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.phone?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.phone\" name=\"setupPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.phone?.trim() && companyFormSubmitted\">Phone number is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"setupAddress\" [options]=\"options\"\r\n inputClass=\"form-control form-control-sm\" [invalid]=\"!tempProfile?.address?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.address?.trim() && companyFormSubmitted\">Home address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.city\" name=\"setupUserCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.state\" name=\"setupUserState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.zipCode?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.zipCode\" (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\"\r\n name=\"setupUserZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.zipCode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.country\" name=\"setupUserCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"setupJobTitle\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted}\"\r\n name=\"setupYearsOfExp\" min=\"1\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted\">Years of experience is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #setupHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"setupHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"setupHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"setupHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"headshotPreviewUrl\">\r\n <label class=\"small text-muted d-block\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); setupHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-header bg-white fw-semibold border-top\">Company Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"setupCompanyName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">Company name is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">{{ companyNameError }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'company')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10)}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"setupCompanyPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">Company phone is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">Company phone must be 10 digits</div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Company Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"setupCompanyAddress\"\r\n [options]=\"options\" inputClass=\"form-control form-control-sm\"\r\n [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">Address is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"setupCompanyCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"setupCompanyState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"setupCompanyZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"setupCompanyCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #setupCompanyLogoInput type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"form-control form-control-sm\" (change)=\"uploadCompanyImage($event)\" name=\"setupCompanyLogo\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); setupCompanyLogoInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-footer d-flex align-items-center justify-content-end gap-2\">\r\n <span *ngIf=\"providerSetupError\" class=\"small text-danger me-auto\">{{ providerSetupError }}</span>\r\n <button class=\"btn btn-success px-5 \"\r\n [disabled]=\"isSavingProviderSetup || !isProviderSetupFormComplete\"\r\n (click)=\"saveProviderSetup()\">\r\n <span *ngIf=\"isSavingProviderSetup\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProviderSetup ? 'Saving...' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name !== 'Provider' || hasUserDetailData\">\r\n <div *ngIf=\"details() as data; else loading\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!headshotPreviewUrl\">\r\n {{ (data.firstName?.[0] || '') }}{{ (data.lastName?.[0] || '') }}\r\n </div>\r\n <img *ngIf=\"headshotPreviewUrl\" [src]=\"headshotPreviewUrl\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;\" alt=\"Profile\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ data.firstName }} {{ data.lastName }}</h2>\r\n <span *ngIf=\"basicSectionHasIssues()\" class=\"badge bg-warning-subtle text-warning border section-flag\">\r\n Missing info\r\n </span>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"basicDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ basicDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ data.jobTitle }} \u2022 {{ data.yearsOfExperience }} Years Exp.</p>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"badge bg-primary-subtle text-primary border p-2\">Email Verified</span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-12 border-bottom pb-2\">\r\n <h6 class=\"text-uppercase small fw-bold text-muted\">Summary</h6>\r\n <p class=\"text-secondary small mb-0\">{{ data.summary }}</p>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/envelope.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Email</span>\r\n <span class=\"field-value-sm d-block\">{{ data.email }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ data.phone }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Location</span>\r\n <span class=\"field-value-sm d-block\">{{ data.address }}, {{ data.city }}, {{ data.state }}, {{ data.zipCode }}, {{ data.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!basicDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your basic info.\r\n </span>\r\n <span *ngIf=\"basicDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Basic details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm update-profile-card\" *ngIf=\"isEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Profile</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #basicForm=\"ngForm\" novalidate>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.firstName\" name=\"fName\"\r\n placeholder=\"First Name\" required #fName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"fName.invalid && (fName.dirty || fName.touched)\">First name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.lastName\" name=\"lName\"\r\n placeholder=\"Last Name\" required #lName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"lName.invalid && (lName.dirty || lName.touched)\">Last name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" [(ngModel)]=\"tempProfile.email\" name=\"email\" placeholder=\"Email\"\r\n required email #email=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"email.invalid && (email.dirty || email.touched)\">\r\n <span *ngIf=\"email.errors?.['required']\">Email is required</span>\r\n <span *ngIf=\"email.errors?.['email']\">Email format is invalid</span>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.phone\" (input)=\"phoneMask($event, 'profile')\"\r\n name=\"phone\" placeholder=\"Phone (10 digits)\" (keypress)=\"allowOnlyNumbers($event)\"\r\n required pattern=\"^\\(\\d{3}\\) \\d{3}-\\d{4}$\" maxlength=\"14\" inputmode=\"numeric\" #phone=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"phone.invalid && (phone.dirty || phone.touched)\">\r\n <span *ngIf=\"phone.errors?.['required']\">Phone number is required</span>\r\n <span *ngIf=\"phone.errors?.['pattern']\">Phone number must be 10 digits</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\"></span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"jobTitle\"\r\n placeholder=\"Job Title\" #jobTitle=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"jobTitle.invalid && (jobTitle.dirty || jobTitle.touched)\">Job\r\n title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0)}\"\r\n [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n name=\"yearsOfExperience\" placeholder=\"Years of Experience\" required min=\"1\"\r\n #yearsOfExperience=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0)\">\r\n Years of experience is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"address\" [options]=\"options\"\r\n placeholder=\"Home Address\" required #address=\"ngModel\"\r\n [invalid]=\"address.invalid && (address.dirty || address.touched)\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"address.invalid && (address.dirty || address.touched)\">Home\r\n address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.city\" name=\"city\" placeholder=\"City\"\r\n required #city=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"city.invalid && (city.dirty || city.touched)\">City is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.state\" name=\"state\" placeholder=\"State\"\r\n required #state=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"state.invalid && (state.dirty || state.touched)\">State is\r\n required</div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.zipCode\"\r\n (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\" name=\"zipCode\" placeholder=\"Zip Code\"\r\n required pattern=\"^\\d{1,6}$\" maxlength=\"6\" inputmode=\"numeric\" #zipCode=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"zipCode.invalid && (zipCode.dirty || zipCode.touched)\">Zip code\r\n is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"zipCode.errors?.['pattern'] && (zipCode.dirty || zipCode.touched)\">\r\n Zip code must be up to 6 digits\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.country\" name=\"country\"\r\n placeholder=\"Country\" required #country=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"country.invalid && (country.dirty || country.touched)\">Country\r\n is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6 position-relative\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #updateProfileHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"updateProfileHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\" *ngIf=\"headshotPreviewUrl\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"headshotPreviewUrl\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); updateProfileHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Summary</label>\r\n <textarea class=\"form-control\" rows=\"5\" [(ngModel)]=\"tempProfile.summary\" name=\"sum\"\r\n placeholder=\"Summary\"></textarea>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingBasic || !isBasicFormValid\" (click)=\"save()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && hasUserDetailData && !isResume\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isCompanyEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!companyLogoUrl()\">\r\n {{ (companyDetails()?.companyName?.[0] || '') | uppercase }}{{ (companyDetails()?.companyName?.[1] || '') | uppercase }}\r\n </div>\r\n <img *ngIf=\"companyLogoUrl()\" [src]=\"companyLogoUrl()\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;background:#fff;\" alt=\"Company Logo\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ companyDetails()?.companyName }}</h2>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"companyDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ companyDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ companyDetails()?.companyPhoneNumber }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.companyPhoneNumber }}</span>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Address</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.address1 }}, {{ companyDetails()?.city }}, {{ companyDetails()?.state }}, {{ companyDetails()?.zipcode }}, {{ companyDetails()?.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!companyDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your company info.\r\n </span>\r\n <span *ngIf=\"companyDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Company details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleCompanyEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm\" *ngIf=\"isCompanyEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Company Details</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #companyForm=\"ngForm\" novalidate>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"companyName\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">\r\n Company name is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">\r\n {{ companyNameError }}\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input (input)=\"phoneMask($event, 'company')\" type=\"text\" maxlength=\"14\" (keypress)=\"allowOnlyNumbers($event)\" inputmode=\"numeric\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{ 'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10) }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"companyPhoneNumber\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">\r\n Company phone is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">\r\n Company phone must be 10 digits\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"address1\" [options]=\"options\"\r\n required [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">\r\n Address is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"city\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">\r\n City is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"state\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">\r\n State is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"zipcode\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">\r\n Zip code is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"country\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">\r\n Country is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #uploadCompanyFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadCompanyImage($event)\" class=\"form-control\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); uploadCompanyFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelCompanyEdit()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCompany\" \r\n (click)=\"saveCompanyDetails()\">\r\n <span *ngIf=\"isSavingCompany\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCompany ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [class.section-locked]=\"roleData?.role?.name === 'Provider' && !hasUserDetailData\">\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Profession</h5>\r\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\r\n {{ selectedProfessionCount }} selected\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary px-4\"\r\n [disabled]=\"selectedProfessionCount === 0 || isSavingProfessionsTable\"\r\n (click)=\"submitProfessions()\">\r\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProfessionsTable ? 'Saving...' : professionSubmitLabel }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\r\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\r\n (keydown.enter)=\"createManualProfessionRow()\" />\r\n </div>\r\n\r\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\r\n <div class=\"profession-acc-columns\">\r\n <span></span>\r\n <span>Profession Name</span>\r\n <span>Group</span>\r\n <span>Type</span>\r\n <span></span>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\r\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\r\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\r\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\r\n (change)=\"onProfessionRowCheck(p, $event)\" />\r\n </div>\r\n <div class=\"profession-acc-name\">\r\n {{ p.professionName }}\r\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\r\n <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn ms-1\"\r\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionTypeId() === p.id\" title=\"Delete\">\r\n <span *ngIf=\"deletingProfessionTypeId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingProfessionTypeId() !== p.id\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n <div class=\"profession-acc-group\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else groupText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\r\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\r\n placeholder=\"Select group\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\r\n </div>\r\n <div class=\"profession-acc-type\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else typeText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\r\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\r\n placeholder=\"Select type\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\r\n </div>\r\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\r\n (click)=\"toggleProfessionRow(p)\"\r\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\r\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\r\n <div class=\"profession-acc-panel\">\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\r\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\r\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\r\n (click)=\"copyToAllProfessions(p.id)\" />\r\n Copy to all\r\n </label>\r\n </div>\r\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\r\n Select a Group and Type above to enable saving this profession.\r\n </div>\r\n <div class=\"profession-acc-fields\">\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\r\n <div class=\"profession-acc-stars\">\r\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\r\n (click)=\"setProfessionRowStars(p, s)\"\r\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\r\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\r\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\r\n <span class=\"small text-muted\">Yrs</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--visibility\">\r\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\r\n [name]=\"'profVis-' + p.id\" />\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--notes\">\r\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\r\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\r\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\r\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\r\n Add \"{{ professionSearchQry?.trim() }}\"\r\n </button>\r\n </div>\r\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\r\n class=\"text-center text-muted small py-3\">\r\n No professions found.\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Work Experience</h5>\r\n <span *ngIf=\"experience().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"workSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ workSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"experience().length === 0 || !workSectionHasUnsavedItems() || isSavingWork || isAddingJob() || editingJobIndex() !== null\"\r\n (click)=\"confirmAllWork()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add work experience\" (click)=\"addJob()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"experience().length === 0 && !isAddingJob()\" class=\"empty-state-wrap mb-3\" role=\"button\"\r\n (click)=\"addJob()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/briefcase.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No work experience added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n <div class=\"list-group list-group-flush rounded-3\">\r\n <div *ngIf=\"isAddingJob() && tempJob()\" class=\"list-group-item p-0 border-0\">\r\n <div class=\"form-panel mb-2\">\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"newJobTitle\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"newCompany\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"newIsCurrent\" id=\"newIsCurrent\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"newIsCurrent\">Current</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"newCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"newState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"newCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"newStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"newEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">End date is\r\n required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"newResponsibilities\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newWorkAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"newWorkAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); newWorkAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngFor=\"let job of experience(); let i = index\" class=\"list-group-item p-0 border-0 mb-2\">\r\n\r\n <div class=\"work-accent-item p-3 rounded-3 bg-white border\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"d-flex align-items-center cursor-pointer flex-grow-1\" (click)=\"toggleJob(i)\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"mb-0 fw-bold item-title-sm\">{{ job.jobTitle }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedWorkItem(i) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedWorkItem(i) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ job.company || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ formatMonthYear(job.startDate) }} - {{ job.isCurrent ? 'Present' :\r\n formatMonthYear(job.endDate) }}</span>\r\n <span class=\"item-meta-line\">{{ job.city }}<span *ngIf=\"job.city && job.state\">, </span>{{ job.state }}<ng-container *ngIf=\"!job.city && !job.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"editingJobIndex() !== i && (workIssuesByIndex()[i] || []).length > 0\"\r\n class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (workIssuesByIndex()[i] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\" (click)=\"startEditJob(i)\"\r\n title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteJob(i);\"\r\n [disabled]=\"deletingJobIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingJobIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingJobIndex() !== i\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n \r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"mt-3 p-3 rounded small\" *ngIf=\"expandedIndex() === i\">\r\n <ng-container *ngIf=\"editingJobIndex() !== i; else editJobForm\">\r\n <ul class=\"mb-0\">\r\n <li *ngFor=\"let res of job.responsibilities\">{{ res }}</li>\r\n </ul>\r\n </ng-container>\r\n\r\n <ng-template #editJobForm>\r\n <div *ngIf=\"tempJobIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempJobIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"jobTitle{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"company{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"isCurrent{{ i }}\" id=\"isCurrent{{ i }}\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"isCurrent{{ i }}\">Current</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"country{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"state{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"city{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"startDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"endDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">\r\n End date is required\r\n </div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"responsibilities{{ i }}\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #workAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"workAttachment{{ i }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); workAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\" *ngIf=\"editingJobIndex() === i\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4 \" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/patch-check-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Certifications</h5>\r\n <span *ngIf=\"certs().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"certificationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ certificationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"certs().length === 0 || !certificationSectionHasUnsavedItems() || isSavingCertification || isAddingCertification() || editingCertificationIndex() !== null\"\r\n (click)=\"confirmAllCertifications()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add certification\" (click)=\"addCertification()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"certs().length === 0 && !isAddingCertification() && editingCertificationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addCertification()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/patch-check.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No certifications added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingCertification() && tempCertification()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"newCertProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"newCertName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\" name=\"newCertOrg\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"newCertState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\" name=\"newCertCredentialId\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"newCertIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"newCertExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newCertAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"newCertAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); newCertAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\"\r\n [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let cert of certs(); let ci = index\" class=\"list-group-item py-3 cert-accent-item\">\r\n <ng-container *ngIf=\"editingCertificationIndex() !== ci; else editCert\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ cert.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedCertificationItem(ci) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedCertificationItem(ci) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ cert.issuingOrganization || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.credentialId || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.issueDate ? formatMonthYear(cert.issueDate) : '\u2014' }} - {{ cert.expiryDate ? formatMonthYear(cert.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.state || '\u2014' }}</span>\r\n <div *ngIf=\"(certIssuesByIndex()[ci] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (certIssuesByIndex()[ci] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditCertification(ci)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\"\r\n (click)=\"deleteCertification(ci)\" [disabled]=\"deletingCertificationIndex() === ci\" title=\"Delete\">\r\n <span *ngIf=\"deletingCertificationIndex() === ci\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingCertificationIndex() !== ci\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editCert>\r\n <div *ngIf=\"tempCertificationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempCertificationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"certProfessionType{{ ci }}\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"certName{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\"\r\n name=\"certOrg{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"certState{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\"\r\n name=\"certCredentialId{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"certIssue{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"certExpiry{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #certAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"certAttachment{{ ci }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); certAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/card-checklist-warning.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Licenses</h5>\r\n <span *ngIf=\"licenses().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"licenseSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ licenseSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"licenses().length === 0 || !licenseSectionHasUnsavedItems() || isSavingLicense || isAddingLicense() || editingLicenseIndex() !== null\"\r\n (click)=\"confirmAllLicenses()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add license\" (click)=\"addLicense()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"licenses().length === 0 && !isAddingLicense() && editingLicenseIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addLicense()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/card-checklist.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No licenses added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingLicense() && tempLicense()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"newLicName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"newLicAuthority\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"newLicNumber\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"newLicState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"newLicIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"newLicExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #newLicenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"newLicenseAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); newLicenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let lic of licenses(); let li = index\" class=\"list-group-item py-3 lic-accent-item\">\r\n <ng-container *ngIf=\"editingLicenseIndex() !== li; else editLic\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ lic.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedLicenseItem(li) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedLicenseItem(li) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ lic.issuingAuthority || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.licenseNumber || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.issueDate ? formatMonthYear(lic.issueDate) : '\u2014' }} - {{ lic.expiryDate ? formatMonthYear(lic.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.state || '\u2014' }}</span>\r\n <div *ngIf=\"(licenseIssuesByIndex()[li] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (licenseIssuesByIndex()[li] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditLicense(li)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteLicense(li)\"\r\n [disabled]=\"deletingLicenseIndex() === li\" title=\"Delete\">\r\n <span *ngIf=\"deletingLicenseIndex() === li\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingLicenseIndex() !== li\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editLic>\r\n <div *ngIf=\"tempLicenseIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempLicenseIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"licName{{ li }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"licAuthority{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"licNumber{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"licState{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"licIssue{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"licExpiry{{ li }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #licenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"licenseAttachment{{ li }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); licenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/tools.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Tools</h5>\r\n <span *ngIf=\"tools().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"toolsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ toolsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"tools().length === 0 || !toolsSectionHasUnsavedItems() || isSavingTool || isToolEditorOpen()\" (click)=\"confirmAllTools()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add tool\" (click)=\"addTool()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let tool of tools(); let ti = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openToolEditor(ti)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ tool }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedToolItem(ti) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedToolItem(ti) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(toolIssuesByIndex()[ti] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete tool\" (click)=\"deleteTool(ti)\"\r\n [disabled]=\"deletingToolIndex() === ti\">\r\n <span *ngIf=\"deletingToolIndex() === ti\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingToolIndex() !== ti\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"tools().length === 0\" class=\"text-muted small\">No tools added.</span>\r\n </div>\r\n\r\n <div *ngIf=\"isToolEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeToolEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeToolEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingTool() ? 'Add Tool' : ('Edit ' + (toolForm()?.name || '') + ' Tool') }}\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"toolShowFieldErrors && toolFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ toolFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"toolForm()?.professionId\" (change)=\"onToolProfessionChange($event)\"\r\n name=\"toolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('tool')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Tool Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"toolForm()?.name\"\r\n (ngModelChange)=\"patchToolForm({ name: $event })\" name=\"toolName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"toolShowFieldErrors && isBlank(toolForm()?.name)\">Tool name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempToolStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(toolForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (toolForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ toolForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"toolForm()?.year\"\r\n (ngModelChange)=\"patchToolForm({ year: $event === '' ? 0 : +$event })\" name=\"toolYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"toolForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchToolForm({ profileVisibility: $event })\" name=\"toolVisible\" id=\"toolVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"toolForm()?.notes\"\r\n (ngModelChange)=\"patchToolForm({ notes: $event })\" name=\"toolNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingTool() && editingToolIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteTool(editingToolIndex()!)\"\r\n [disabled]=\"deletingToolIndex() === editingToolIndex()\">\r\n <span *ngIf=\"deletingToolIndex() === editingToolIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeToolEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingTool\" (click)=\"saveToolEditor()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : toolActionLabel(editingToolIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/stars.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Skills</h5>\r\n <span *ngIf=\"skills().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"skillsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ skillsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"skills().length === 0 || !skillsSectionHasUnsavedItems() || isSavingSkill || isSkillEditorOpen()\" (click)=\"confirmAllSkills()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add skill\" (click)=\"addSkill()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let skill of skills(); let si = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openSkillEditor(si)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ skill }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedSkillItem(si) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedSkillItem(si) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(skillIssuesByIndex()[si] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete skill\"\r\n (click)=\"deleteSkill(si); $event.stopPropagation()\" [disabled]=\"deletingSkillIndex() === si\">\r\n <span *ngIf=\"deletingSkillIndex() === si\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingSkillIndex() !== si\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"skills().length === 0\" class=\"text-muted small\">No skills added.</span>\r\n </div>\r\n <div *ngIf=\"isSkillEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeSkillEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeSkillEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingSkill() ? 'Add Skill' : ('Edit ' + (skillForm()?.name || '') + ' Skill')\r\n }}</div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"skillShowFieldErrors && skillFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ skillFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"skillForm()?.professionId\" (change)=\"onSkillProfessionChange($event)\"\r\n name=\"skillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('skill')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Skills Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"skillForm()?.name\"\r\n (ngModelChange)=\"patchSkillForm({ name: $event })\" name=\"skillName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"skillShowFieldErrors && isBlank(skillForm()?.name)\">Skillset name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempSkillStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(skillForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (skillForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ skillForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"skillForm()?.year\"\r\n (ngModelChange)=\"patchSkillForm({ year: $event === '' ? 0 : +$event })\" name=\"skillYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"skillForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchSkillForm({ profileVisibility: $event })\" name=\"skillVisible\" id=\"skillVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"skillForm()?.notes\"\r\n (ngModelChange)=\"patchSkillForm({ notes: $event })\" name=\"skillNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingSkill() && editingSkillIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteSkill(editingSkillIndex()!)\"\r\n [disabled]=\"deletingSkillIndex() === editingSkillIndex()\">\r\n <span *ngIf=\"deletingSkillIndex() === editingSkillIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeSkillEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingSkill\" (click)=\"saveSkillEditor()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : skillActionLabel(editingSkillIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Education</h5>\r\n <span *ngIf=\"educationList().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"educationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ educationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"educationList().length === 0 || !educationSectionHasUnsavedItems() || isSavingEducation || isAddingEducation() || editingEducationIndex() !== null\"\r\n (click)=\"confirmAllEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add education\" (click)=\"addEducation()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"educationList().length === 0 && !isAddingEducation() && editingEducationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addEducation()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/mortarboard.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No education added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div *ngIf=\"isAddingEducation() && tempEducation()\" class=\"mb-2\">\r\n <div class=\"form-panel\">\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"newEduDegree\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"newEduInstitution\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"newEduDegreeType\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"newEduCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"newEduState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"newEduCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"newEduStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"newEduEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #newEducationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"newEducationAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); newEducationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\"\r\n (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let edu of educationList(); let ei = index\" class=\"edu-accent-item p-3 bg-white border rounded-3 shadow-sm mb-2\">\r\n <ng-container *ngIf=\"editingEducationIndex() !== ei; else editEdu\">\r\n <div class=\"d-flex justify-content-between align-items-start\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"fw-bold mb-0 item-title-sm\">{{ edu.degree }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedEducationItem(ei) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedEducationItem(ei) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ edu.institution || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.degreeType || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.startDate ? formatMonthYear(edu.startDate) : '\u2014' }} - {{ edu.endDate ? formatMonthYear(edu.endDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.city }}<span *ngIf=\"edu.city && edu.state\">, </span>{{ edu.state }}<ng-container *ngIf=\"!edu.city && !edu.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"(educationIssuesByIndex()[ei] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (educationIssuesByIndex()[ei] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditEducation(ei)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteEducation(ei)\"\r\n [disabled]=\"deletingEducationIndex() === ei\" title=\"Delete\">\r\n <span *ngIf=\"deletingEducationIndex() === ei\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingEducationIndex() !== ei\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editEdu>\r\n <div *ngIf=\"tempEducationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempEducationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"eduDegree{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"eduInstitution{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"eduDegreeType{{ ei }}\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"eduCountry{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"eduState{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"eduCity{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"eduStartDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"eduEndDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #educationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"educationAttachment{{ ei }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); educationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\" (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"d-flex gap-3 justify-content-center mt-5 pt-2\" *ngIf=\"!isResume\">\r\n <button class=\"btn btn-outline-secondary preview-back-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" (click)=\"onBackClick()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\" style=\"vertical-align:-0.1em\">\r\n <path d=\"M11 3 5 8l6 5\" />\r\n </svg> Back\r\n </button>\r\n <button class=\"btn btn-primary preview-dashboard-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" [disabled]=\"!canConfirmAndContinue() || isSavingBasic\"\r\n (click)=\"onGoToDashboardClick()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Go to Dashboard' }}\r\n <img *ngIf=\"!isSavingBasic\" src=\"/assets/images/icons/arrow-right-white.svg\" width=\"14\" height=\"14\" class=\"ms-1\" style=\"vertical-align:-0.1em\" alt=\"\" />\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loading>\r\n <div class=\"text-center p-5\">\r\n <div class=\"spinner-border text-primary\"></div>\r\n <p class=\"text-muted mt-2\">Loading data...</p>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showCustomProfessionForm\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card add-profession-card\" style=\"max-width: 420px;\">\r\n <h4 class=\"mb-1\">Add New Profession</h4>\r\n <p class=\"text-muted small mb-4\">This profession isn't in the list yet. Add it here so you can link it to this\r\n {{ customProfessionContextLabel }}.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"customProfessionName\" name=\"customProfessionName\"\r\n placeholder=\"Enter profession name\" />\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Group <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionGroupOptions\" [(ngModel)]=\"customProfessionGroup\" name=\"customProfessionGroup\"\r\n placeholder=\"Select group\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionTypeOptions\" [(ngModel)]=\"customProfessionType\" name=\"customProfessionType\"\r\n placeholder=\"Select type\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempCustomProfessionStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"customProfessionStars >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ customProfessionStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ customProfessionStars }}/5</span>\r\n </div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"customProfessionYear\" name=\"customProfessionYear\"\r\n min=\"0\" max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelCustomProfessionForm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"!canSaveCustomProfession || isSavingCustomProfession\"\r\n (click)=\"saveCustomProfession()\">\r\n <span *ngIf=\"isSavingCustomProfession\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCustomProfession ? 'Saving...' : 'Add Profession' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkSkillConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Skills</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all skills that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkSkillProfessionId\" (change)=\"onBulkSkillProfessionChange($event)\"\r\n name=\"bulkSkillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-skill')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkSkillStars = s\">\r\n <span [class]=\"bulkSkillStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkSkillStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkSkillStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkSkillYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillYear === null || bulkSkillYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkSkillConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingSkill || bulkSkillStars <= 0 || bulkSkillYear === null\"\r\n (click)=\"applyBulkSkillConfirm()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkToolConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Tools</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all tools that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkToolProfessionId\" (change)=\"onBulkToolProfessionChange($event)\"\r\n name=\"bulkToolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-tool')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkToolStars = s\">\r\n <span [class]=\"bulkToolStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkToolStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkToolStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkToolYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolYear === null || bulkToolYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkToolConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingTool || bulkToolStars <= 0 || bulkToolYear === null\"\r\n (click)=\"applyBulkToolConfirm()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBackConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Leave this page?</h4>\r\n <p class=\"text-muted mb-4\">If you go back, only saved data will be retained.</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"stayOnPreview()\">Stay</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"proceedBack()\">Proceed Back</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showDashboardConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Finish Setup and Continue</h4>\r\n <p class=\"text-muted mb-4\">Save your information and go to your dashboard</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" [disabled]=\"isSavingBasic\"\r\n (click)=\"cancelDashboardRedirect()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"isSavingBasic\" (click)=\"goToDashboard()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Proceeding...' : 'Proceed' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{color:#69707d}.res-flex:hover,.res-flex:focus,.res-flex:active{transform:none!important;box-shadow:none!important}::ng-deep .profession-acc-checkbox .form-check-input{margin-left:unset!important}.profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1fr 1fr 1fr 50px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical;font-size:12px}.profession-notes-input::placeholder{font-size:12px}.responsibilities-textarea{min-height:130px;resize:vertical}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.container{max-width:900px;margin:30px auto;font-family:Arial,sans-serif;color:#69707d}.preview-page-header{max-width:900px;margin:50px auto 10px;padding:0 12px}.preview-title{font-size:18px;font-weight:700;color:#69707d;margin:0}.preview-subtitle{margin-top:7px;font-size:14px;color:#69707d}.preview-card-gradient h2,.section h5.fw-bold{font-size:18px}.section{margin-bottom:25px}.section-title{font-weight:600;display:block;margin-bottom:8px}.section-title .sub{font-weight:400;color:#777;font-size:13px}.dropdown-box{border:1px solid #ddd;border-radius:8px;padding:12px 15px;display:flex;justify-content:space-between;align-items:center}.icons{display:flex;gap:10px}.icon{cursor:pointer;font-size:14px;color:#777}.card{border:1px solid #ddd;border-radius:5px;padding:20px;background:#fff}.category{border-bottom:1px solid #eee;padding:15px 0}.category:last-child{border-bottom:none}.category-header{display:flex;justify-content:space-between;font-weight:600;margin-bottom:10px}.tags{display:flex;flex-wrap:wrap;gap:10px}.tag{background:#f2f4f7;padding:6px 12px;border-radius:6px;font-size:13px}.footer{text-align:center;margin-top:15px;color:#777;cursor:pointer}.actions{display:flex;justify-content:space-between;margin:50px 0 27px}.text-secondary{white-space:pre-line;font-size:12px;color:#69707d}.extra-small{font-size:.8rem}.card{transition:box-shadow .2s ease}.achievement-section .badge{font-size:.75rem;white-space:normal;text-align:left}.skill-tag .badge{font-weight:500;font-size:.9rem;transition:all .2s ease;cursor:default}.skill-tag .badge:hover{transform:translateY(-2px)}.skill-tag .btn-close{opacity:.5}.skill-tag .btn-close:hover{opacity:1}.bg-light.text-dark.border{background-color:#f8f9fa!important;border-color:#dee2e6!important}.card{transition:all .3s cubic-bezier(.25,.8,.25,1)}.card:hover .bg-light{background-color:#e8f5e9!important}.position-fixed .card:hover{transform:none!important}code{background-color:#f8f9fa;padding:2px 6px;border-radius:4px}.list-group-item{transition:background-color .2s ease-in-out}.list-group-item:hover{background-color:#fcfcfc}.border-dashed{border-style:dashed!important}.tool-card{transition:all .2s ease-in-out;border-radius:12px}.tool-card:hover{transform:translateY(-5px);border-color:var(--bs-primary)!important}.tool-card:hover .icon-box{background-color:var(--bs-primary-subtle)!important}.tool-card .icon-box{width:60px;height:60px;transition:background-color .2s ease}.border-dashed{border:2px dashed #dee2e6!important}.border-dashed:hover{border-color:var(--bs-primary)!important;background-color:#fff!important}.popup{position:fixed;top:20%;right:20px;width:320px;max-width:calc(100vw - 32px);background:#fff;border-radius:10px;padding:16px}.status-row{display:flex;justify-content:space-between;margin:10px 0}.success{color:#2e7d32;font-weight:700}.error{color:#d32f2f}.pending{color:#f9a825}.section-flag{font-weight:600}button.btn.btn-sm.btn-outline-primary{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.add-profession-plus-btn{display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0;min-width:31px;width:31px;height:31px}button.btn.btn-sm.btn-outline-primary:hover{background-color:#356895;border-color:#356895;color:#fff}button.btn.btn-sm.btn-outline-danger{border:1px solid #dc3545;color:#dc3545;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.rounded-circle{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.action-icon-btn{min-width:22px;width:22px;height:22px;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:5px!important;background:transparent!important;border:none!important;line-height:1}button.action-icon-btn.btn-outline-primary{color:#4077ad!important;border-color:#4077ad!important}button.action-icon-btn.btn-outline-danger{color:#dc3545!important}.action-icon-image{width:20px;height:20px;object-fit:contain;display:inline-block}.action-icon-image.edit-icon{filter:brightness(0) saturate(100%) invert(41%) sepia(39%) saturate(774%) hue-rotate(170deg) brightness(91%) contrast(89%)}.action-icon-image.delete-icon{filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.status-modal-card{width:min(760px,96vw);max-height:85vh;overflow:auto;background:#fff;border-radius:16px;border:1px solid #e5e7eb}.status-modal-header{padding:20px 24px 14px;border-bottom:1px solid #eef2f7}.status-modal-body{padding:12px 20px 20px}.status-modal-footer{padding:12px 20px 20px;border-top:1px solid #eef2f7;display:flex;justify-content:end;align-items:center;gap:12px}.status-modal-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 10px;border-bottom:1px solid #f1f5f9}.status-modal-row:last-child{border-bottom:0}.status-modal-name{font-size:14px;font-weight:600;color:#69707d}.status-modal-state{font-size:.92rem;font-weight:600}.status-modal-state.pending{color:#a16207}.status-modal-state.success{color:#166534}.status-modal-state.partial{color:#b45309}.status-modal-state.error{color:#b91c1c}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{font-size:14px}.confirm-modal-card .form-control,.confirm-modal-card .form-select{font-size:12px}.year-experience-select{max-height:150px}::ng-deep .ng-dropdown-panel{min-width:180px;z-index:2147483647!important;border-radius:6px!important;overflow:hidden}::ng-deep .ng-dropdown-panel.ng-select-bottom,::ng-deep .ng-dropdown-panel.ng-select-top{border-radius:6px!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items{max-height:220px;overflow-y:auto}@media screen and (max-width: 768px){.res-flex{flex-wrap:wrap!important;justify-content:center!important}.res-flex .fw-normal{width:100%;text-align:center;font-size:14px!important}.d-flex.flex-wrap.gap-2.p-3.bg-white.border.rounded.shadow-sm{justify-content:center}.preview-page-header{margin:20px auto 8px;padding:0 4px}.container{padding-left:4px;padding-right:4px}.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.actions{margin:24px 0 16px}.section-header-title{flex-wrap:wrap}.section-header-title>.section-flag{flex-basis:53%}.section-header-row{align-items:flex-start}.preview-card-gradient{padding:14px 14px 12px}.preview-card-gradient h2{font-size:18px}.popup{width:calc(100vw - 40px);right:16px;top:12%}.card{padding:0}.card-body.p-4,.px-4.py-3{padding:12px!important}.row.g-4,.row.g-3{--bs-gutter-x: .75rem}.d-flex.gap-4{gap:10px!important}.preview-card-gradient>.d-flex.justify-content-between.align-items-start{flex-wrap:wrap;row-gap:8px}.preview-card-gradient>.d-flex.justify-content-between.align-items-start>.badge.bg-primary-subtle{margin-left:auto}}@media screen and (max-width: 575px){.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.section>.d-flex{flex-wrap:wrap;row-gap:8px}.section>.d-flex>.d-flex:last-child{width:100%;justify-content:flex-end}}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .bs-datepicker-body table td span.selected,.bs-datepicker-body table td.selected span{background-color:#4077ad!important}.profile-avatar-circle{width:58px;height:58px;border-radius:5px;background:#4077ad;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;color:#fff;letter-spacing:1px;flex-shrink:0}.section-header-icon{font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;opacity:.9;filter:invert(47%) sepia(8%) saturate(483%) hue-rotate(176deg) brightness(91%) contrast(87%)}.section-header-title h5.fw-bold{color:#69707d}.text-muted{color:#69707d!important;font-size:12px}h6.text-uppercase.fw-bold.text-muted{font-size:14px;color:#69707d!important}.company-detail-label{font-size:14px;font-weight:700;text-transform:uppercase;color:#69707d!important}.work-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.work-accent-item:hover{background-color:#f5f8ff!important;box-shadow:0 4px 14px #4077ad17!important}.edu-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.edu-accent-item:hover{background-color:#f8f8ff!important;box-shadow:0 4px 14px #6366f117!important}.cert-accent-item{border-radius:5px!important;transition:background-color .18s ease}.cert-accent-item:hover{background-color:#f0fdf4!important}.lic-accent-item{border-radius:5px!important;transition:background-color .18s ease}.lic-accent-item:hover{background-color:#fffbeb!important}.field-label-sm{font-size:14px;font-weight:700;color:#69707d;margin-bottom:3px;display:block}.item-name-text,.field-value-sm{font-size:12px;color:#69707d}.item-title-sm{font-size:14px;color:#69707d!important}.item-meta-line{display:block;font-size:12px;color:#69707d;margin-top:3px}.empty-state-wrap{text-align:center;padding:32px 20px;background:#fafbfc;border:1.5px dashed #d1d5db;border-radius:5px;cursor:pointer;transition:background-color .18s ease,border-color .18s ease}.empty-state-wrap .empty-icon{font-size:2rem;color:#d1d5db;margin-bottom:8px}.empty-state-wrap p{color:#9ca3af;margin:0;font-size:14px}.empty-state-wrap:hover{background:#f0f6ff;border-color:#4077ad}.form-panel{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:20px}.form-panel .form-control,.form-panel .form-select{border-color:#d1d5db;border-radius:5px;font-size:12px}.form-panel .form-control:focus,.form-panel .form-select:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.section-header-bar{display:flex;align-items:center;justify-content:space-between;padding:10px 0 14px;border-bottom:2px solid #f1f5f9;margin-bottom:16px}.preview-card-gradient{background:linear-gradient(135deg,#fff,#eff6ff);border-bottom:1px solid #e2e8f0;padding:20px 24px 16px;border-radius:5px 5px 0 0}.profile-header-card{border:1px solid #e2e8f0!important}.item-icon-circle{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#fff;flex-shrink:0}.item-avatar--work{background:linear-gradient(135deg,#4077ad,#2d5a8a)}.item-avatar--edu{background:linear-gradient(135deg,#4077ad,#4338ca)}.provider-layout{display:flex;flex-direction:column}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.btn.btn-primary{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important;padding:.375rem .75rem;line-height:1.5}.btn.btn-primary:hover:not(:disabled),.btn.btn-primary:focus:not(:disabled),.btn.btn-primary:active:not(:disabled){background-color:#356895!important;border-color:#356895!important;color:#fff!important}.btn.btn-success,.btn.btn-outline-success{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-success:hover:not(:disabled),.btn.btn-success:focus:not(:disabled),.btn.btn-success:active:not(:disabled),.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:#336843!important;border-color:#336843!important;color:#fff!important}.btn.btn-outline-secondary.rounded-pill{background-color:#69707d!important;border-color:#69707d!important;color:#fff!important;border-radius:5px!important}.btn.btn-outline-secondary.rounded-pill:hover:not(:disabled),.btn.btn-outline-secondary.rounded-pill:focus:not(:disabled),.btn.btn-outline-secondary.rounded-pill:active:not(:disabled){background-color:#565c66!important;border-color:#565c66!important;color:#fff!important}.preview-back-btn{background-color:#426c85!important;border-color:#426c85!important;color:#fff!important}.preview-dashboard-btn{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:transparent!important;border-color:#198754!important;color:#198754!important}.btn.btn-outline-secondary:not(.rounded-pill){background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.btn.btn-outline-secondary:not(.rounded-pill):hover:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):focus:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.btn.btn-danger:hover:not(:disabled),.btn.btn-danger:focus:not(:disabled),.btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}.btn.btn-outline-danger.rounded-circle{border-color:#b43026!important;color:#b43026!important;border-radius:5px!important}.btn.btn-outline-danger.rounded-circle:hover:not(:disabled),.btn.btn-outline-danger.rounded-circle:focus:not(:disabled),.btn.btn-outline-danger.rounded-circle:active:not(:disabled){border-color:#96271f!important;color:#b43026!important}.btn.btn-link.text-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-secondary:hover:not(:disabled),.btn.btn-link.text-secondary:focus:not(:disabled){background-color:#c2cbde!important;color:#69707d!important}.btn.btn-link.text-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-danger:hover:not(:disabled),.btn.btn-link.text-danger:focus:not(:disabled){background-color:#96271f!important;color:#fff!important}.btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.rating-count{font-size:14px}.card-footer.bg-white .btn{min-height:38px;display:inline-flex;align-items:center;justify-content:center;font-size:14px}.skill-tool-editor-card label,.skill-tool-editor-card .form-control,.skill-tool-editor-card .form-select{font-size:12px}.skill-tool-editor-card .form-control::placeholder{font-size:12px}.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-select-container,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-placeholder,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-value-label{font-size:12px}.skill-tool-editor-card .form-control:not(textarea){height:32px!important}::ng-deep .skill-tool-editor-select .ng-option,::ng-deep .skill-tool-editor-select .ng-placeholder{font-size:12px}.badge.bg-warning-subtle.text-warning{background-color:#fff3cd!important;color:#664d03!important;border-color:#ffe69c!important}.badge.bg-success-subtle.text-success{background-color:#4077ad!important;color:#fff!important;border-color:#4077ad!important}.badge.bg-primary-subtle.text-primary{background-color:#e0edf2!important;color:#4077ad!important;border-color:#e0edf2!important}.work-editor-row label,.work-editor-row .form-control{font-size:12px}.work-editor-row .form-control::placeholder{font-size:12px}.education-editor-row label,.education-editor-row .form-control{font-size:12px}.education-editor-row .form-control::placeholder{font-size:12px}::ng-deep .education-degree-type-select .ng-select-container,::ng-deep .education-degree-type-select .ng-placeholder,::ng-deep .education-degree-type-select .ng-value-label,::ng-deep .education-degree-type-select .ng-option{font-size:12px}.license-editor-row label,.license-editor-row .form-control{font-size:12px}.license-editor-row .form-control::placeholder{font-size:12px}.certification-editor-row label,.certification-editor-row .form-control{font-size:12px}.certification-editor-row .form-control::placeholder{font-size:12px}::ng-deep .certification-profession-select .ng-select-container,::ng-deep .certification-profession-select .ng-placeholder,::ng-deep .certification-profession-select .ng-value-label,::ng-deep .certification-profession-select .ng-option{font-size:12px}.update-profile-card label,.update-profile-card .form-control,.update-profile-card .form-select{font-size:12px}.update-profile-card .form-control::placeholder{font-size:12px}.update-profile-card ::ng-deep im-address-verify-field .form-control{font-size:12px}.update-profile-card textarea.form-control{min-height:110px;resize:vertical}.add-profession-card label,.add-profession-card .form-control{font-size:12px}.add-profession-card .form-control::placeholder{font-size:12px}.add-profession-card .btn{font-size:14px}.add-profession-card ::ng-deep .add-profession-select .ng-select-container,.add-profession-card ::ng-deep .add-profession-select .ng-placeholder,.add-profession-card ::ng-deep .add-profession-select .ng-value-label{font-size:12px}::ng-deep .add-profession-select .ng-option,::ng-deep .add-profession-select .ng-placeholder{font-size:12px}label{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ModalModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i7.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i7.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "ngmodule", type: NgxStarsModule }, { kind: "ngmodule", type: BsDatepickerModule }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "ngmodule", type: TextMaskModule }, { kind: "ngmodule", type: AddressVerifyFieldModule }, { kind: "component", type: AddressVerifyFieldComponent, selector: "im-address-verify-field", inputs: ["placeholder", "options", "maxLength", "inputId", "name", "autocompleteAttr", "inputClass", "invalid", "inputStyle", "initialLat", "initialLng"], outputs: ["addressResolved", "manualEdit"] }, { kind: "pipe", type: i11.UpperCasePipe, name: "uppercase" }] });
7784
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: PreviewComponent, isStandalone: true, selector: "app-preview", inputs: { providerId: "providerId", isResume: "isResume", resumeModel: "resumeModel", providerName: "providerName", roleData: "roleData", cloudfrontUrl: "cloudfrontUrl", signatureFileId: "signatureFileId", signatureUrl: "signatureUrl" }, outputs: { backToParent: "backToParent" }, viewQueries: [{ propertyName: "companyForm", first: true, predicate: ["companyForm"], descendants: true }], ngImport: i0, template: "<div class=\"preview-page-header\" *ngIf=\"!isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h2 class=\"preview-title mb-0\">Review Extracted Information</h2>\r\n </div>\r\n <p class=\"preview-subtitle text-muted\">We\u2019ve automatically extracted details from your uploaded resume. Please review and confirm accuracy before proceeding.</p>\r\n</div>\r\n\r\n\r\n<div [ngClass]=\"isResume ? '' : 'container py-4 pt-0'\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- Provider initial setup: combined company + personal form (shown until both APIs succeed) -->\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && !hasUserDetailData && !isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-3 section-header-title\">\r\n <img src=\"/assets/images/icons/building.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Personal & Company Details</h5>\r\n <span class=\"badge border section-flag bg-warning-subtle text-warning\">Required to continue</span>\r\n </div>\r\n <div class=\"card shadow-sm border-0\">\r\n <div class=\"card-header bg-white fw-semibold\">Personal Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.firstName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.firstName\" name=\"setupFirstName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.firstName?.trim() && companyFormSubmitted\">First name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.lastName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.lastName\" name=\"setupLastName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.lastName?.trim() && companyFormSubmitted\">Last name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.email?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.email\" name=\"setupEmail\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.email?.trim() && companyFormSubmitted\">Email is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'profile')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.phone?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.phone\" name=\"setupPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.phone?.trim() && companyFormSubmitted\">Phone number is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"setupAddress\" [options]=\"options\"\r\n inputClass=\"form-control form-control-sm\" [invalid]=\"!tempProfile?.address?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.address?.trim() && companyFormSubmitted\">Home address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.city\" name=\"setupUserCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.state\" name=\"setupUserState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.zipCode?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.zipCode\" (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\"\r\n name=\"setupUserZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.zipCode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.country\" name=\"setupUserCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"setupJobTitle\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted}\"\r\n name=\"setupYearsOfExp\" min=\"1\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted\">Years of experience is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #setupHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"setupHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"setupHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"setupHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"headshotPreviewUrl\">\r\n <label class=\"small text-muted d-block\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); setupHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-header bg-white fw-semibold border-top\">Company Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"setupCompanyName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">Company name is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">{{ companyNameError }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'company')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10)}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"setupCompanyPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">Company phone is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">Company phone must be 10 digits</div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Company Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"setupCompanyAddress\"\r\n [options]=\"options\" inputClass=\"form-control form-control-sm\"\r\n [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">Address is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"setupCompanyCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"setupCompanyState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"setupCompanyZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"setupCompanyCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #setupCompanyLogoInput type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"form-control form-control-sm\" (change)=\"uploadCompanyImage($event)\" name=\"setupCompanyLogo\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); setupCompanyLogoInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-footer d-flex align-items-center justify-content-end gap-2\">\r\n <span *ngIf=\"providerSetupError\" class=\"small text-danger me-auto\">{{ providerSetupError }}</span>\r\n <button class=\"btn btn-success px-5 \"\r\n [disabled]=\"isSavingProviderSetup || !isProviderSetupFormComplete\"\r\n (click)=\"saveProviderSetup()\">\r\n <span *ngIf=\"isSavingProviderSetup\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProviderSetup ? 'Saving...' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name !== 'Provider' || hasUserDetailData\">\r\n <div *ngIf=\"details() as data; else loading\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!headshotPreviewUrl\">\r\n {{ (data.firstName?.[0] || '') }}{{ (data.lastName?.[0] || '') }}\r\n </div>\r\n <img *ngIf=\"headshotPreviewUrl\" [src]=\"headshotPreviewUrl\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;\" alt=\"Profile\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ data.firstName }} {{ data.lastName }}</h2>\r\n <span *ngIf=\"basicSectionHasIssues()\" class=\"badge bg-warning-subtle text-warning border section-flag\">\r\n Missing info\r\n </span>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"basicDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ basicDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ data.jobTitle }} \u2022 {{ data.yearsOfExperience }} Years Exp.</p>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"badge bg-primary-subtle text-primary border p-2\">Email Verified</span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-12 border-bottom pb-2\">\r\n <h6 class=\"text-uppercase small fw-bold text-muted\">Summary</h6>\r\n <p class=\"text-secondary small mb-0\">{{ data.summary }}</p>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/envelope.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Email</span>\r\n <span class=\"field-value-sm d-block\">{{ data.email }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ data.phone }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Location</span>\r\n <span class=\"field-value-sm d-block\">{{ data.address }}, {{ data.city }}, {{ data.state }}, {{ data.zipCode }}, {{ data.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!basicDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your basic info.\r\n </span>\r\n <span *ngIf=\"basicDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Basic details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm update-profile-card\" *ngIf=\"isEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Profile</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #basicForm=\"ngForm\" novalidate>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.firstName\" name=\"fName\"\r\n placeholder=\"First Name\" required #fName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"fName.invalid && (fName.dirty || fName.touched)\">First name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.lastName\" name=\"lName\"\r\n placeholder=\"Last Name\" required #lName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"lName.invalid && (lName.dirty || lName.touched)\">Last name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" [(ngModel)]=\"tempProfile.email\" name=\"email\" placeholder=\"Email\"\r\n required email #email=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"email.invalid && (email.dirty || email.touched)\">\r\n <span *ngIf=\"email.errors?.['required']\">Email is required</span>\r\n <span *ngIf=\"email.errors?.['email']\">Email format is invalid</span>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.phone\" (input)=\"phoneMask($event, 'profile')\"\r\n name=\"phone\" placeholder=\"Phone (10 digits)\" (keypress)=\"allowOnlyNumbers($event)\"\r\n required pattern=\"^\\(\\d{3}\\) \\d{3}-\\d{4}$\" maxlength=\"14\" inputmode=\"numeric\" #phone=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"phone.invalid && (phone.dirty || phone.touched)\">\r\n <span *ngIf=\"phone.errors?.['required']\">Phone number is required</span>\r\n <span *ngIf=\"phone.errors?.['pattern']\">Phone number must be 10 digits</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\"></span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"jobTitle\"\r\n placeholder=\"Job Title\" #jobTitle=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"jobTitle.invalid && (jobTitle.dirty || jobTitle.touched)\">Job\r\n title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0)}\"\r\n [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n name=\"yearsOfExperience\" placeholder=\"Years of Experience\" required min=\"1\"\r\n #yearsOfExperience=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0)\">\r\n Years of experience is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"address\" [options]=\"options\"\r\n placeholder=\"Home Address\" required #address=\"ngModel\"\r\n [invalid]=\"address.invalid && (address.dirty || address.touched)\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"address.invalid && (address.dirty || address.touched)\">Home\r\n address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.city\" name=\"city\" placeholder=\"City\"\r\n required #city=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"city.invalid && (city.dirty || city.touched)\">City is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.state\" name=\"state\" placeholder=\"State\"\r\n required #state=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"state.invalid && (state.dirty || state.touched)\">State is\r\n required</div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.zipCode\"\r\n (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\" name=\"zipCode\" placeholder=\"Zip Code\"\r\n required pattern=\"^\\d{1,6}$\" maxlength=\"6\" inputmode=\"numeric\" #zipCode=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"zipCode.invalid && (zipCode.dirty || zipCode.touched)\">Zip code\r\n is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"zipCode.errors?.['pattern'] && (zipCode.dirty || zipCode.touched)\">\r\n Zip code must be up to 6 digits\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.country\" name=\"country\"\r\n placeholder=\"Country\" required #country=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"country.invalid && (country.dirty || country.touched)\">Country\r\n is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6 position-relative\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #updateProfileHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"updateProfileHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\" *ngIf=\"headshotPreviewUrl\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"headshotPreviewUrl\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); updateProfileHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Summary</label>\r\n <textarea class=\"form-control\" rows=\"5\" [(ngModel)]=\"tempProfile.summary\" name=\"sum\"\r\n placeholder=\"Summary\"></textarea>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingBasic || !isBasicFormValid\" (click)=\"save()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && hasUserDetailData && !isResume\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isCompanyEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!companyLogoUrl()\">\r\n {{ (companyDetails()?.companyName?.[0] || '') | uppercase }}{{ (companyDetails()?.companyName?.[1] || '') | uppercase }}\r\n </div>\r\n <img *ngIf=\"companyLogoUrl()\" [src]=\"companyLogoUrl()\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;background:#fff;\" alt=\"Company Logo\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ companyDetails()?.companyName }}</h2>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"companyDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ companyDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ companyDetails()?.companyPhoneNumber }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.companyPhoneNumber }}</span>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Address</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.address1 }}, {{ companyDetails()?.city }}, {{ companyDetails()?.state }}, {{ companyDetails()?.zipcode }}, {{ companyDetails()?.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!companyDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your company info.\r\n </span>\r\n <span *ngIf=\"companyDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Company details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleCompanyEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm\" *ngIf=\"isCompanyEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Company Details</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #companyForm=\"ngForm\" novalidate>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"companyName\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">\r\n Company name is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">\r\n {{ companyNameError }}\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input (input)=\"phoneMask($event, 'company')\" type=\"text\" maxlength=\"14\" (keypress)=\"allowOnlyNumbers($event)\" inputmode=\"numeric\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{ 'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10) }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"companyPhoneNumber\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">\r\n Company phone is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">\r\n Company phone must be 10 digits\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"address1\" [options]=\"options\"\r\n required [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">\r\n Address is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"city\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">\r\n City is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"state\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">\r\n State is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"zipcode\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">\r\n Zip code is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"country\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">\r\n Country is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #uploadCompanyFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadCompanyImage($event)\" class=\"form-control\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); uploadCompanyFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelCompanyEdit()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCompany\" \r\n (click)=\"saveCompanyDetails()\">\r\n <span *ngIf=\"isSavingCompany\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCompany ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [class.section-locked]=\"roleData?.role?.name === 'Provider' && !hasUserDetailData\">\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Profession</h5>\r\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\r\n {{ selectedProfessionCount }} selected\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary px-4\"\r\n [disabled]=\"selectedProfessionCount === 0 || isSavingProfessionsTable\"\r\n (click)=\"submitProfessions()\">\r\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProfessionsTable ? 'Saving...' : professionSubmitLabel }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\r\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\r\n (keydown.enter)=\"createManualProfessionRow()\" />\r\n </div>\r\n\r\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\r\n <div class=\"profession-acc-columns\">\r\n <span></span>\r\n <span>Profession Name</span>\r\n <span>Group</span>\r\n <span>Type</span>\r\n <span></span>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\r\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\r\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\r\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\r\n (change)=\"onProfessionRowCheck(p, $event)\" />\r\n </div>\r\n <div class=\"profession-acc-name\">\r\n {{ p.professionName }}\r\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\r\n <!-- <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn ms-1\"\r\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionTypeId() === p.id\" title=\"Delete\">\r\n <span *ngIf=\"deletingProfessionTypeId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingProfessionTypeId() !== p.id\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button> -->\r\n </div>\r\n <div class=\"profession-acc-group\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else groupText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\r\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\r\n placeholder=\"Select group\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\r\n </div>\r\n <div class=\"profession-acc-type\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else typeText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\r\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\r\n placeholder=\"Select type\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\r\n </div>\r\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\r\n (click)=\"toggleProfessionRow(p)\"\r\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\r\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\r\n <div class=\"profession-acc-panel\">\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\r\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\r\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\r\n (click)=\"copyToAllProfessions(p.id)\" />\r\n Copy to all\r\n </label>\r\n </div>\r\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\r\n Select a Group and Type above to enable saving this profession.\r\n </div>\r\n <div class=\"profession-acc-fields\">\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\r\n <div class=\"profession-acc-stars\">\r\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\r\n (click)=\"setProfessionRowStars(p, s)\"\r\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\r\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\r\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\r\n <span class=\"small text-muted\">Yrs</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--visibility\">\r\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\r\n [name]=\"'profVis-' + p.id\" />\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--notes\">\r\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\r\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\r\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\r\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\r\n Add \"{{ professionSearchQry?.trim() }}\"\r\n </button>\r\n </div>\r\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\r\n class=\"text-center text-muted small py-3\">\r\n No professions found.\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Work Experience</h5>\r\n <span *ngIf=\"experience().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"workSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ workSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"experience().length === 0 || !workSectionHasUnsavedItems() || isSavingWork || isAddingJob() || editingJobIndex() !== null\"\r\n (click)=\"confirmAllWork()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add work experience\" (click)=\"addJob()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"experience().length === 0 && !isAddingJob()\" class=\"empty-state-wrap mb-3\" role=\"button\"\r\n (click)=\"addJob()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/briefcase.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No work experience added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n <div class=\"list-group list-group-flush rounded-3\">\r\n <div *ngIf=\"isAddingJob() && tempJob()\" class=\"list-group-item p-0 border-0\">\r\n <div class=\"form-panel mb-2\">\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"newJobTitle\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"newCompany\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"newIsCurrent\" id=\"newIsCurrent\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"newIsCurrent\">Current</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"newCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"newState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"newCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"newStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"newEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">End date is\r\n required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"newResponsibilities\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newWorkAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"newWorkAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); newWorkAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngFor=\"let job of experience(); let i = index\" class=\"list-group-item p-0 border-0 mb-2\">\r\n\r\n <div class=\"work-accent-item p-3 rounded-3 bg-white border\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"d-flex align-items-center cursor-pointer flex-grow-1\" (click)=\"toggleJob(i)\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"mb-0 fw-bold item-title-sm\">{{ job.jobTitle }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedWorkItem(i) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedWorkItem(i) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ job.company || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ formatMonthYear(job.startDate) }} - {{ job.isCurrent ? 'Present' :\r\n formatMonthYear(job.endDate) }}</span>\r\n <span class=\"item-meta-line\">{{ job.city }}<span *ngIf=\"job.city && job.state\">, </span>{{ job.state }}<ng-container *ngIf=\"!job.city && !job.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"editingJobIndex() !== i && (workIssuesByIndex()[i] || []).length > 0\"\r\n class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (workIssuesByIndex()[i] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\" (click)=\"startEditJob(i)\"\r\n title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteJob(i);\"\r\n [disabled]=\"deletingJobIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingJobIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingJobIndex() !== i\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n \r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"mt-3 p-3 rounded small\" *ngIf=\"expandedIndex() === i\">\r\n <ng-container *ngIf=\"editingJobIndex() !== i; else editJobForm\">\r\n <ul class=\"mb-0\">\r\n <li *ngFor=\"let res of job.responsibilities\">{{ res }}</li>\r\n </ul>\r\n </ng-container>\r\n\r\n <ng-template #editJobForm>\r\n <div *ngIf=\"tempJobIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempJobIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"jobTitle{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"company{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"isCurrent{{ i }}\" id=\"isCurrent{{ i }}\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"isCurrent{{ i }}\">Current</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"country{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"state{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"city{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"startDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"endDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">\r\n End date is required\r\n </div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"responsibilities{{ i }}\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #workAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"workAttachment{{ i }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); workAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\" *ngIf=\"editingJobIndex() === i\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4 \" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/patch-check-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Certifications</h5>\r\n <span *ngIf=\"certs().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"certificationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ certificationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"certs().length === 0 || !certificationSectionHasUnsavedItems() || isSavingCertification || isAddingCertification() || editingCertificationIndex() !== null\"\r\n (click)=\"confirmAllCertifications()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add certification\" (click)=\"addCertification()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"certs().length === 0 && !isAddingCertification() && editingCertificationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addCertification()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/patch-check.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No certifications added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingCertification() && tempCertification()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"newCertProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"newCertName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\" name=\"newCertOrg\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"newCertState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\" name=\"newCertCredentialId\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"newCertIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"newCertExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newCertAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"newCertAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); newCertAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\"\r\n [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let cert of certs(); let ci = index\" class=\"list-group-item py-3 cert-accent-item\">\r\n <ng-container *ngIf=\"editingCertificationIndex() !== ci; else editCert\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ cert.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedCertificationItem(ci) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedCertificationItem(ci) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ cert.issuingOrganization || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.credentialId || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.issueDate ? formatMonthYear(cert.issueDate) : '\u2014' }} - {{ cert.expiryDate ? formatMonthYear(cert.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.state || '\u2014' }}</span>\r\n <div *ngIf=\"(certIssuesByIndex()[ci] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (certIssuesByIndex()[ci] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditCertification(ci)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\"\r\n (click)=\"deleteCertification(ci)\" [disabled]=\"deletingCertificationIndex() === ci\" title=\"Delete\">\r\n <span *ngIf=\"deletingCertificationIndex() === ci\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingCertificationIndex() !== ci\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editCert>\r\n <div *ngIf=\"tempCertificationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempCertificationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"certProfessionType{{ ci }}\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"certName{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\"\r\n name=\"certOrg{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"certState{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\"\r\n name=\"certCredentialId{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"certIssue{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"certExpiry{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #certAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"certAttachment{{ ci }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); certAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/card-checklist-warning.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Licenses</h5>\r\n <span *ngIf=\"licenses().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"licenseSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ licenseSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"licenses().length === 0 || !licenseSectionHasUnsavedItems() || isSavingLicense || isAddingLicense() || editingLicenseIndex() !== null\"\r\n (click)=\"confirmAllLicenses()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add license\" (click)=\"addLicense()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"licenses().length === 0 && !isAddingLicense() && editingLicenseIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addLicense()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/card-checklist.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No licenses added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingLicense() && tempLicense()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"newLicName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"newLicAuthority\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"newLicNumber\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"newLicState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"newLicIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"newLicExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #newLicenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"newLicenseAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); newLicenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let lic of licenses(); let li = index\" class=\"list-group-item py-3 lic-accent-item\">\r\n <ng-container *ngIf=\"editingLicenseIndex() !== li; else editLic\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ lic.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedLicenseItem(li) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedLicenseItem(li) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ lic.issuingAuthority || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.licenseNumber || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.issueDate ? formatMonthYear(lic.issueDate) : '\u2014' }} - {{ lic.expiryDate ? formatMonthYear(lic.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.state || '\u2014' }}</span>\r\n <div *ngIf=\"(licenseIssuesByIndex()[li] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (licenseIssuesByIndex()[li] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditLicense(li)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteLicense(li)\"\r\n [disabled]=\"deletingLicenseIndex() === li\" title=\"Delete\">\r\n <span *ngIf=\"deletingLicenseIndex() === li\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingLicenseIndex() !== li\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editLic>\r\n <div *ngIf=\"tempLicenseIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempLicenseIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"licName{{ li }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"licAuthority{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"licNumber{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"licState{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"licIssue{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"licExpiry{{ li }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #licenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"licenseAttachment{{ li }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); licenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/tools.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Tools</h5>\r\n <span *ngIf=\"tools().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"toolsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ toolsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"tools().length === 0 || !toolsSectionHasUnsavedItems() || isSavingTool || isToolEditorOpen()\" (click)=\"confirmAllTools()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add tool\" (click)=\"addTool()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let tool of tools(); let ti = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openToolEditor(ti)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ tool }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedToolItem(ti) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedToolItem(ti) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(toolIssuesByIndex()[ti] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete tool\" (click)=\"deleteTool(ti)\"\r\n [disabled]=\"deletingToolIndex() === ti\">\r\n <span *ngIf=\"deletingToolIndex() === ti\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingToolIndex() !== ti\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"tools().length === 0\" class=\"text-muted small\">No tools added.</span>\r\n </div>\r\n\r\n <div *ngIf=\"isToolEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeToolEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeToolEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingTool() ? 'Add Tool' : ('Edit ' + (toolForm()?.name || '') + ' Tool') }}\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"toolShowFieldErrors && toolFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ toolFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"toolForm()?.professionId\" (change)=\"onToolProfessionChange($event)\"\r\n name=\"toolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('tool')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Tool Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"toolForm()?.name\"\r\n (ngModelChange)=\"patchToolForm({ name: $event })\" name=\"toolName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"toolShowFieldErrors && isBlank(toolForm()?.name)\">Tool name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempToolStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(toolForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (toolForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ toolForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"toolForm()?.year\"\r\n (ngModelChange)=\"patchToolForm({ year: $event === '' ? 0 : +$event })\" name=\"toolYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"toolForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchToolForm({ profileVisibility: $event })\" name=\"toolVisible\" id=\"toolVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"toolForm()?.notes\"\r\n (ngModelChange)=\"patchToolForm({ notes: $event })\" name=\"toolNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingTool() && editingToolIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteTool(editingToolIndex()!)\"\r\n [disabled]=\"deletingToolIndex() === editingToolIndex()\">\r\n <span *ngIf=\"deletingToolIndex() === editingToolIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeToolEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingTool\" (click)=\"saveToolEditor()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : toolActionLabel(editingToolIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/stars.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Skills</h5>\r\n <span *ngIf=\"skills().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"skillsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ skillsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"skills().length === 0 || !skillsSectionHasUnsavedItems() || isSavingSkill || isSkillEditorOpen()\" (click)=\"confirmAllSkills()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add skill\" (click)=\"addSkill()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let skill of skills(); let si = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openSkillEditor(si)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ skill }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedSkillItem(si) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedSkillItem(si) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(skillIssuesByIndex()[si] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete skill\"\r\n (click)=\"deleteSkill(si); $event.stopPropagation()\" [disabled]=\"deletingSkillIndex() === si\">\r\n <span *ngIf=\"deletingSkillIndex() === si\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingSkillIndex() !== si\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"skills().length === 0\" class=\"text-muted small\">No skills added.</span>\r\n </div>\r\n <div *ngIf=\"isSkillEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeSkillEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeSkillEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingSkill() ? 'Add Skill' : ('Edit ' + (skillForm()?.name || '') + ' Skill')\r\n }}</div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"skillShowFieldErrors && skillFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ skillFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"skillForm()?.professionId\" (change)=\"onSkillProfessionChange($event)\"\r\n name=\"skillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('skill')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Skills Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"skillForm()?.name\"\r\n (ngModelChange)=\"patchSkillForm({ name: $event })\" name=\"skillName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"skillShowFieldErrors && isBlank(skillForm()?.name)\">Skillset name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempSkillStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(skillForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (skillForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ skillForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"skillForm()?.year\"\r\n (ngModelChange)=\"patchSkillForm({ year: $event === '' ? 0 : +$event })\" name=\"skillYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"skillForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchSkillForm({ profileVisibility: $event })\" name=\"skillVisible\" id=\"skillVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"skillForm()?.notes\"\r\n (ngModelChange)=\"patchSkillForm({ notes: $event })\" name=\"skillNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingSkill() && editingSkillIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteSkill(editingSkillIndex()!)\"\r\n [disabled]=\"deletingSkillIndex() === editingSkillIndex()\">\r\n <span *ngIf=\"deletingSkillIndex() === editingSkillIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeSkillEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingSkill\" (click)=\"saveSkillEditor()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : skillActionLabel(editingSkillIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Education</h5>\r\n <span *ngIf=\"educationList().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"educationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ educationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"educationList().length === 0 || !educationSectionHasUnsavedItems() || isSavingEducation || isAddingEducation() || editingEducationIndex() !== null\"\r\n (click)=\"confirmAllEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add education\" (click)=\"addEducation()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"educationList().length === 0 && !isAddingEducation() && editingEducationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addEducation()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/mortarboard.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No education added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div *ngIf=\"isAddingEducation() && tempEducation()\" class=\"mb-2\">\r\n <div class=\"form-panel\">\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"newEduDegree\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"newEduInstitution\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"newEduDegreeType\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"newEduCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"newEduState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"newEduCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"newEduStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"newEduEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #newEducationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"newEducationAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); newEducationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\"\r\n (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let edu of educationList(); let ei = index\" class=\"edu-accent-item p-3 bg-white border rounded-3 shadow-sm mb-2\">\r\n <ng-container *ngIf=\"editingEducationIndex() !== ei; else editEdu\">\r\n <div class=\"d-flex justify-content-between align-items-start\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"fw-bold mb-0 item-title-sm\">{{ edu.degree }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedEducationItem(ei) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedEducationItem(ei) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ edu.institution || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.degreeType || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.startDate ? formatMonthYear(edu.startDate) : '\u2014' }} - {{ edu.endDate ? formatMonthYear(edu.endDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.city }}<span *ngIf=\"edu.city && edu.state\">, </span>{{ edu.state }}<ng-container *ngIf=\"!edu.city && !edu.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"(educationIssuesByIndex()[ei] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (educationIssuesByIndex()[ei] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditEducation(ei)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteEducation(ei)\"\r\n [disabled]=\"deletingEducationIndex() === ei\" title=\"Delete\">\r\n <span *ngIf=\"deletingEducationIndex() === ei\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingEducationIndex() !== ei\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editEdu>\r\n <div *ngIf=\"tempEducationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempEducationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"eduDegree{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"eduInstitution{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"eduDegreeType{{ ei }}\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"eduCountry{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"eduState{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"eduCity{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"eduStartDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"eduEndDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #educationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"educationAttachment{{ ei }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); educationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\" (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"d-flex gap-3 justify-content-center mt-5 pt-2\" *ngIf=\"!isResume\">\r\n <button class=\"btn btn-outline-secondary preview-back-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" (click)=\"onBackClick()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\" style=\"vertical-align:-0.1em\">\r\n <path d=\"M11 3 5 8l6 5\" />\r\n </svg> Back\r\n </button>\r\n <button class=\"btn btn-primary preview-dashboard-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" [disabled]=\"!canConfirmAndContinue() || isSavingBasic\"\r\n (click)=\"onGoToDashboardClick()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Go to Dashboard' }}\r\n <img *ngIf=\"!isSavingBasic\" src=\"/assets/images/icons/arrow-right-white.svg\" width=\"14\" height=\"14\" class=\"ms-1\" style=\"vertical-align:-0.1em\" alt=\"\" />\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loading>\r\n <div class=\"text-center p-5\">\r\n <div class=\"spinner-border text-primary\"></div>\r\n <p class=\"text-muted mt-2\">Loading data...</p>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showCustomProfessionForm\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card add-profession-card\" style=\"max-width: 420px;\">\r\n <h4 class=\"mb-1\">Add New Profession</h4>\r\n <p class=\"text-muted small mb-4\">This profession isn't in the list yet. Add it here so you can link it to this\r\n {{ customProfessionContextLabel }}.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"customProfessionName\" name=\"customProfessionName\"\r\n placeholder=\"Enter profession name\" />\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Group <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionGroupOptions\" [(ngModel)]=\"customProfessionGroup\" name=\"customProfessionGroup\"\r\n placeholder=\"Select group\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionTypeOptions\" [(ngModel)]=\"customProfessionType\" name=\"customProfessionType\"\r\n placeholder=\"Select type\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempCustomProfessionStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"customProfessionStars >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ customProfessionStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ customProfessionStars }}/5</span>\r\n </div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"customProfessionYear\" name=\"customProfessionYear\"\r\n min=\"0\" max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelCustomProfessionForm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"!canSaveCustomProfession || isSavingCustomProfession\"\r\n (click)=\"saveCustomProfession()\">\r\n <span *ngIf=\"isSavingCustomProfession\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCustomProfession ? 'Saving...' : 'Add Profession' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkSkillConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Skills</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all skills that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkSkillProfessionId\" (change)=\"onBulkSkillProfessionChange($event)\"\r\n name=\"bulkSkillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-skill')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkSkillStars = s\">\r\n <span [class]=\"bulkSkillStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkSkillStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkSkillStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkSkillYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillYear === null || bulkSkillYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkSkillConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingSkill || bulkSkillStars <= 0 || bulkSkillYear === null\"\r\n (click)=\"applyBulkSkillConfirm()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkToolConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Tools</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all tools that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkToolProfessionId\" (change)=\"onBulkToolProfessionChange($event)\"\r\n name=\"bulkToolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-tool')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkToolStars = s\">\r\n <span [class]=\"bulkToolStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkToolStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkToolStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkToolYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolYear === null || bulkToolYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkToolConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingTool || bulkToolStars <= 0 || bulkToolYear === null\"\r\n (click)=\"applyBulkToolConfirm()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBackConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Leave this page?</h4>\r\n <p class=\"text-muted mb-4\">If you go back, only saved data will be retained.</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"stayOnPreview()\">Stay</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"proceedBack()\">Proceed Back</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showDashboardConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Finish Setup and Continue</h4>\r\n <p class=\"text-muted mb-4\">Save your information and go to your dashboard</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" [disabled]=\"isSavingBasic\"\r\n (click)=\"cancelDashboardRedirect()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"isSavingBasic\" (click)=\"goToDashboard()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Proceeding...' : 'Proceed' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{color:#69707d}.res-flex:hover,.res-flex:focus,.res-flex:active{transform:none!important;box-shadow:none!important}::ng-deep .profession-acc-checkbox .form-check-input{margin-left:unset!important}.profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1fr 1fr 1fr 50px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical;font-size:12px}.profession-notes-input::placeholder{font-size:12px}.responsibilities-textarea{min-height:130px;resize:vertical}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.container{max-width:900px;margin:30px auto;font-family:Arial,sans-serif;color:#69707d}.preview-page-header{max-width:900px;margin:50px auto 10px;padding:0 12px}.preview-title{font-size:18px;font-weight:700;color:#69707d;margin:0}.preview-subtitle{margin-top:7px;font-size:14px;color:#69707d}.preview-card-gradient h2,.section h5.fw-bold{font-size:18px}.section{margin-bottom:25px}.section-title{font-weight:600;display:block;margin-bottom:8px}.section-title .sub{font-weight:400;color:#777;font-size:13px}.dropdown-box{border:1px solid #ddd;border-radius:8px;padding:12px 15px;display:flex;justify-content:space-between;align-items:center}.icons{display:flex;gap:10px}.icon{cursor:pointer;font-size:14px;color:#777}.card{border:1px solid #ddd;border-radius:5px;padding:20px;background:#fff}.category{border-bottom:1px solid #eee;padding:15px 0}.category:last-child{border-bottom:none}.category-header{display:flex;justify-content:space-between;font-weight:600;margin-bottom:10px}.tags{display:flex;flex-wrap:wrap;gap:10px}.tag{background:#f2f4f7;padding:6px 12px;border-radius:6px;font-size:13px}.footer{text-align:center;margin-top:15px;color:#777;cursor:pointer}.actions{display:flex;justify-content:space-between;margin:50px 0 27px}.text-secondary{white-space:pre-line;font-size:12px;color:#69707d}.extra-small{font-size:.8rem}.card{transition:box-shadow .2s ease}.achievement-section .badge{font-size:.75rem;white-space:normal;text-align:left}.skill-tag .badge{font-weight:500;font-size:.9rem;transition:all .2s ease;cursor:default}.skill-tag .badge:hover{transform:translateY(-2px)}.skill-tag .btn-close{opacity:.5}.skill-tag .btn-close:hover{opacity:1}.bg-light.text-dark.border{background-color:#f8f9fa!important;border-color:#dee2e6!important}.card{transition:all .3s cubic-bezier(.25,.8,.25,1)}.card:hover .bg-light{background-color:#e8f5e9!important}.position-fixed .card:hover{transform:none!important}code{background-color:#f8f9fa;padding:2px 6px;border-radius:4px}.list-group-item{transition:background-color .2s ease-in-out}.list-group-item:hover{background-color:#fcfcfc}.border-dashed{border-style:dashed!important}.tool-card{transition:all .2s ease-in-out;border-radius:12px}.tool-card:hover{transform:translateY(-5px);border-color:var(--bs-primary)!important}.tool-card:hover .icon-box{background-color:var(--bs-primary-subtle)!important}.tool-card .icon-box{width:60px;height:60px;transition:background-color .2s ease}.border-dashed{border:2px dashed #dee2e6!important}.border-dashed:hover{border-color:var(--bs-primary)!important;background-color:#fff!important}.popup{position:fixed;top:20%;right:20px;width:320px;max-width:calc(100vw - 32px);background:#fff;border-radius:10px;padding:16px}.status-row{display:flex;justify-content:space-between;margin:10px 0}.success{color:#2e7d32;font-weight:700}.error{color:#d32f2f}.pending{color:#f9a825}.section-flag{font-weight:600}button.btn.btn-sm.btn-outline-primary{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.add-profession-plus-btn{display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0;min-width:31px;width:31px;height:31px}button.btn.btn-sm.btn-outline-primary:hover{background-color:#356895;border-color:#356895;color:#fff}button.btn.btn-sm.btn-outline-danger{border:1px solid #dc3545;color:#dc3545;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.rounded-circle{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.action-icon-btn{min-width:22px;width:22px;height:22px;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:5px!important;background:transparent!important;border:none!important;line-height:1}button.action-icon-btn.btn-outline-primary{color:#4077ad!important;border-color:#4077ad!important}button.action-icon-btn.btn-outline-danger{color:#dc3545!important}.action-icon-image{width:20px;height:20px;object-fit:contain;display:inline-block}.action-icon-image.edit-icon{filter:brightness(0) saturate(100%) invert(41%) sepia(39%) saturate(774%) hue-rotate(170deg) brightness(91%) contrast(89%)}.action-icon-image.delete-icon{filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.status-modal-card{width:min(760px,96vw);max-height:85vh;overflow:auto;background:#fff;border-radius:16px;border:1px solid #e5e7eb}.status-modal-header{padding:20px 24px 14px;border-bottom:1px solid #eef2f7}.status-modal-body{padding:12px 20px 20px}.status-modal-footer{padding:12px 20px 20px;border-top:1px solid #eef2f7;display:flex;justify-content:end;align-items:center;gap:12px}.status-modal-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 10px;border-bottom:1px solid #f1f5f9}.status-modal-row:last-child{border-bottom:0}.status-modal-name{font-size:14px;font-weight:600;color:#69707d}.status-modal-state{font-size:.92rem;font-weight:600}.status-modal-state.pending{color:#a16207}.status-modal-state.success{color:#166534}.status-modal-state.partial{color:#b45309}.status-modal-state.error{color:#b91c1c}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{font-size:14px}.confirm-modal-card .form-control,.confirm-modal-card .form-select{font-size:12px}.year-experience-select{max-height:150px}::ng-deep .ng-dropdown-panel{min-width:180px;z-index:2147483647!important;border-radius:6px!important;overflow:hidden}::ng-deep .ng-dropdown-panel.ng-select-bottom,::ng-deep .ng-dropdown-panel.ng-select-top{border-radius:6px!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items{max-height:220px;overflow-y:auto}@media screen and (max-width: 768px){.res-flex{flex-wrap:wrap!important;justify-content:center!important}.res-flex .fw-normal{width:100%;text-align:center;font-size:14px!important}.d-flex.flex-wrap.gap-2.p-3.bg-white.border.rounded.shadow-sm{justify-content:center}.preview-page-header{margin:20px auto 8px;padding:0 4px}.container{padding-left:4px;padding-right:4px}.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.actions{margin:24px 0 16px}.section-header-title{flex-wrap:wrap}.section-header-title>.section-flag{flex-basis:53%}.section-header-row{align-items:flex-start}.preview-card-gradient{padding:14px 14px 12px}.preview-card-gradient h2{font-size:18px}.popup{width:calc(100vw - 40px);right:16px;top:12%}.card{padding:0}.card-body.p-4,.px-4.py-3{padding:12px!important}.row.g-4,.row.g-3{--bs-gutter-x: .75rem}.d-flex.gap-4{gap:10px!important}.preview-card-gradient>.d-flex.justify-content-between.align-items-start{flex-wrap:wrap;row-gap:8px}.preview-card-gradient>.d-flex.justify-content-between.align-items-start>.badge.bg-primary-subtle{margin-left:auto}}@media screen and (max-width: 575px){.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.section>.d-flex{flex-wrap:wrap;row-gap:8px}.section>.d-flex>.d-flex:last-child{width:100%;justify-content:flex-end}}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .bs-datepicker-body table td span.selected,.bs-datepicker-body table td.selected span{background-color:#4077ad!important}.profile-avatar-circle{width:58px;height:58px;border-radius:5px;background:#4077ad;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;color:#fff;letter-spacing:1px;flex-shrink:0}.section-header-icon{font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;opacity:.9;filter:invert(47%) sepia(8%) saturate(483%) hue-rotate(176deg) brightness(91%) contrast(87%)}.section-header-title h5.fw-bold{color:#69707d}.text-muted{color:#69707d!important;font-size:12px}h6.text-uppercase.fw-bold.text-muted{font-size:14px;color:#69707d!important}.company-detail-label{font-size:14px;font-weight:700;text-transform:uppercase;color:#69707d!important}.work-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.work-accent-item:hover{background-color:#f5f8ff!important;box-shadow:0 4px 14px #4077ad17!important}.edu-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.edu-accent-item:hover{background-color:#f8f8ff!important;box-shadow:0 4px 14px #6366f117!important}.cert-accent-item{border-radius:5px!important;transition:background-color .18s ease}.cert-accent-item:hover{background-color:#f0fdf4!important}.lic-accent-item{border-radius:5px!important;transition:background-color .18s ease}.lic-accent-item:hover{background-color:#fffbeb!important}.field-label-sm{font-size:14px;font-weight:700;color:#69707d;margin-bottom:3px;display:block}.item-name-text,.field-value-sm{font-size:12px;color:#69707d}.item-title-sm{font-size:14px;color:#69707d!important}.item-meta-line{display:block;font-size:12px;color:#69707d;margin-top:3px}.empty-state-wrap{text-align:center;padding:32px 20px;background:#fafbfc;border:1.5px dashed #d1d5db;border-radius:5px;cursor:pointer;transition:background-color .18s ease,border-color .18s ease}.empty-state-wrap .empty-icon{font-size:2rem;color:#d1d5db;margin-bottom:8px}.empty-state-wrap p{color:#9ca3af;margin:0;font-size:14px}.empty-state-wrap:hover{background:#f0f6ff;border-color:#4077ad}.form-panel{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:20px}.form-panel .form-control,.form-panel .form-select{border-color:#d1d5db;border-radius:5px;font-size:12px}.form-panel .form-control:focus,.form-panel .form-select:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.section-header-bar{display:flex;align-items:center;justify-content:space-between;padding:10px 0 14px;border-bottom:2px solid #f1f5f9;margin-bottom:16px}.preview-card-gradient{background:linear-gradient(135deg,#fff,#eff6ff);border-bottom:1px solid #e2e8f0;padding:20px 24px 16px;border-radius:5px 5px 0 0}.profile-header-card{border:1px solid #e2e8f0!important}.item-icon-circle{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#fff;flex-shrink:0}.item-avatar--work{background:linear-gradient(135deg,#4077ad,#2d5a8a)}.item-avatar--edu{background:linear-gradient(135deg,#4077ad,#4338ca)}.provider-layout{display:flex;flex-direction:column}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.btn.btn-primary{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important;padding:.375rem .75rem;line-height:1.5}.btn.btn-primary:hover:not(:disabled),.btn.btn-primary:focus:not(:disabled),.btn.btn-primary:active:not(:disabled){background-color:#356895!important;border-color:#356895!important;color:#fff!important}.btn.btn-success,.btn.btn-outline-success{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-success:hover:not(:disabled),.btn.btn-success:focus:not(:disabled),.btn.btn-success:active:not(:disabled),.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:#336843!important;border-color:#336843!important;color:#fff!important}.btn.btn-outline-secondary.rounded-pill{background-color:#69707d!important;border-color:#69707d!important;color:#fff!important;border-radius:5px!important}.btn.btn-outline-secondary.rounded-pill:hover:not(:disabled),.btn.btn-outline-secondary.rounded-pill:focus:not(:disabled),.btn.btn-outline-secondary.rounded-pill:active:not(:disabled){background-color:#565c66!important;border-color:#565c66!important;color:#fff!important}.preview-back-btn{background-color:#426c85!important;border-color:#426c85!important;color:#fff!important}.preview-dashboard-btn{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:transparent!important;border-color:#198754!important;color:#198754!important}.btn.btn-outline-secondary:not(.rounded-pill){background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.btn.btn-outline-secondary:not(.rounded-pill):hover:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):focus:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.btn.btn-danger:hover:not(:disabled),.btn.btn-danger:focus:not(:disabled),.btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}.btn.btn-outline-danger.rounded-circle{border-color:#b43026!important;color:#b43026!important;border-radius:5px!important}.btn.btn-outline-danger.rounded-circle:hover:not(:disabled),.btn.btn-outline-danger.rounded-circle:focus:not(:disabled),.btn.btn-outline-danger.rounded-circle:active:not(:disabled){border-color:#96271f!important;color:#b43026!important}.btn.btn-link.text-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-secondary:hover:not(:disabled),.btn.btn-link.text-secondary:focus:not(:disabled){background-color:#c2cbde!important;color:#69707d!important}.btn.btn-link.text-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-danger:hover:not(:disabled),.btn.btn-link.text-danger:focus:not(:disabled){background-color:#96271f!important;color:#fff!important}.btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.rating-count{font-size:14px}.card-footer.bg-white .btn{min-height:38px;display:inline-flex;align-items:center;justify-content:center;font-size:14px}.skill-tool-editor-card label,.skill-tool-editor-card .form-control,.skill-tool-editor-card .form-select{font-size:12px}.skill-tool-editor-card .form-control::placeholder{font-size:12px}.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-select-container,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-placeholder,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-value-label{font-size:12px}.skill-tool-editor-card .form-control:not(textarea){height:32px!important}::ng-deep .skill-tool-editor-select .ng-option,::ng-deep .skill-tool-editor-select .ng-placeholder{font-size:12px}.badge.bg-warning-subtle.text-warning{background-color:#fff3cd!important;color:#664d03!important;border-color:#ffe69c!important}.badge.bg-success-subtle.text-success{background-color:#4077ad!important;color:#fff!important;border-color:#4077ad!important}.badge.bg-primary-subtle.text-primary{background-color:#e0edf2!important;color:#4077ad!important;border-color:#e0edf2!important}.work-editor-row label,.work-editor-row .form-control{font-size:12px}.work-editor-row .form-control::placeholder{font-size:12px}.education-editor-row label,.education-editor-row .form-control{font-size:12px}.education-editor-row .form-control::placeholder{font-size:12px}::ng-deep .education-degree-type-select .ng-select-container,::ng-deep .education-degree-type-select .ng-placeholder,::ng-deep .education-degree-type-select .ng-value-label,::ng-deep .education-degree-type-select .ng-option{font-size:12px}.license-editor-row label,.license-editor-row .form-control{font-size:12px}.license-editor-row .form-control::placeholder{font-size:12px}.certification-editor-row label,.certification-editor-row .form-control{font-size:12px}.certification-editor-row .form-control::placeholder{font-size:12px}::ng-deep .certification-profession-select .ng-select-container,::ng-deep .certification-profession-select .ng-placeholder,::ng-deep .certification-profession-select .ng-value-label,::ng-deep .certification-profession-select .ng-option{font-size:12px}.update-profile-card label,.update-profile-card .form-control,.update-profile-card .form-select{font-size:12px}.update-profile-card .form-control::placeholder{font-size:12px}.update-profile-card ::ng-deep im-address-verify-field .form-control{font-size:12px}.update-profile-card textarea.form-control{min-height:110px;resize:vertical}.add-profession-card label,.add-profession-card .form-control{font-size:12px}.add-profession-card .form-control::placeholder{font-size:12px}.add-profession-card .btn{font-size:14px}.add-profession-card ::ng-deep .add-profession-select .ng-select-container,.add-profession-card ::ng-deep .add-profession-select .ng-placeholder,.add-profession-card ::ng-deep .add-profession-select .ng-value-label{font-size:12px}::ng-deep .add-profession-select .ng-option,::ng-deep .add-profession-select .ng-placeholder{font-size:12px}label{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ModalModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i7.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i7.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "ngmodule", type: NgxStarsModule }, { kind: "ngmodule", type: BsDatepickerModule }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "ngmodule", type: TextMaskModule }, { kind: "ngmodule", type: AddressVerifyFieldModule }, { kind: "component", type: AddressVerifyFieldComponent, selector: "im-address-verify-field", inputs: ["placeholder", "options", "maxLength", "inputId", "name", "autocompleteAttr", "inputClass", "invalid", "inputStyle", "initialLat", "initialLng"], outputs: ["addressResolved", "manualEdit"] }, { kind: "pipe", type: i11.UpperCasePipe, name: "uppercase" }] });
7785
7785
  }
7786
7786
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PreviewComponent, decorators: [{
7787
7787
  type: Component,
@@ -7789,7 +7789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
7789
7789
  CommonModule, ModalModule, FormsModule, ReactiveFormsModule,
7790
7790
  NgSelectModule, NgxStarsModule, BsDatepickerModule, TextMaskModule,
7791
7791
  AddressVerifyFieldModule
7792
- ], template: "<div class=\"preview-page-header\" *ngIf=\"!isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h2 class=\"preview-title mb-0\">Review Extracted Information</h2>\r\n </div>\r\n <p class=\"preview-subtitle text-muted\">We\u2019ve automatically extracted details from your uploaded resume. Please review and confirm accuracy before proceeding.</p>\r\n</div>\r\n\r\n\r\n<div [ngClass]=\"isResume ? '' : 'container py-4 pt-0'\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- Provider initial setup: combined company + personal form (shown until both APIs succeed) -->\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && !hasUserDetailData && !isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-3 section-header-title\">\r\n <img src=\"/assets/images/icons/building.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Personal & Company Details</h5>\r\n <span class=\"badge border section-flag bg-warning-subtle text-warning\">Required to continue</span>\r\n </div>\r\n <div class=\"card shadow-sm border-0\">\r\n <div class=\"card-header bg-white fw-semibold\">Personal Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.firstName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.firstName\" name=\"setupFirstName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.firstName?.trim() && companyFormSubmitted\">First name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.lastName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.lastName\" name=\"setupLastName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.lastName?.trim() && companyFormSubmitted\">Last name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.email?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.email\" name=\"setupEmail\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.email?.trim() && companyFormSubmitted\">Email is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'profile')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.phone?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.phone\" name=\"setupPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.phone?.trim() && companyFormSubmitted\">Phone number is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"setupAddress\" [options]=\"options\"\r\n inputClass=\"form-control form-control-sm\" [invalid]=\"!tempProfile?.address?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.address?.trim() && companyFormSubmitted\">Home address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.city\" name=\"setupUserCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.state\" name=\"setupUserState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.zipCode?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.zipCode\" (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\"\r\n name=\"setupUserZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.zipCode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.country\" name=\"setupUserCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"setupJobTitle\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted}\"\r\n name=\"setupYearsOfExp\" min=\"1\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted\">Years of experience is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #setupHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"setupHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"setupHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"setupHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"headshotPreviewUrl\">\r\n <label class=\"small text-muted d-block\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); setupHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-header bg-white fw-semibold border-top\">Company Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"setupCompanyName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">Company name is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">{{ companyNameError }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'company')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10)}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"setupCompanyPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">Company phone is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">Company phone must be 10 digits</div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Company Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"setupCompanyAddress\"\r\n [options]=\"options\" inputClass=\"form-control form-control-sm\"\r\n [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">Address is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"setupCompanyCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"setupCompanyState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"setupCompanyZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"setupCompanyCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #setupCompanyLogoInput type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"form-control form-control-sm\" (change)=\"uploadCompanyImage($event)\" name=\"setupCompanyLogo\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); setupCompanyLogoInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-footer d-flex align-items-center justify-content-end gap-2\">\r\n <span *ngIf=\"providerSetupError\" class=\"small text-danger me-auto\">{{ providerSetupError }}</span>\r\n <button class=\"btn btn-success px-5 \"\r\n [disabled]=\"isSavingProviderSetup || !isProviderSetupFormComplete\"\r\n (click)=\"saveProviderSetup()\">\r\n <span *ngIf=\"isSavingProviderSetup\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProviderSetup ? 'Saving...' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name !== 'Provider' || hasUserDetailData\">\r\n <div *ngIf=\"details() as data; else loading\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!headshotPreviewUrl\">\r\n {{ (data.firstName?.[0] || '') }}{{ (data.lastName?.[0] || '') }}\r\n </div>\r\n <img *ngIf=\"headshotPreviewUrl\" [src]=\"headshotPreviewUrl\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;\" alt=\"Profile\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ data.firstName }} {{ data.lastName }}</h2>\r\n <span *ngIf=\"basicSectionHasIssues()\" class=\"badge bg-warning-subtle text-warning border section-flag\">\r\n Missing info\r\n </span>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"basicDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ basicDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ data.jobTitle }} \u2022 {{ data.yearsOfExperience }} Years Exp.</p>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"badge bg-primary-subtle text-primary border p-2\">Email Verified</span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-12 border-bottom pb-2\">\r\n <h6 class=\"text-uppercase small fw-bold text-muted\">Summary</h6>\r\n <p class=\"text-secondary small mb-0\">{{ data.summary }}</p>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/envelope.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Email</span>\r\n <span class=\"field-value-sm d-block\">{{ data.email }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ data.phone }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Location</span>\r\n <span class=\"field-value-sm d-block\">{{ data.address }}, {{ data.city }}, {{ data.state }}, {{ data.zipCode }}, {{ data.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!basicDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your basic info.\r\n </span>\r\n <span *ngIf=\"basicDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Basic details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm update-profile-card\" *ngIf=\"isEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Profile</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #basicForm=\"ngForm\" novalidate>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.firstName\" name=\"fName\"\r\n placeholder=\"First Name\" required #fName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"fName.invalid && (fName.dirty || fName.touched)\">First name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.lastName\" name=\"lName\"\r\n placeholder=\"Last Name\" required #lName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"lName.invalid && (lName.dirty || lName.touched)\">Last name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" [(ngModel)]=\"tempProfile.email\" name=\"email\" placeholder=\"Email\"\r\n required email #email=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"email.invalid && (email.dirty || email.touched)\">\r\n <span *ngIf=\"email.errors?.['required']\">Email is required</span>\r\n <span *ngIf=\"email.errors?.['email']\">Email format is invalid</span>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.phone\" (input)=\"phoneMask($event, 'profile')\"\r\n name=\"phone\" placeholder=\"Phone (10 digits)\" (keypress)=\"allowOnlyNumbers($event)\"\r\n required pattern=\"^\\(\\d{3}\\) \\d{3}-\\d{4}$\" maxlength=\"14\" inputmode=\"numeric\" #phone=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"phone.invalid && (phone.dirty || phone.touched)\">\r\n <span *ngIf=\"phone.errors?.['required']\">Phone number is required</span>\r\n <span *ngIf=\"phone.errors?.['pattern']\">Phone number must be 10 digits</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\"></span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"jobTitle\"\r\n placeholder=\"Job Title\" #jobTitle=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"jobTitle.invalid && (jobTitle.dirty || jobTitle.touched)\">Job\r\n title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0)}\"\r\n [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n name=\"yearsOfExperience\" placeholder=\"Years of Experience\" required min=\"1\"\r\n #yearsOfExperience=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0)\">\r\n Years of experience is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"address\" [options]=\"options\"\r\n placeholder=\"Home Address\" required #address=\"ngModel\"\r\n [invalid]=\"address.invalid && (address.dirty || address.touched)\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"address.invalid && (address.dirty || address.touched)\">Home\r\n address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.city\" name=\"city\" placeholder=\"City\"\r\n required #city=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"city.invalid && (city.dirty || city.touched)\">City is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.state\" name=\"state\" placeholder=\"State\"\r\n required #state=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"state.invalid && (state.dirty || state.touched)\">State is\r\n required</div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.zipCode\"\r\n (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\" name=\"zipCode\" placeholder=\"Zip Code\"\r\n required pattern=\"^\\d{1,6}$\" maxlength=\"6\" inputmode=\"numeric\" #zipCode=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"zipCode.invalid && (zipCode.dirty || zipCode.touched)\">Zip code\r\n is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"zipCode.errors?.['pattern'] && (zipCode.dirty || zipCode.touched)\">\r\n Zip code must be up to 6 digits\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.country\" name=\"country\"\r\n placeholder=\"Country\" required #country=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"country.invalid && (country.dirty || country.touched)\">Country\r\n is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6 position-relative\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #updateProfileHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"updateProfileHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\" *ngIf=\"headshotPreviewUrl\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"headshotPreviewUrl\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); updateProfileHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Summary</label>\r\n <textarea class=\"form-control\" rows=\"5\" [(ngModel)]=\"tempProfile.summary\" name=\"sum\"\r\n placeholder=\"Summary\"></textarea>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingBasic || !isBasicFormValid\" (click)=\"save()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && hasUserDetailData && !isResume\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isCompanyEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!companyLogoUrl()\">\r\n {{ (companyDetails()?.companyName?.[0] || '') | uppercase }}{{ (companyDetails()?.companyName?.[1] || '') | uppercase }}\r\n </div>\r\n <img *ngIf=\"companyLogoUrl()\" [src]=\"companyLogoUrl()\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;background:#fff;\" alt=\"Company Logo\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ companyDetails()?.companyName }}</h2>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"companyDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ companyDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ companyDetails()?.companyPhoneNumber }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.companyPhoneNumber }}</span>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Address</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.address1 }}, {{ companyDetails()?.city }}, {{ companyDetails()?.state }}, {{ companyDetails()?.zipcode }}, {{ companyDetails()?.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!companyDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your company info.\r\n </span>\r\n <span *ngIf=\"companyDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Company details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleCompanyEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm\" *ngIf=\"isCompanyEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Company Details</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #companyForm=\"ngForm\" novalidate>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"companyName\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">\r\n Company name is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">\r\n {{ companyNameError }}\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input (input)=\"phoneMask($event, 'company')\" type=\"text\" maxlength=\"14\" (keypress)=\"allowOnlyNumbers($event)\" inputmode=\"numeric\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{ 'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10) }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"companyPhoneNumber\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">\r\n Company phone is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">\r\n Company phone must be 10 digits\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"address1\" [options]=\"options\"\r\n required [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">\r\n Address is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"city\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">\r\n City is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"state\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">\r\n State is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"zipcode\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">\r\n Zip code is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"country\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">\r\n Country is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #uploadCompanyFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadCompanyImage($event)\" class=\"form-control\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); uploadCompanyFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelCompanyEdit()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCompany\" \r\n (click)=\"saveCompanyDetails()\">\r\n <span *ngIf=\"isSavingCompany\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCompany ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [class.section-locked]=\"roleData?.role?.name === 'Provider' && !hasUserDetailData\">\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Profession</h5>\r\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\r\n {{ selectedProfessionCount }} selected\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary px-4\"\r\n [disabled]=\"selectedProfessionCount === 0 || isSavingProfessionsTable\"\r\n (click)=\"submitProfessions()\">\r\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProfessionsTable ? 'Saving...' : professionSubmitLabel }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\r\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\r\n (keydown.enter)=\"createManualProfessionRow()\" />\r\n </div>\r\n\r\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\r\n <div class=\"profession-acc-columns\">\r\n <span></span>\r\n <span>Profession Name</span>\r\n <span>Group</span>\r\n <span>Type</span>\r\n <span></span>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\r\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\r\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\r\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\r\n (change)=\"onProfessionRowCheck(p, $event)\" />\r\n </div>\r\n <div class=\"profession-acc-name\">\r\n {{ p.professionName }}\r\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\r\n <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn ms-1\"\r\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionTypeId() === p.id\" title=\"Delete\">\r\n <span *ngIf=\"deletingProfessionTypeId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingProfessionTypeId() !== p.id\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n <div class=\"profession-acc-group\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else groupText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\r\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\r\n placeholder=\"Select group\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\r\n </div>\r\n <div class=\"profession-acc-type\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else typeText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\r\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\r\n placeholder=\"Select type\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\r\n </div>\r\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\r\n (click)=\"toggleProfessionRow(p)\"\r\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\r\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\r\n <div class=\"profession-acc-panel\">\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\r\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\r\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\r\n (click)=\"copyToAllProfessions(p.id)\" />\r\n Copy to all\r\n </label>\r\n </div>\r\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\r\n Select a Group and Type above to enable saving this profession.\r\n </div>\r\n <div class=\"profession-acc-fields\">\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\r\n <div class=\"profession-acc-stars\">\r\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\r\n (click)=\"setProfessionRowStars(p, s)\"\r\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\r\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\r\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\r\n <span class=\"small text-muted\">Yrs</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--visibility\">\r\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\r\n [name]=\"'profVis-' + p.id\" />\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--notes\">\r\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\r\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\r\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\r\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\r\n Add \"{{ professionSearchQry?.trim() }}\"\r\n </button>\r\n </div>\r\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\r\n class=\"text-center text-muted small py-3\">\r\n No professions found.\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Work Experience</h5>\r\n <span *ngIf=\"experience().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"workSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ workSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"experience().length === 0 || !workSectionHasUnsavedItems() || isSavingWork || isAddingJob() || editingJobIndex() !== null\"\r\n (click)=\"confirmAllWork()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add work experience\" (click)=\"addJob()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"experience().length === 0 && !isAddingJob()\" class=\"empty-state-wrap mb-3\" role=\"button\"\r\n (click)=\"addJob()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/briefcase.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No work experience added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n <div class=\"list-group list-group-flush rounded-3\">\r\n <div *ngIf=\"isAddingJob() && tempJob()\" class=\"list-group-item p-0 border-0\">\r\n <div class=\"form-panel mb-2\">\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"newJobTitle\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"newCompany\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"newIsCurrent\" id=\"newIsCurrent\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"newIsCurrent\">Current</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"newCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"newState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"newCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"newStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"newEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">End date is\r\n required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"newResponsibilities\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newWorkAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"newWorkAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); newWorkAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngFor=\"let job of experience(); let i = index\" class=\"list-group-item p-0 border-0 mb-2\">\r\n\r\n <div class=\"work-accent-item p-3 rounded-3 bg-white border\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"d-flex align-items-center cursor-pointer flex-grow-1\" (click)=\"toggleJob(i)\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"mb-0 fw-bold item-title-sm\">{{ job.jobTitle }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedWorkItem(i) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedWorkItem(i) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ job.company || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ formatMonthYear(job.startDate) }} - {{ job.isCurrent ? 'Present' :\r\n formatMonthYear(job.endDate) }}</span>\r\n <span class=\"item-meta-line\">{{ job.city }}<span *ngIf=\"job.city && job.state\">, </span>{{ job.state }}<ng-container *ngIf=\"!job.city && !job.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"editingJobIndex() !== i && (workIssuesByIndex()[i] || []).length > 0\"\r\n class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (workIssuesByIndex()[i] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\" (click)=\"startEditJob(i)\"\r\n title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteJob(i);\"\r\n [disabled]=\"deletingJobIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingJobIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingJobIndex() !== i\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n \r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"mt-3 p-3 rounded small\" *ngIf=\"expandedIndex() === i\">\r\n <ng-container *ngIf=\"editingJobIndex() !== i; else editJobForm\">\r\n <ul class=\"mb-0\">\r\n <li *ngFor=\"let res of job.responsibilities\">{{ res }}</li>\r\n </ul>\r\n </ng-container>\r\n\r\n <ng-template #editJobForm>\r\n <div *ngIf=\"tempJobIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempJobIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"jobTitle{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"company{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"isCurrent{{ i }}\" id=\"isCurrent{{ i }}\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"isCurrent{{ i }}\">Current</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"country{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"state{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"city{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"startDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"endDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">\r\n End date is required\r\n </div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"responsibilities{{ i }}\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #workAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"workAttachment{{ i }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); workAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\" *ngIf=\"editingJobIndex() === i\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4 \" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/patch-check-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Certifications</h5>\r\n <span *ngIf=\"certs().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"certificationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ certificationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"certs().length === 0 || !certificationSectionHasUnsavedItems() || isSavingCertification || isAddingCertification() || editingCertificationIndex() !== null\"\r\n (click)=\"confirmAllCertifications()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add certification\" (click)=\"addCertification()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"certs().length === 0 && !isAddingCertification() && editingCertificationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addCertification()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/patch-check.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No certifications added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingCertification() && tempCertification()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"newCertProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"newCertName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\" name=\"newCertOrg\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"newCertState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\" name=\"newCertCredentialId\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"newCertIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"newCertExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newCertAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"newCertAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); newCertAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\"\r\n [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let cert of certs(); let ci = index\" class=\"list-group-item py-3 cert-accent-item\">\r\n <ng-container *ngIf=\"editingCertificationIndex() !== ci; else editCert\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ cert.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedCertificationItem(ci) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedCertificationItem(ci) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ cert.issuingOrganization || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.credentialId || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.issueDate ? formatMonthYear(cert.issueDate) : '\u2014' }} - {{ cert.expiryDate ? formatMonthYear(cert.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.state || '\u2014' }}</span>\r\n <div *ngIf=\"(certIssuesByIndex()[ci] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (certIssuesByIndex()[ci] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditCertification(ci)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\"\r\n (click)=\"deleteCertification(ci)\" [disabled]=\"deletingCertificationIndex() === ci\" title=\"Delete\">\r\n <span *ngIf=\"deletingCertificationIndex() === ci\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingCertificationIndex() !== ci\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editCert>\r\n <div *ngIf=\"tempCertificationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempCertificationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"certProfessionType{{ ci }}\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"certName{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\"\r\n name=\"certOrg{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"certState{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\"\r\n name=\"certCredentialId{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"certIssue{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"certExpiry{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #certAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"certAttachment{{ ci }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); certAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/card-checklist-warning.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Licenses</h5>\r\n <span *ngIf=\"licenses().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"licenseSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ licenseSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"licenses().length === 0 || !licenseSectionHasUnsavedItems() || isSavingLicense || isAddingLicense() || editingLicenseIndex() !== null\"\r\n (click)=\"confirmAllLicenses()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add license\" (click)=\"addLicense()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"licenses().length === 0 && !isAddingLicense() && editingLicenseIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addLicense()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/card-checklist.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No licenses added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingLicense() && tempLicense()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"newLicName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"newLicAuthority\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"newLicNumber\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"newLicState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"newLicIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"newLicExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #newLicenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"newLicenseAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); newLicenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let lic of licenses(); let li = index\" class=\"list-group-item py-3 lic-accent-item\">\r\n <ng-container *ngIf=\"editingLicenseIndex() !== li; else editLic\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ lic.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedLicenseItem(li) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedLicenseItem(li) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ lic.issuingAuthority || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.licenseNumber || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.issueDate ? formatMonthYear(lic.issueDate) : '\u2014' }} - {{ lic.expiryDate ? formatMonthYear(lic.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.state || '\u2014' }}</span>\r\n <div *ngIf=\"(licenseIssuesByIndex()[li] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (licenseIssuesByIndex()[li] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditLicense(li)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteLicense(li)\"\r\n [disabled]=\"deletingLicenseIndex() === li\" title=\"Delete\">\r\n <span *ngIf=\"deletingLicenseIndex() === li\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingLicenseIndex() !== li\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editLic>\r\n <div *ngIf=\"tempLicenseIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempLicenseIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"licName{{ li }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"licAuthority{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"licNumber{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"licState{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"licIssue{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"licExpiry{{ li }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #licenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"licenseAttachment{{ li }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); licenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/tools.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Tools</h5>\r\n <span *ngIf=\"tools().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"toolsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ toolsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"tools().length === 0 || !toolsSectionHasUnsavedItems() || isSavingTool || isToolEditorOpen()\" (click)=\"confirmAllTools()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add tool\" (click)=\"addTool()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let tool of tools(); let ti = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openToolEditor(ti)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ tool }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedToolItem(ti) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedToolItem(ti) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(toolIssuesByIndex()[ti] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete tool\" (click)=\"deleteTool(ti)\"\r\n [disabled]=\"deletingToolIndex() === ti\">\r\n <span *ngIf=\"deletingToolIndex() === ti\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingToolIndex() !== ti\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"tools().length === 0\" class=\"text-muted small\">No tools added.</span>\r\n </div>\r\n\r\n <div *ngIf=\"isToolEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeToolEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeToolEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingTool() ? 'Add Tool' : ('Edit ' + (toolForm()?.name || '') + ' Tool') }}\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"toolShowFieldErrors && toolFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ toolFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"toolForm()?.professionId\" (change)=\"onToolProfessionChange($event)\"\r\n name=\"toolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('tool')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Tool Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"toolForm()?.name\"\r\n (ngModelChange)=\"patchToolForm({ name: $event })\" name=\"toolName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"toolShowFieldErrors && isBlank(toolForm()?.name)\">Tool name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempToolStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(toolForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (toolForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ toolForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"toolForm()?.year\"\r\n (ngModelChange)=\"patchToolForm({ year: $event === '' ? 0 : +$event })\" name=\"toolYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"toolForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchToolForm({ profileVisibility: $event })\" name=\"toolVisible\" id=\"toolVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"toolForm()?.notes\"\r\n (ngModelChange)=\"patchToolForm({ notes: $event })\" name=\"toolNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingTool() && editingToolIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteTool(editingToolIndex()!)\"\r\n [disabled]=\"deletingToolIndex() === editingToolIndex()\">\r\n <span *ngIf=\"deletingToolIndex() === editingToolIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeToolEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingTool\" (click)=\"saveToolEditor()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : toolActionLabel(editingToolIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/stars.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Skills</h5>\r\n <span *ngIf=\"skills().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"skillsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ skillsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"skills().length === 0 || !skillsSectionHasUnsavedItems() || isSavingSkill || isSkillEditorOpen()\" (click)=\"confirmAllSkills()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add skill\" (click)=\"addSkill()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let skill of skills(); let si = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openSkillEditor(si)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ skill }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedSkillItem(si) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedSkillItem(si) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(skillIssuesByIndex()[si] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete skill\"\r\n (click)=\"deleteSkill(si); $event.stopPropagation()\" [disabled]=\"deletingSkillIndex() === si\">\r\n <span *ngIf=\"deletingSkillIndex() === si\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingSkillIndex() !== si\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"skills().length === 0\" class=\"text-muted small\">No skills added.</span>\r\n </div>\r\n <div *ngIf=\"isSkillEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeSkillEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeSkillEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingSkill() ? 'Add Skill' : ('Edit ' + (skillForm()?.name || '') + ' Skill')\r\n }}</div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"skillShowFieldErrors && skillFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ skillFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"skillForm()?.professionId\" (change)=\"onSkillProfessionChange($event)\"\r\n name=\"skillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('skill')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Skills Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"skillForm()?.name\"\r\n (ngModelChange)=\"patchSkillForm({ name: $event })\" name=\"skillName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"skillShowFieldErrors && isBlank(skillForm()?.name)\">Skillset name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempSkillStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(skillForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (skillForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ skillForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"skillForm()?.year\"\r\n (ngModelChange)=\"patchSkillForm({ year: $event === '' ? 0 : +$event })\" name=\"skillYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"skillForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchSkillForm({ profileVisibility: $event })\" name=\"skillVisible\" id=\"skillVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"skillForm()?.notes\"\r\n (ngModelChange)=\"patchSkillForm({ notes: $event })\" name=\"skillNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingSkill() && editingSkillIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteSkill(editingSkillIndex()!)\"\r\n [disabled]=\"deletingSkillIndex() === editingSkillIndex()\">\r\n <span *ngIf=\"deletingSkillIndex() === editingSkillIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeSkillEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingSkill\" (click)=\"saveSkillEditor()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : skillActionLabel(editingSkillIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Education</h5>\r\n <span *ngIf=\"educationList().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"educationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ educationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"educationList().length === 0 || !educationSectionHasUnsavedItems() || isSavingEducation || isAddingEducation() || editingEducationIndex() !== null\"\r\n (click)=\"confirmAllEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add education\" (click)=\"addEducation()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"educationList().length === 0 && !isAddingEducation() && editingEducationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addEducation()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/mortarboard.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No education added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div *ngIf=\"isAddingEducation() && tempEducation()\" class=\"mb-2\">\r\n <div class=\"form-panel\">\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"newEduDegree\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"newEduInstitution\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"newEduDegreeType\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"newEduCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"newEduState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"newEduCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"newEduStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"newEduEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #newEducationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"newEducationAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); newEducationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\"\r\n (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let edu of educationList(); let ei = index\" class=\"edu-accent-item p-3 bg-white border rounded-3 shadow-sm mb-2\">\r\n <ng-container *ngIf=\"editingEducationIndex() !== ei; else editEdu\">\r\n <div class=\"d-flex justify-content-between align-items-start\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"fw-bold mb-0 item-title-sm\">{{ edu.degree }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedEducationItem(ei) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedEducationItem(ei) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ edu.institution || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.degreeType || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.startDate ? formatMonthYear(edu.startDate) : '\u2014' }} - {{ edu.endDate ? formatMonthYear(edu.endDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.city }}<span *ngIf=\"edu.city && edu.state\">, </span>{{ edu.state }}<ng-container *ngIf=\"!edu.city && !edu.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"(educationIssuesByIndex()[ei] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (educationIssuesByIndex()[ei] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditEducation(ei)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteEducation(ei)\"\r\n [disabled]=\"deletingEducationIndex() === ei\" title=\"Delete\">\r\n <span *ngIf=\"deletingEducationIndex() === ei\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingEducationIndex() !== ei\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editEdu>\r\n <div *ngIf=\"tempEducationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempEducationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"eduDegree{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"eduInstitution{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"eduDegreeType{{ ei }}\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"eduCountry{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"eduState{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"eduCity{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"eduStartDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"eduEndDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #educationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"educationAttachment{{ ei }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); educationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\" (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"d-flex gap-3 justify-content-center mt-5 pt-2\" *ngIf=\"!isResume\">\r\n <button class=\"btn btn-outline-secondary preview-back-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" (click)=\"onBackClick()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\" style=\"vertical-align:-0.1em\">\r\n <path d=\"M11 3 5 8l6 5\" />\r\n </svg> Back\r\n </button>\r\n <button class=\"btn btn-primary preview-dashboard-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" [disabled]=\"!canConfirmAndContinue() || isSavingBasic\"\r\n (click)=\"onGoToDashboardClick()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Go to Dashboard' }}\r\n <img *ngIf=\"!isSavingBasic\" src=\"/assets/images/icons/arrow-right-white.svg\" width=\"14\" height=\"14\" class=\"ms-1\" style=\"vertical-align:-0.1em\" alt=\"\" />\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loading>\r\n <div class=\"text-center p-5\">\r\n <div class=\"spinner-border text-primary\"></div>\r\n <p class=\"text-muted mt-2\">Loading data...</p>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showCustomProfessionForm\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card add-profession-card\" style=\"max-width: 420px;\">\r\n <h4 class=\"mb-1\">Add New Profession</h4>\r\n <p class=\"text-muted small mb-4\">This profession isn't in the list yet. Add it here so you can link it to this\r\n {{ customProfessionContextLabel }}.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"customProfessionName\" name=\"customProfessionName\"\r\n placeholder=\"Enter profession name\" />\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Group <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionGroupOptions\" [(ngModel)]=\"customProfessionGroup\" name=\"customProfessionGroup\"\r\n placeholder=\"Select group\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionTypeOptions\" [(ngModel)]=\"customProfessionType\" name=\"customProfessionType\"\r\n placeholder=\"Select type\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempCustomProfessionStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"customProfessionStars >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ customProfessionStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ customProfessionStars }}/5</span>\r\n </div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"customProfessionYear\" name=\"customProfessionYear\"\r\n min=\"0\" max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelCustomProfessionForm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"!canSaveCustomProfession || isSavingCustomProfession\"\r\n (click)=\"saveCustomProfession()\">\r\n <span *ngIf=\"isSavingCustomProfession\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCustomProfession ? 'Saving...' : 'Add Profession' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkSkillConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Skills</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all skills that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkSkillProfessionId\" (change)=\"onBulkSkillProfessionChange($event)\"\r\n name=\"bulkSkillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-skill')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkSkillStars = s\">\r\n <span [class]=\"bulkSkillStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkSkillStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkSkillStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkSkillYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillYear === null || bulkSkillYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkSkillConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingSkill || bulkSkillStars <= 0 || bulkSkillYear === null\"\r\n (click)=\"applyBulkSkillConfirm()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkToolConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Tools</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all tools that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkToolProfessionId\" (change)=\"onBulkToolProfessionChange($event)\"\r\n name=\"bulkToolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-tool')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkToolStars = s\">\r\n <span [class]=\"bulkToolStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkToolStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkToolStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkToolYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolYear === null || bulkToolYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkToolConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingTool || bulkToolStars <= 0 || bulkToolYear === null\"\r\n (click)=\"applyBulkToolConfirm()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBackConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Leave this page?</h4>\r\n <p class=\"text-muted mb-4\">If you go back, only saved data will be retained.</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"stayOnPreview()\">Stay</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"proceedBack()\">Proceed Back</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showDashboardConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Finish Setup and Continue</h4>\r\n <p class=\"text-muted mb-4\">Save your information and go to your dashboard</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" [disabled]=\"isSavingBasic\"\r\n (click)=\"cancelDashboardRedirect()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"isSavingBasic\" (click)=\"goToDashboard()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Proceeding...' : 'Proceed' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{color:#69707d}.res-flex:hover,.res-flex:focus,.res-flex:active{transform:none!important;box-shadow:none!important}::ng-deep .profession-acc-checkbox .form-check-input{margin-left:unset!important}.profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1fr 1fr 1fr 50px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical;font-size:12px}.profession-notes-input::placeholder{font-size:12px}.responsibilities-textarea{min-height:130px;resize:vertical}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.container{max-width:900px;margin:30px auto;font-family:Arial,sans-serif;color:#69707d}.preview-page-header{max-width:900px;margin:50px auto 10px;padding:0 12px}.preview-title{font-size:18px;font-weight:700;color:#69707d;margin:0}.preview-subtitle{margin-top:7px;font-size:14px;color:#69707d}.preview-card-gradient h2,.section h5.fw-bold{font-size:18px}.section{margin-bottom:25px}.section-title{font-weight:600;display:block;margin-bottom:8px}.section-title .sub{font-weight:400;color:#777;font-size:13px}.dropdown-box{border:1px solid #ddd;border-radius:8px;padding:12px 15px;display:flex;justify-content:space-between;align-items:center}.icons{display:flex;gap:10px}.icon{cursor:pointer;font-size:14px;color:#777}.card{border:1px solid #ddd;border-radius:5px;padding:20px;background:#fff}.category{border-bottom:1px solid #eee;padding:15px 0}.category:last-child{border-bottom:none}.category-header{display:flex;justify-content:space-between;font-weight:600;margin-bottom:10px}.tags{display:flex;flex-wrap:wrap;gap:10px}.tag{background:#f2f4f7;padding:6px 12px;border-radius:6px;font-size:13px}.footer{text-align:center;margin-top:15px;color:#777;cursor:pointer}.actions{display:flex;justify-content:space-between;margin:50px 0 27px}.text-secondary{white-space:pre-line;font-size:12px;color:#69707d}.extra-small{font-size:.8rem}.card{transition:box-shadow .2s ease}.achievement-section .badge{font-size:.75rem;white-space:normal;text-align:left}.skill-tag .badge{font-weight:500;font-size:.9rem;transition:all .2s ease;cursor:default}.skill-tag .badge:hover{transform:translateY(-2px)}.skill-tag .btn-close{opacity:.5}.skill-tag .btn-close:hover{opacity:1}.bg-light.text-dark.border{background-color:#f8f9fa!important;border-color:#dee2e6!important}.card{transition:all .3s cubic-bezier(.25,.8,.25,1)}.card:hover .bg-light{background-color:#e8f5e9!important}.position-fixed .card:hover{transform:none!important}code{background-color:#f8f9fa;padding:2px 6px;border-radius:4px}.list-group-item{transition:background-color .2s ease-in-out}.list-group-item:hover{background-color:#fcfcfc}.border-dashed{border-style:dashed!important}.tool-card{transition:all .2s ease-in-out;border-radius:12px}.tool-card:hover{transform:translateY(-5px);border-color:var(--bs-primary)!important}.tool-card:hover .icon-box{background-color:var(--bs-primary-subtle)!important}.tool-card .icon-box{width:60px;height:60px;transition:background-color .2s ease}.border-dashed{border:2px dashed #dee2e6!important}.border-dashed:hover{border-color:var(--bs-primary)!important;background-color:#fff!important}.popup{position:fixed;top:20%;right:20px;width:320px;max-width:calc(100vw - 32px);background:#fff;border-radius:10px;padding:16px}.status-row{display:flex;justify-content:space-between;margin:10px 0}.success{color:#2e7d32;font-weight:700}.error{color:#d32f2f}.pending{color:#f9a825}.section-flag{font-weight:600}button.btn.btn-sm.btn-outline-primary{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.add-profession-plus-btn{display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0;min-width:31px;width:31px;height:31px}button.btn.btn-sm.btn-outline-primary:hover{background-color:#356895;border-color:#356895;color:#fff}button.btn.btn-sm.btn-outline-danger{border:1px solid #dc3545;color:#dc3545;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.rounded-circle{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.action-icon-btn{min-width:22px;width:22px;height:22px;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:5px!important;background:transparent!important;border:none!important;line-height:1}button.action-icon-btn.btn-outline-primary{color:#4077ad!important;border-color:#4077ad!important}button.action-icon-btn.btn-outline-danger{color:#dc3545!important}.action-icon-image{width:20px;height:20px;object-fit:contain;display:inline-block}.action-icon-image.edit-icon{filter:brightness(0) saturate(100%) invert(41%) sepia(39%) saturate(774%) hue-rotate(170deg) brightness(91%) contrast(89%)}.action-icon-image.delete-icon{filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.status-modal-card{width:min(760px,96vw);max-height:85vh;overflow:auto;background:#fff;border-radius:16px;border:1px solid #e5e7eb}.status-modal-header{padding:20px 24px 14px;border-bottom:1px solid #eef2f7}.status-modal-body{padding:12px 20px 20px}.status-modal-footer{padding:12px 20px 20px;border-top:1px solid #eef2f7;display:flex;justify-content:end;align-items:center;gap:12px}.status-modal-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 10px;border-bottom:1px solid #f1f5f9}.status-modal-row:last-child{border-bottom:0}.status-modal-name{font-size:14px;font-weight:600;color:#69707d}.status-modal-state{font-size:.92rem;font-weight:600}.status-modal-state.pending{color:#a16207}.status-modal-state.success{color:#166534}.status-modal-state.partial{color:#b45309}.status-modal-state.error{color:#b91c1c}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{font-size:14px}.confirm-modal-card .form-control,.confirm-modal-card .form-select{font-size:12px}.year-experience-select{max-height:150px}::ng-deep .ng-dropdown-panel{min-width:180px;z-index:2147483647!important;border-radius:6px!important;overflow:hidden}::ng-deep .ng-dropdown-panel.ng-select-bottom,::ng-deep .ng-dropdown-panel.ng-select-top{border-radius:6px!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items{max-height:220px;overflow-y:auto}@media screen and (max-width: 768px){.res-flex{flex-wrap:wrap!important;justify-content:center!important}.res-flex .fw-normal{width:100%;text-align:center;font-size:14px!important}.d-flex.flex-wrap.gap-2.p-3.bg-white.border.rounded.shadow-sm{justify-content:center}.preview-page-header{margin:20px auto 8px;padding:0 4px}.container{padding-left:4px;padding-right:4px}.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.actions{margin:24px 0 16px}.section-header-title{flex-wrap:wrap}.section-header-title>.section-flag{flex-basis:53%}.section-header-row{align-items:flex-start}.preview-card-gradient{padding:14px 14px 12px}.preview-card-gradient h2{font-size:18px}.popup{width:calc(100vw - 40px);right:16px;top:12%}.card{padding:0}.card-body.p-4,.px-4.py-3{padding:12px!important}.row.g-4,.row.g-3{--bs-gutter-x: .75rem}.d-flex.gap-4{gap:10px!important}.preview-card-gradient>.d-flex.justify-content-between.align-items-start{flex-wrap:wrap;row-gap:8px}.preview-card-gradient>.d-flex.justify-content-between.align-items-start>.badge.bg-primary-subtle{margin-left:auto}}@media screen and (max-width: 575px){.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.section>.d-flex{flex-wrap:wrap;row-gap:8px}.section>.d-flex>.d-flex:last-child{width:100%;justify-content:flex-end}}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .bs-datepicker-body table td span.selected,.bs-datepicker-body table td.selected span{background-color:#4077ad!important}.profile-avatar-circle{width:58px;height:58px;border-radius:5px;background:#4077ad;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;color:#fff;letter-spacing:1px;flex-shrink:0}.section-header-icon{font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;opacity:.9;filter:invert(47%) sepia(8%) saturate(483%) hue-rotate(176deg) brightness(91%) contrast(87%)}.section-header-title h5.fw-bold{color:#69707d}.text-muted{color:#69707d!important;font-size:12px}h6.text-uppercase.fw-bold.text-muted{font-size:14px;color:#69707d!important}.company-detail-label{font-size:14px;font-weight:700;text-transform:uppercase;color:#69707d!important}.work-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.work-accent-item:hover{background-color:#f5f8ff!important;box-shadow:0 4px 14px #4077ad17!important}.edu-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.edu-accent-item:hover{background-color:#f8f8ff!important;box-shadow:0 4px 14px #6366f117!important}.cert-accent-item{border-radius:5px!important;transition:background-color .18s ease}.cert-accent-item:hover{background-color:#f0fdf4!important}.lic-accent-item{border-radius:5px!important;transition:background-color .18s ease}.lic-accent-item:hover{background-color:#fffbeb!important}.field-label-sm{font-size:14px;font-weight:700;color:#69707d;margin-bottom:3px;display:block}.item-name-text,.field-value-sm{font-size:12px;color:#69707d}.item-title-sm{font-size:14px;color:#69707d!important}.item-meta-line{display:block;font-size:12px;color:#69707d;margin-top:3px}.empty-state-wrap{text-align:center;padding:32px 20px;background:#fafbfc;border:1.5px dashed #d1d5db;border-radius:5px;cursor:pointer;transition:background-color .18s ease,border-color .18s ease}.empty-state-wrap .empty-icon{font-size:2rem;color:#d1d5db;margin-bottom:8px}.empty-state-wrap p{color:#9ca3af;margin:0;font-size:14px}.empty-state-wrap:hover{background:#f0f6ff;border-color:#4077ad}.form-panel{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:20px}.form-panel .form-control,.form-panel .form-select{border-color:#d1d5db;border-radius:5px;font-size:12px}.form-panel .form-control:focus,.form-panel .form-select:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.section-header-bar{display:flex;align-items:center;justify-content:space-between;padding:10px 0 14px;border-bottom:2px solid #f1f5f9;margin-bottom:16px}.preview-card-gradient{background:linear-gradient(135deg,#fff,#eff6ff);border-bottom:1px solid #e2e8f0;padding:20px 24px 16px;border-radius:5px 5px 0 0}.profile-header-card{border:1px solid #e2e8f0!important}.item-icon-circle{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#fff;flex-shrink:0}.item-avatar--work{background:linear-gradient(135deg,#4077ad,#2d5a8a)}.item-avatar--edu{background:linear-gradient(135deg,#4077ad,#4338ca)}.provider-layout{display:flex;flex-direction:column}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.btn.btn-primary{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important;padding:.375rem .75rem;line-height:1.5}.btn.btn-primary:hover:not(:disabled),.btn.btn-primary:focus:not(:disabled),.btn.btn-primary:active:not(:disabled){background-color:#356895!important;border-color:#356895!important;color:#fff!important}.btn.btn-success,.btn.btn-outline-success{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-success:hover:not(:disabled),.btn.btn-success:focus:not(:disabled),.btn.btn-success:active:not(:disabled),.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:#336843!important;border-color:#336843!important;color:#fff!important}.btn.btn-outline-secondary.rounded-pill{background-color:#69707d!important;border-color:#69707d!important;color:#fff!important;border-radius:5px!important}.btn.btn-outline-secondary.rounded-pill:hover:not(:disabled),.btn.btn-outline-secondary.rounded-pill:focus:not(:disabled),.btn.btn-outline-secondary.rounded-pill:active:not(:disabled){background-color:#565c66!important;border-color:#565c66!important;color:#fff!important}.preview-back-btn{background-color:#426c85!important;border-color:#426c85!important;color:#fff!important}.preview-dashboard-btn{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:transparent!important;border-color:#198754!important;color:#198754!important}.btn.btn-outline-secondary:not(.rounded-pill){background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.btn.btn-outline-secondary:not(.rounded-pill):hover:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):focus:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.btn.btn-danger:hover:not(:disabled),.btn.btn-danger:focus:not(:disabled),.btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}.btn.btn-outline-danger.rounded-circle{border-color:#b43026!important;color:#b43026!important;border-radius:5px!important}.btn.btn-outline-danger.rounded-circle:hover:not(:disabled),.btn.btn-outline-danger.rounded-circle:focus:not(:disabled),.btn.btn-outline-danger.rounded-circle:active:not(:disabled){border-color:#96271f!important;color:#b43026!important}.btn.btn-link.text-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-secondary:hover:not(:disabled),.btn.btn-link.text-secondary:focus:not(:disabled){background-color:#c2cbde!important;color:#69707d!important}.btn.btn-link.text-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-danger:hover:not(:disabled),.btn.btn-link.text-danger:focus:not(:disabled){background-color:#96271f!important;color:#fff!important}.btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.rating-count{font-size:14px}.card-footer.bg-white .btn{min-height:38px;display:inline-flex;align-items:center;justify-content:center;font-size:14px}.skill-tool-editor-card label,.skill-tool-editor-card .form-control,.skill-tool-editor-card .form-select{font-size:12px}.skill-tool-editor-card .form-control::placeholder{font-size:12px}.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-select-container,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-placeholder,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-value-label{font-size:12px}.skill-tool-editor-card .form-control:not(textarea){height:32px!important}::ng-deep .skill-tool-editor-select .ng-option,::ng-deep .skill-tool-editor-select .ng-placeholder{font-size:12px}.badge.bg-warning-subtle.text-warning{background-color:#fff3cd!important;color:#664d03!important;border-color:#ffe69c!important}.badge.bg-success-subtle.text-success{background-color:#4077ad!important;color:#fff!important;border-color:#4077ad!important}.badge.bg-primary-subtle.text-primary{background-color:#e0edf2!important;color:#4077ad!important;border-color:#e0edf2!important}.work-editor-row label,.work-editor-row .form-control{font-size:12px}.work-editor-row .form-control::placeholder{font-size:12px}.education-editor-row label,.education-editor-row .form-control{font-size:12px}.education-editor-row .form-control::placeholder{font-size:12px}::ng-deep .education-degree-type-select .ng-select-container,::ng-deep .education-degree-type-select .ng-placeholder,::ng-deep .education-degree-type-select .ng-value-label,::ng-deep .education-degree-type-select .ng-option{font-size:12px}.license-editor-row label,.license-editor-row .form-control{font-size:12px}.license-editor-row .form-control::placeholder{font-size:12px}.certification-editor-row label,.certification-editor-row .form-control{font-size:12px}.certification-editor-row .form-control::placeholder{font-size:12px}::ng-deep .certification-profession-select .ng-select-container,::ng-deep .certification-profession-select .ng-placeholder,::ng-deep .certification-profession-select .ng-value-label,::ng-deep .certification-profession-select .ng-option{font-size:12px}.update-profile-card label,.update-profile-card .form-control,.update-profile-card .form-select{font-size:12px}.update-profile-card .form-control::placeholder{font-size:12px}.update-profile-card ::ng-deep im-address-verify-field .form-control{font-size:12px}.update-profile-card textarea.form-control{min-height:110px;resize:vertical}.add-profession-card label,.add-profession-card .form-control{font-size:12px}.add-profession-card .form-control::placeholder{font-size:12px}.add-profession-card .btn{font-size:14px}.add-profession-card ::ng-deep .add-profession-select .ng-select-container,.add-profession-card ::ng-deep .add-profession-select .ng-placeholder,.add-profession-card ::ng-deep .add-profession-select .ng-value-label{font-size:12px}::ng-deep .add-profession-select .ng-option,::ng-deep .add-profession-select .ng-placeholder{font-size:12px}label{margin-bottom:10px}\n"] }]
7792
+ ], template: "<div class=\"preview-page-header\" *ngIf=\"!isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-1\">\r\n <h2 class=\"preview-title mb-0\">Review Extracted Information</h2>\r\n </div>\r\n <p class=\"preview-subtitle text-muted\">We\u2019ve automatically extracted details from your uploaded resume. Please review and confirm accuracy before proceeding.</p>\r\n</div>\r\n\r\n\r\n<div [ngClass]=\"isResume ? '' : 'container py-4 pt-0'\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- Provider initial setup: combined company + personal form (shown until both APIs succeed) -->\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && !hasUserDetailData && !isResume\">\r\n <div class=\"d-flex align-items-center gap-2 mb-3 section-header-title\">\r\n <img src=\"/assets/images/icons/building.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Personal & Company Details</h5>\r\n <span class=\"badge border section-flag bg-warning-subtle text-warning\">Required to continue</span>\r\n </div>\r\n <div class=\"card shadow-sm border-0\">\r\n <div class=\"card-header bg-white fw-semibold\">Personal Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.firstName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.firstName\" name=\"setupFirstName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.firstName?.trim() && companyFormSubmitted\">First name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.lastName?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.lastName\" name=\"setupLastName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.lastName?.trim() && companyFormSubmitted\">Last name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.email?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.email\" name=\"setupEmail\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.email?.trim() && companyFormSubmitted\">Email is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'profile')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.phone?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.phone\" name=\"setupPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.phone?.trim() && companyFormSubmitted\">Phone number is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"setupAddress\" [options]=\"options\"\r\n inputClass=\"form-control form-control-sm\" [invalid]=\"!tempProfile?.address?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.address?.trim() && companyFormSubmitted\">Home address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.city\" name=\"setupUserCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.state\" name=\"setupUserState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.zipCode?.trim() && companyFormSubmitted}\"\r\n [ngModel]=\"tempProfile?.zipCode\" (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\"\r\n name=\"setupUserZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.zipCode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempProfile?.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempProfile.country\" name=\"setupUserCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempProfile?.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"setupJobTitle\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control form-control-sm\" [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted}\"\r\n name=\"setupYearsOfExp\" min=\"1\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0) && companyFormSubmitted\">Years of experience is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #setupHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"setupHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"setupHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"setupHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"headshotPreviewUrl\">\r\n <label class=\"small text-muted d-block\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); setupHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-header bg-white fw-semibold border-top\">Company Information</div>\r\n <div class=\"card-body p-4\">\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"setupCompanyName\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">Company name is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">{{ companyNameError }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" maxlength=\"14\" inputmode=\"numeric\"\r\n (input)=\"phoneMask($event, 'company')\" (keypress)=\"allowOnlyNumbers($event)\"\r\n [ngClass]=\"{'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10)}\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"setupCompanyPhone\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">Company phone is required</div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">Company phone must be 10 digits</div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Company Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"setupCompanyAddress\"\r\n [options]=\"options\" inputClass=\"form-control form-control-sm\"\r\n [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">Address is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"setupCompanyCity\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">City is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"setupCompanyState\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">State is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"setupCompanyZip\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">Zip code is required</div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted}\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"setupCompanyCountry\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #setupCompanyLogoInput type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"form-control form-control-sm\" (change)=\"uploadCompanyImage($event)\" name=\"setupCompanyLogo\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); setupCompanyLogoInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-footer d-flex align-items-center justify-content-end gap-2\">\r\n <span *ngIf=\"providerSetupError\" class=\"small text-danger me-auto\">{{ providerSetupError }}</span>\r\n <button class=\"btn btn-success px-5 \"\r\n [disabled]=\"isSavingProviderSetup || !isProviderSetupFormComplete\"\r\n (click)=\"saveProviderSetup()\">\r\n <span *ngIf=\"isSavingProviderSetup\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProviderSetup ? 'Saving...' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name !== 'Provider' || hasUserDetailData\">\r\n <div *ngIf=\"details() as data; else loading\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!headshotPreviewUrl\">\r\n {{ (data.firstName?.[0] || '') }}{{ (data.lastName?.[0] || '') }}\r\n </div>\r\n <img *ngIf=\"headshotPreviewUrl\" [src]=\"headshotPreviewUrl\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;\" alt=\"Profile\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ data.firstName }} {{ data.lastName }}</h2>\r\n <span *ngIf=\"basicSectionHasIssues()\" class=\"badge bg-warning-subtle text-warning border section-flag\">\r\n Missing info\r\n </span>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"basicDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ basicDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ data.jobTitle }} \u2022 {{ data.yearsOfExperience }} Years Exp.</p>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"badge bg-primary-subtle text-primary border p-2\">Email Verified</span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-12 border-bottom pb-2\">\r\n <h6 class=\"text-uppercase small fw-bold text-muted\">Summary</h6>\r\n <p class=\"text-secondary small mb-0\">{{ data.summary }}</p>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/envelope.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Email</span>\r\n <span class=\"field-value-sm d-block\">{{ data.email }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ data.phone }}</span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Location</span>\r\n <span class=\"field-value-sm d-block\">{{ data.address }}, {{ data.city }}, {{ data.state }}, {{ data.zipCode }}, {{ data.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!basicDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your basic info.\r\n </span>\r\n <span *ngIf=\"basicDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Basic details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm update-profile-card\" *ngIf=\"isEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Profile</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #basicForm=\"ngForm\" novalidate>\r\n <div *ngIf=\"basicIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ basicIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">First Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.firstName\" name=\"fName\"\r\n placeholder=\"First Name\" required #fName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"fName.invalid && (fName.dirty || fName.touched)\">First name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Last Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.lastName\" name=\"lName\"\r\n placeholder=\"Last Name\" required #lName=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"lName.invalid && (lName.dirty || lName.touched)\">Last name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Email <span class=\"text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" [(ngModel)]=\"tempProfile.email\" name=\"email\" placeholder=\"Email\"\r\n required email #email=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"email.invalid && (email.dirty || email.touched)\">\r\n <span *ngIf=\"email.errors?.['required']\">Email is required</span>\r\n <span *ngIf=\"email.errors?.['email']\">Email format is invalid</span>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Phone Number <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.phone\" (input)=\"phoneMask($event, 'profile')\"\r\n name=\"phone\" placeholder=\"Phone (10 digits)\" (keypress)=\"allowOnlyNumbers($event)\"\r\n required pattern=\"^\\(\\d{3}\\) \\d{3}-\\d{4}$\" maxlength=\"14\" inputmode=\"numeric\" #phone=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"phone.invalid && (phone.dirty || phone.touched)\">\r\n <span *ngIf=\"phone.errors?.['required']\">Phone number is required</span>\r\n <span *ngIf=\"phone.errors?.['pattern']\">Phone number must be 10 digits</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\"></span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.jobTitle\" name=\"jobTitle\"\r\n placeholder=\"Job Title\" #jobTitle=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"jobTitle.invalid && (jobTitle.dirty || jobTitle.touched)\">Job\r\n title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [ngClass]=\"{'is-invalid': !(tempProfile?.yearsOfExperience > 0)}\"\r\n [(ngModel)]=\"tempProfile.yearsOfExperience\"\r\n name=\"yearsOfExperience\" placeholder=\"Years of Experience\" required min=\"1\"\r\n #yearsOfExperience=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"!(tempProfile?.yearsOfExperience > 0)\">\r\n Years of experience is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3\">\r\n <label class=\"small text-muted d-block\">Home Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempProfile.address\" name=\"address\" [options]=\"options\"\r\n placeholder=\"Home Address\" required #address=\"ngModel\"\r\n [invalid]=\"address.invalid && (address.dirty || address.touched)\"\r\n [initialLat]=\"tempProfile.latitude\" [initialLng]=\"tempProfile.longitude\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"address.invalid && (address.dirty || address.touched)\">Home\r\n address is required</div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.city\" name=\"city\" placeholder=\"City\"\r\n required #city=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"city.invalid && (city.dirty || city.touched)\">City is required\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.state\" name=\"state\" placeholder=\"State\"\r\n required #state=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"state.invalid && (state.dirty || state.touched)\">State is\r\n required</div>\r\n </div>\r\n\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"tempProfile.zipCode\"\r\n (ngModelChange)=\"tempProfile.zipCode = sanitizeZipCode($event)\" name=\"zipCode\" placeholder=\"Zip Code\"\r\n required pattern=\"^\\d{1,6}$\" maxlength=\"6\" inputmode=\"numeric\" #zipCode=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"zipCode.invalid && (zipCode.dirty || zipCode.touched)\">Zip code\r\n is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"zipCode.errors?.['pattern'] && (zipCode.dirty || zipCode.touched)\">\r\n Zip code must be up to 6 digits\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"tempProfile.country\" name=\"country\"\r\n placeholder=\"Country\" required #country=\"ngModel\">\r\n <div class=\"small text-danger mt-1\" *ngIf=\"country.invalid && (country.dirty || country.touched)\">Country\r\n is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6 position-relative\">\r\n <label class=\"small text-muted d-block\">Profile Picture</label>\r\n <input #updateProfileHeadshotFile type=\"file\" accept=\".png,.jpg,.jpeg\" class=\"d-none\" (change)=\"uploadHeadshotImage($event)\" name=\"updateProfileHeadshotFile\" />\r\n <div class=\"position-relative\">\r\n <input type=\"text\" class=\"form-control form-control-sm pe-5\" [value]=\"headshotFileName\" readonly\r\n placeholder=\"Upload Profile Picture\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <img *ngIf=\"!isHeadshotLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;width:18px;\" (click)=\"updateProfileHeadshotFile.click()\" />\r\n <div *ngIf=\"isHeadshotLoading\" style=\"position:absolute;right:12px;top:50%;transform:translateY(-50%);\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\" *ngIf=\"headshotPreviewUrl\">Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"headshotPreviewUrl\">\r\n <img [src]=\"headshotPreviewUrl\" class=\"img-thumbnail rounded-circle\" style=\"width:64px;height:64px;object-fit:cover;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeHeadshotFile(); updateProfileHeadshotFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Summary</label>\r\n <textarea class=\"form-control\" rows=\"5\" [(ngModel)]=\"tempProfile.summary\" name=\"sum\"\r\n placeholder=\"Summary\"></textarea>\r\n </div>\r\n\r\n\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingBasic || !isBasicFormValid\" (click)=\"save()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\" *ngIf=\"roleData?.role?.name === 'Provider' && hasUserDetailData && !isResume\">\r\n <div class=\"card profile-header-card shadow-sm border-0 rounded-3 overflow-hidden\" *ngIf=\"!isCompanyEditMode()\">\r\n <div class=\"card-body p-0\">\r\n <div class=\"preview-card-gradient\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"profile-avatar-circle\" *ngIf=\"!companyLogoUrl()\">\r\n {{ (companyDetails()?.companyName?.[0] || '') | uppercase }}{{ (companyDetails()?.companyName?.[1] || '') | uppercase }}\r\n </div>\r\n <img *ngIf=\"companyLogoUrl()\" [src]=\"companyLogoUrl()\"\r\n class=\"rounded-circle\" style=\"width:56px;height:56px;object-fit:cover;background:#fff;\" alt=\"Company Logo\" />\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h2 class=\"fw-bold mb-1\">{{ companyDetails()?.companyName }}</h2>\r\n <span class=\"badge border section-flag\"\r\n [ngClass]=\"companyDetailsSaved ? 'bg-success-subtle text-success' : 'bg-warning-subtle text-warning'\">\r\n {{ companyDetailsSaved ? 'Saved' : 'Not saved yet' }}\r\n </span>\r\n </div>\r\n <p class=\"text-muted\">{{ companyDetails()?.companyPhoneNumber }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"px-4 py-3\">\r\n <div class=\"row g-4\">\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/telephone.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Phone</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.companyPhoneNumber }}</span>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <span class=\"field-label-sm\"><img src=\"/assets/images/icons/geo-alt.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" />Company Address</span>\r\n <span class=\"field-value-sm d-block\">{{ companyDetails()?.address1 }}, {{ companyDetails()?.city }}, {{ companyDetails()?.state }}, {{ companyDetails()?.zipcode }}, {{ companyDetails()?.country }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer d-flex align-items-center justify-content-between\">\r\n <span *ngIf=\"!companyDetailsSaved\" class=\"small text-warning fw-semibold\">\r\n <img src=\"/assets/images/icons/exclamation-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Click \"Edit\" to review and save your company info.\r\n </span>\r\n <span *ngIf=\"companyDetailsSaved\" class=\"small text-success fw-semibold\">\r\n <img src=\"/assets/images/icons/check-circle.svg\" width=\"13\" height=\"13\" class=\"me-1\" style=\"vertical-align:-0.1em\" alt=\"\" /> Company details saved.\r\n </span>\r\n <button class=\"btn btn-sm btn-primary px-4 ms-auto\" (click)=\"toggleCompanyEdit()\">Edit</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card shadow-sm\" *ngIf=\"isCompanyEditMode()\">\r\n <div class=\"card-header bg-white fw-bold\">Update Company Details</div>\r\n <div class=\"card-body p-4\">\r\n <form class=\"row g-3\" #companyForm=\"ngForm\" novalidate>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': (!tempCompanyDetails.companyName?.trim() && companyFormSubmitted) || companyNameError }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyName\" name=\"companyName\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyName?.trim() && companyFormSubmitted\">\r\n Company name is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"companyNameError\">\r\n {{ companyNameError }}\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Phone <span class=\"text-danger\">*</span></label>\r\n <input (input)=\"phoneMask($event, 'company')\" type=\"text\" maxlength=\"14\" (keypress)=\"allowOnlyNumbers($event)\" inputmode=\"numeric\" class=\"form-control form-control-sm\"\r\n [ngClass]=\"{ 'is-invalid': companyFormSubmitted && (!tempCompanyDetails.companyPhoneNumber?.trim() || getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10) }\"\r\n [(ngModel)]=\"tempCompanyDetails.companyPhoneNumber\" name=\"companyPhoneNumber\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.companyPhoneNumber?.trim() && companyFormSubmitted\">\r\n Company phone is required\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"tempCompanyDetails.companyPhoneNumber?.trim() && getDigitCount(tempCompanyDetails.companyPhoneNumber) !== 10 && companyFormSubmitted\">\r\n Company phone must be 10 digits\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Address <span class=\"text-danger\">*</span></label>\r\n <im-address-verify-field [(ngModel)]=\"tempCompanyDetails.address1\" name=\"address1\" [options]=\"options\"\r\n required [invalid]=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\"\r\n [initialLat]=\"tempCompanyDetails.latitude\" [initialLng]=\"tempCompanyDetails.longitude\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.address1?.trim() && companyFormSubmitted\">\r\n Address is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.city?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.city\" name=\"city\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.city?.trim() && companyFormSubmitted\">\r\n City is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.state?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.state\" name=\"state\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.state?.trim() && companyFormSubmitted\">\r\n State is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Zip Code <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.zipcode?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.zipcode\" name=\"zipcode\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.zipcode?.trim() && companyFormSubmitted\">\r\n Zip code is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" \r\n [ngClass]=\"{ 'is-invalid': !tempCompanyDetails.country?.trim() && companyFormSubmitted }\"\r\n [(ngModel)]=\"tempCompanyDetails.country\" name=\"country\" required />\r\n <div class=\"invalid-feedback\" *ngIf=\"!tempCompanyDetails.country?.trim() && companyFormSubmitted\">\r\n Country is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company Logo</label>\r\n <input #uploadCompanyFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadCompanyImage($event)\" class=\"form-control\" />\r\n <small class=\"text-muted d-block mt-1\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"tempCompanyLogoUrl\">\r\n <label class=\"small text-muted d-block\">Logo Preview</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"tempCompanyLogoUrl\" class=\"img-thumbnail\" style=\"max-height: 80px;\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoFile(); uploadCompanyFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"card-footer text-end gap-2 d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelCompanyEdit()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCompany\" \r\n (click)=\"saveCompanyDetails()\">\r\n <span *ngIf=\"isSavingCompany\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCompany ? 'Saving...' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [class.section-locked]=\"roleData?.role?.name === 'Provider' && !hasUserDetailData\">\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Profession</h5>\r\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\r\n {{ selectedProfessionCount }} selected\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary px-4\"\r\n [disabled]=\"selectedProfessionCount === 0 || isSavingProfessionsTable\"\r\n (click)=\"submitProfessions()\">\r\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingProfessionsTable ? 'Saving...' : professionSubmitLabel }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\r\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\r\n (keydown.enter)=\"createManualProfessionRow()\" />\r\n </div>\r\n\r\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\r\n <div class=\"profession-acc-columns\">\r\n <span></span>\r\n <span>Profession Name</span>\r\n <span>Group</span>\r\n <span>Type</span>\r\n <span></span>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\r\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\r\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\r\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\r\n (change)=\"onProfessionRowCheck(p, $event)\" />\r\n </div>\r\n <div class=\"profession-acc-name\">\r\n {{ p.professionName }}\r\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\r\n <!-- <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn ms-1\"\r\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionTypeId() === p.id\" title=\"Delete\">\r\n <span *ngIf=\"deletingProfessionTypeId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingProfessionTypeId() !== p.id\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button> -->\r\n </div>\r\n <div class=\"profession-acc-group\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else groupText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\r\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\r\n placeholder=\"Select group\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\r\n </div>\r\n <div class=\"profession-acc-type\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else typeText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\r\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\r\n placeholder=\"Select type\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\r\n </div>\r\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\r\n (click)=\"toggleProfessionRow(p)\"\r\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\r\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\r\n <div class=\"profession-acc-panel\">\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\r\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\r\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\r\n (click)=\"copyToAllProfessions(p.id)\" />\r\n Copy to all\r\n </label>\r\n </div>\r\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\r\n Select a Group and Type above to enable saving this profession.\r\n </div>\r\n <div class=\"profession-acc-fields\">\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\r\n <div class=\"profession-acc-stars\">\r\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\r\n (click)=\"setProfessionRowStars(p, s)\"\r\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\r\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\r\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\r\n <span class=\"small text-muted\">Yrs</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--visibility\">\r\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\r\n [name]=\"'profVis-' + p.id\" />\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--notes\">\r\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\r\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\r\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\r\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\r\n Add \"{{ professionSearchQry?.trim() }}\"\r\n </button>\r\n </div>\r\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\r\n class=\"text-center text-muted small py-3\">\r\n No professions found.\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Work Experience</h5>\r\n <span *ngIf=\"experience().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"workSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ workSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"experience().length === 0 || !workSectionHasUnsavedItems() || isSavingWork || isAddingJob() || editingJobIndex() !== null\"\r\n (click)=\"confirmAllWork()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add work experience\" (click)=\"addJob()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"experience().length === 0 && !isAddingJob()\" class=\"empty-state-wrap mb-3\" role=\"button\"\r\n (click)=\"addJob()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/briefcase.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No work experience added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n <div class=\"list-group list-group-flush rounded-3\">\r\n <div *ngIf=\"isAddingJob() && tempJob()\" class=\"list-group-item p-0 border-0\">\r\n <div class=\"form-panel mb-2\">\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"newJobTitle\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"newCompany\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"newIsCurrent\" id=\"newIsCurrent\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"newIsCurrent\">Current</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"newCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"newState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"newCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"newStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"newEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">End date is\r\n required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"newResponsibilities\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newWorkAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"newWorkAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); newWorkAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngFor=\"let job of experience(); let i = index\" class=\"list-group-item p-0 border-0 mb-2\">\r\n\r\n <div class=\"work-accent-item p-3 rounded-3 bg-white border\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"d-flex align-items-center cursor-pointer flex-grow-1\" (click)=\"toggleJob(i)\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"mb-0 fw-bold item-title-sm\">{{ job.jobTitle }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedWorkItem(i) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedWorkItem(i) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ job.company || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ formatMonthYear(job.startDate) }} - {{ job.isCurrent ? 'Present' :\r\n formatMonthYear(job.endDate) }}</span>\r\n <span class=\"item-meta-line\">{{ job.city }}<span *ngIf=\"job.city && job.state\">, </span>{{ job.state }}<ng-container *ngIf=\"!job.city && !job.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"editingJobIndex() !== i && (workIssuesByIndex()[i] || []).length > 0\"\r\n class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (workIssuesByIndex()[i] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\" (click)=\"startEditJob(i)\"\r\n title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteJob(i);\"\r\n [disabled]=\"deletingJobIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingJobIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingJobIndex() !== i\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n \r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"mt-3 p-3 rounded small\" *ngIf=\"expandedIndex() === i\">\r\n <ng-container *ngIf=\"editingJobIndex() !== i; else editJobForm\">\r\n <ul class=\"mb-0\">\r\n <li *ngFor=\"let res of job.responsibilities\">{{ res }}</li>\r\n </ul>\r\n </ng-container>\r\n\r\n <ng-template #editJobForm>\r\n <div *ngIf=\"tempJobIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempJobIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 work-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Job Title <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.jobTitle\"\r\n (ngModelChange)=\"patchTempJob({ jobTitle: $event })\" name=\"jobTitle{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.jobTitle)\">Job title is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Company <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.company\"\r\n (ngModelChange)=\"patchTempJob({ company: $event })\" name=\"company{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.company)\">Company name is required</div>\r\n </div>\r\n\r\n <div class=\"align-items-end col-md-12 d-flex justify-content-end pe-3\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input class=\"form-check-input mt-0\" type=\"checkbox\" [ngModel]=\"tempJob()?.isCurrent\"\r\n (ngModelChange)=\"setTempJobIsCurrent($event)\" name=\"isCurrent{{ i }}\" id=\"isCurrent{{ i }}\" />\r\n <label class=\"form-check-label ps-2 mb-0\" for=\"isCurrent{{ i }}\">Current</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.country\"\r\n (ngModelChange)=\"patchTempJob({ country: $event })\" name=\"country{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.state\"\r\n (ngModelChange)=\"patchTempJob({ state: $event })\" name=\"state{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempJob()?.city\"\r\n (ngModelChange)=\"patchTempJob({ city: $event })\" name=\"city{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.city)\">City is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempJob()?.startDate)\"\r\n (bsValueChange)=\"setTempJobMonth('startDate', $event)\" name=\"startDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && isBlank(tempJob()?.startDate)\">Start date is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [disabled]=\"tempJob()?.isCurrent\"\r\n [ngModel]=\"monthInputToDate(tempJob()?.endDate)\" (bsValueChange)=\"setTempJobMonth('endDate', $event)\"\r\n name=\"endDate{{ i }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isBlank(tempJob()?.endDate)\">\r\n End date is required\r\n </div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"workShowFieldErrors && !tempJob()?.isCurrent && isMonthRangeInvalid(tempJob()?.startDate, tempJob()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Responsibilities (one per line)</label>\r\n <textarea rows=\"6\" class=\"form-control form-control-sm responsibilities-textarea\"\r\n [ngModel]=\"(tempJob()?.responsibilities || []).join('\\n')\"\r\n (ngModelChange)=\"updateTempResponsibilities($event)\" name=\"responsibilities{{ i }}\"></textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #workAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onWorkExperienceFileSelected($event)\" name=\"workAttachment{{ i }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempJob()?.fileName\">\r\n <span>{{ tempJob()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempJob())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeJobFile(); workAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\" *ngIf=\"editingJobIndex() === i\">\r\n <button class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditJob(); $event.stopPropagation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4 \" [disabled]=\"isSavingWork\"\r\n (click)=\"saveEditJob(); $event.stopPropagation()\">\r\n <span *ngIf=\"isSavingWork\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingWork ? 'Uploading...' : workActionLabel(editingJobIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/patch-check-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Certifications</h5>\r\n <span *ngIf=\"certs().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"certificationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ certificationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"certs().length === 0 || !certificationSectionHasUnsavedItems() || isSavingCertification || isAddingCertification() || editingCertificationIndex() !== null\"\r\n (click)=\"confirmAllCertifications()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add certification\" (click)=\"addCertification()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"certs().length === 0 && !isAddingCertification() && editingCertificationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addCertification()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/patch-check.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No certifications added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingCertification() && tempCertification()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"newCertProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"newCertName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\" name=\"newCertOrg\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"newCertState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\" name=\"newCertCredentialId\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"newCertIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"newCertExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #newCertAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"newCertAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); newCertAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\"\r\n [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let cert of certs(); let ci = index\" class=\"list-group-item py-3 cert-accent-item\">\r\n <ng-container *ngIf=\"editingCertificationIndex() !== ci; else editCert\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ cert.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedCertificationItem(ci) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedCertificationItem(ci) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ cert.issuingOrganization || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.credentialId || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.issueDate ? formatMonthYear(cert.issueDate) : '\u2014' }} - {{ cert.expiryDate ? formatMonthYear(cert.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ cert.state || '\u2014' }}</span>\r\n <div *ngIf=\"(certIssuesByIndex()[ci] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (certIssuesByIndex()[ci] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditCertification(ci)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\"\r\n (click)=\"deleteCertification(ci)\" [disabled]=\"deletingCertificationIndex() === ci\" title=\"Delete\">\r\n <span *ngIf=\"deletingCertificationIndex() === ci\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingCertificationIndex() !== ci\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editCert>\r\n <div *ngIf=\"tempCertificationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempCertificationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 certification-editor-row\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 certification-profession-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"tempCertification()?.professionId\" (change)=\"onCertificationProfessionChange($event)\"\r\n name=\"certProfessionType{{ ci }}\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('certificate')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.name\"\r\n (ngModelChange)=\"patchTempCertification({ name: $event })\" name=\"certName{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"certificationShowFieldErrors && isBlank(tempCertification()?.name)\">Certificate name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certificate Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.issuingOrganization || ''\"\r\n (ngModelChange)=\"patchTempCertification({ issuingOrganization: $event || null })\"\r\n name=\"certOrg{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempCertification()?.state || ''\"\r\n (ngModelChange)=\"patchTempCertification({ state: $event || null })\" name=\"certState{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Certification Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\"\r\n [ngModel]=\"tempCertification()?.credentialId || ''\"\r\n (ngModelChange)=\"patchTempCertification({ credentialId: $event || null })\"\r\n name=\"certCredentialId{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('issueDate', $event)\" name=\"certIssue{{ ci }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempCertification()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempCertificationMonth('expiryDate', $event)\" name=\"certExpiry{{ ci }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"certificationShowFieldErrors && isMonthRangeInvalid(tempCertification()?.issueDate || null, tempCertification()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Certification File</label>\r\n <input #certAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onCertificationFileSelected($event)\" name=\"certAttachment{{ ci }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempCertification()?.fileName\">\r\n <span>{{ tempCertification()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempCertification())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeCertificationFile(); certAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditCertification()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingCertification\"\r\n (click)=\"saveCertificationEditor()\">\r\n <span *ngIf=\"isSavingCertification\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCertification ? 'Uploading...' : certificationActionLabel(editingCertificationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/card-checklist-warning.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Licenses</h5>\r\n <span *ngIf=\"licenses().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"licenseSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ licenseSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"licenses().length === 0 || !licenseSectionHasUnsavedItems() || isSavingLicense || isAddingLicense() || editingLicenseIndex() !== null\"\r\n (click)=\"confirmAllLicenses()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add license\" (click)=\"addLicense()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"licenses().length === 0 && !isAddingLicense() && editingLicenseIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addLicense()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/card-checklist.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No licenses added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div class=\"list-group list-group-flush shadow-sm rounded-3 border\">\r\n <div *ngIf=\"isAddingLicense() && tempLicense()\" class=\"list-group-item py-3 px-3\">\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"newLicName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"newLicAuthority\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"newLicNumber\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"newLicState\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"newLicIssueDate\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"newLicExpiryDate\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #newLicenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"newLicenseAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); newLicenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let lic of licenses(); let li = index\" class=\"list-group-item py-3 lic-accent-item\">\r\n <ng-container *ngIf=\"editingLicenseIndex() !== li; else editLic\">\r\n <div class=\"d-flex justify-content-between align-items-start gap-3\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <div class=\"fw-semibold item-title-sm\">{{ lic.name }}</div>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedLicenseItem(li) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedLicenseItem(li) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ lic.issuingAuthority || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.licenseNumber || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.issueDate ? formatMonthYear(lic.issueDate) : '\u2014' }} - {{ lic.expiryDate ? formatMonthYear(lic.expiryDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ lic.state || '\u2014' }}</span>\r\n <div *ngIf=\"(licenseIssuesByIndex()[li] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (licenseIssuesByIndex()[li] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditLicense(li)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteLicense(li)\"\r\n [disabled]=\"deletingLicenseIndex() === li\" title=\"Delete\">\r\n <span *ngIf=\"deletingLicenseIndex() === li\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingLicenseIndex() !== li\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editLic>\r\n <div *ngIf=\"tempLicenseIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempLicenseIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 license-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.name\"\r\n (ngModelChange)=\"patchTempLicense({ name: $event })\" name=\"licName{{ li }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"licenseShowFieldErrors && isBlank(tempLicense()?.name)\">License name is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Issued By</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.issuingAuthority || ''\"\r\n (ngModelChange)=\"patchTempLicense({ issuingAuthority: $event || null })\" name=\"licAuthority{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">License Number</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.licenseNumber || ''\"\r\n (ngModelChange)=\"patchTempLicense({ licenseNumber: $event || null })\" name=\"licNumber{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issued State</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempLicense()?.state || ''\"\r\n (ngModelChange)=\"patchTempLicense({ state: $event || null })\" name=\"licState{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Issue Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.issueDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('issueDate', $event)\" name=\"licIssue{{ li }}\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Expiry Date</label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempLicense()?.expiryDate || null)\"\r\n (bsValueChange)=\"setTempLicenseMonth('expiryDate', $event)\" name=\"licExpiry{{ li }}\" />\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"licenseShowFieldErrors && isMonthRangeInvalid(tempLicense()?.issueDate || null, tempLicense()?.expiryDate || null)\">\r\n Issued date must be less than expiry date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">License File</label>\r\n <input #licenseAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onLicenseFileSelected($event)\" name=\"licenseAttachment{{ li }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempLicense()?.fileName\">\r\n <span>{{ tempLicense()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempLicense())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeLicenseFile(); licenseAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditLicense()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingLicense\"\r\n (click)=\"saveLicenseEditor()\">\r\n <span *ngIf=\"isSavingLicense\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingLicense ? 'Uploading...' : licenseActionLabel(editingLicenseIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section mb-5\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/tools.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Tools</h5>\r\n <span *ngIf=\"tools().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"toolsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ toolsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"tools().length === 0 || !toolsSectionHasUnsavedItems() || isSavingTool || isToolEditorOpen()\" (click)=\"confirmAllTools()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add tool\" (click)=\"addTool()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let tool of tools(); let ti = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openToolEditor(ti)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ tool }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedToolItem(ti) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedToolItem(ti) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(toolIssuesByIndex()[ti] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete tool\" (click)=\"deleteTool(ti)\"\r\n [disabled]=\"deletingToolIndex() === ti\">\r\n <span *ngIf=\"deletingToolIndex() === ti\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingToolIndex() !== ti\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"tools().length === 0\" class=\"text-muted small\">No tools added.</span>\r\n </div>\r\n\r\n <div *ngIf=\"isToolEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeToolEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeToolEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingTool() ? 'Add Tool' : ('Edit ' + (toolForm()?.name || '') + ' Tool') }}\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"toolShowFieldErrors && toolFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ toolFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"toolForm()?.professionId\" (change)=\"onToolProfessionChange($event)\"\r\n name=\"toolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('tool')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Tool Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"toolForm()?.name\"\r\n (ngModelChange)=\"patchToolForm({ name: $event })\" name=\"toolName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"toolShowFieldErrors && isBlank(toolForm()?.name)\">Tool name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempToolStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(toolForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (toolForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ toolForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"toolForm()?.year\"\r\n (ngModelChange)=\"patchToolForm({ year: $event === '' ? 0 : +$event })\" name=\"toolYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"toolForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchToolForm({ profileVisibility: $event })\" name=\"toolVisible\" id=\"toolVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"toolForm()?.notes\"\r\n (ngModelChange)=\"patchToolForm({ notes: $event })\" name=\"toolNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingTool() && editingToolIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteTool(editingToolIndex()!)\"\r\n [disabled]=\"deletingToolIndex() === editingToolIndex()\">\r\n <span *ngIf=\"deletingToolIndex() === editingToolIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeToolEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingTool\" (click)=\"saveToolEditor()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : toolActionLabel(editingToolIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/stars.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Skills</h5>\r\n <span *ngIf=\"skills().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"skillsSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ skillsSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"skills().length === 0 || !skillsSectionHasUnsavedItems() || isSavingSkill || isSkillEditorOpen()\" (click)=\"confirmAllSkills()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add skill\" (click)=\"addSkill()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-wrap gap-2 p-3 bg-white border rounded shadow-sm\">\r\n <div *ngFor=\"let skill of skills(); let si = index\" class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\"\r\n class=\"btn btn-light border res-flex d-inline-flex align-items-center gap-2 px-3 py-2\"\r\n (click)=\"openSkillEditor(si)\" title=\"Edit\">\r\n <span class=\"fw-normal item-name-text\">{{ skill }}</span>\r\n <span class=\"badge border ms-1\"\r\n [ngClass]=\"hasUnsavedSkillItem(si) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedSkillItem(si) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n <span *ngIf=\"(skillIssuesByIndex()[si] || []).length > 0\"\r\n class=\"badge bg-warning-subtle text-warning border ms-1\">\r\n Missing info\r\n </span>\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-danger rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Delete skill\"\r\n (click)=\"deleteSkill(si); $event.stopPropagation()\" [disabled]=\"deletingSkillIndex() === si\">\r\n <span *ngIf=\"deletingSkillIndex() === si\" class=\"spinner-border spinner-border-sm\"></span>\r\n <span *ngIf=\"deletingSkillIndex() !== si\" class=\"fw-bold\">\u00D7</span>\r\n </button>\r\n </div>\r\n\r\n <span *ngIf=\"skills().length === 0\" class=\"text-muted small\">No skills added.</span>\r\n </div>\r\n <div *ngIf=\"isSkillEditorOpen()\" class=\"position-fixed top-0 start-0 w-100 h-100\"\r\n style=\"background: rgba(0,0,0,0.35); z-index: 9999999;\" (click)=\"closeSkillEditor()\">\r\n <div class=\"container h-100 d-flex align-items-start justify-content-center pt-4\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"card shadow border-0 w-100 skill-tool-editor-card\" style=\"max-width: 900px;\">\r\n <div class=\"card-header bg-white d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 text-decoration-none\" (click)=\"closeSkillEditor()\">\r\n <img src=\"/assets/images/icons/arrow-left-blue.svg\" width=\"20\" height=\"20\" alt=\"\" />\r\n </button>\r\n <div class=\"fw-bold\">{{ isAddingSkill() ? 'Add Skill' : ('Edit ' + (skillForm()?.name || '') + ' Skill')\r\n }}</div>\r\n </div>\r\n <div class=\"card-body p-4\">\r\n <div *ngIf=\"skillShowFieldErrors && skillFormIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ skillFormIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1 skill-tool-editor-select\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"skillForm()?.professionId\" (change)=\"onSkillProfessionChange($event)\"\r\n name=\"skillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('skill')\">+</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Skills Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [ngModel]=\"skillForm()?.name\"\r\n (ngModelChange)=\"patchSkillForm({ name: $event })\" name=\"skillName\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"skillShowFieldErrors && isBlank(skillForm()?.name)\">Skillset name is required</div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempSkillStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"(skillForm()?.stars || 0) >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ (skillForm()?.stars || 0) >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ skillForm()?.stars || 0 }}/5</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4\">\r\n <label class=\"small text-muted d-block\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [ngModel]=\"skillForm()?.year\"\r\n (ngModelChange)=\"patchSkillForm({ year: $event === '' ? 0 : +$event })\" name=\"skillYear\" min=\"0\"\r\n max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n\r\n <div class=\"col-md-4 text-center\">\r\n <label class=\"small text-muted d-block\">Profile Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [ngModel]=\"skillForm()?.profileVisibility\"\r\n (ngModelChange)=\"patchSkillForm({ profileVisibility: $event })\" name=\"skillVisible\" id=\"skillVisible\" />\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Comment</label>\r\n <textarea rows=\"6\" class=\"form-control responsibilities-textarea\" [ngModel]=\"skillForm()?.notes\"\r\n (ngModelChange)=\"patchSkillForm({ notes: $event })\" name=\"skillNotes\"\r\n placeholder=\"Enter additional details (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer bg-white d-flex justify-content-end gap-2\">\r\n <button *ngIf=\"!isAddingSkill() && editingSkillIndex() !== null\" type=\"button\"\r\n class=\"btn btn-link text-danger me-auto\" (click)=\"deleteSkill(editingSkillIndex()!)\"\r\n [disabled]=\"deletingSkillIndex() === editingSkillIndex()\">\r\n <span *ngIf=\"deletingSkillIndex() === editingSkillIndex()\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n Delete\r\n </button>\r\n <button type=\"button\" class=\"btn btn-link text-secondary\" (click)=\"closeSkillEditor()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"isSavingSkill\" (click)=\"saveSkillEditor()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : skillActionLabel(editingSkillIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row g-4 mb-5\">\r\n <div class=\"col-md-12\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" width=\"20\" height=\"20\" class=\"section-header-icon\" alt=\"\" />\r\n <h5 class=\"fw-bold mb-0\">Education</h5>\r\n <span *ngIf=\"educationList().length > 0\" class=\"badge border section-flag\"\r\n [ngClass]=\"educationSectionHasUnsavedItems() ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ educationSectionHasUnsavedItems() ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-success\"\r\n [disabled]=\"educationList().length === 0 || !educationSectionHasUnsavedItems() || isSavingEducation || isAddingEducation() || editingEducationIndex() !== null\"\r\n (click)=\"confirmAllEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Confirming...' : 'Confirm All' }}\r\n </button>\r\n <button type=\"button\"\r\n class=\"btn btn-sm btn-outline-primary rounded-circle d-inline-flex align-items-center justify-content-center\"\r\n style=\"width: 32px; height: 32px; line-height: 1;\" title=\"Add education\" (click)=\"addEducation()\">\r\n <span class=\"fw-bold fs-5\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"educationList().length === 0 && !isAddingEducation() && editingEducationIndex() === null\"\r\n class=\"empty-state-wrap mb-3\" role=\"button\" (click)=\"addEducation()\">\r\n <div class=\"empty-icon\"><img src=\"/assets/images/icons/mortarboard.svg\" width=\"32\" height=\"32\" alt=\"\" /></div>\r\n <p>No education added yet. Click <strong>+</strong> to add one.</p>\r\n </div>\r\n\r\n <div *ngIf=\"isAddingEducation() && tempEducation()\" class=\"mb-2\">\r\n <div class=\"form-panel\">\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"newEduDegree\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"newEduInstitution\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"newEduDegreeType\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"newEduCountry\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"newEduState\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"newEduCity\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"newEduStartDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"newEduEndDate\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #newEducationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"newEducationAttachment\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); newEducationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-link text-secondary\"\r\n (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\"\r\n (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let edu of educationList(); let ei = index\" class=\"edu-accent-item p-3 bg-white border rounded-3 shadow-sm mb-2\">\r\n <ng-container *ngIf=\"editingEducationIndex() !== ei; else editEdu\">\r\n <div class=\"d-flex justify-content-between align-items-start\">\r\n <div>\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <h6 class=\"fw-bold mb-0 item-title-sm\">{{ edu.degree }}</h6>\r\n <span class=\"badge border\"\r\n [ngClass]=\"hasUnsavedEducationItem(ei) ? 'bg-warning-subtle text-warning' : 'bg-success-subtle text-success'\">\r\n {{ hasUnsavedEducationItem(ei) ? 'Not saved yet' : 'Saved' }}\r\n </span>\r\n </div>\r\n <span class=\"item-meta-line\">{{ edu.institution || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.degreeType || '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.startDate ? formatMonthYear(edu.startDate) : '\u2014' }} - {{ edu.endDate ? formatMonthYear(edu.endDate) : '\u2014' }}</span>\r\n <span class=\"item-meta-line\">{{ edu.city }}<span *ngIf=\"edu.city && edu.state\">, </span>{{ edu.state }}<ng-container *ngIf=\"!edu.city && !edu.state\">\u2014</ng-container></span>\r\n <div *ngIf=\"(educationIssuesByIndex()[ei] || []).length > 0\" class=\"alert alert-warning py-1 px-2 mt-2\">\r\n <div class=\"fw-semibold small\">Missing required fields</div>\r\n <div class=\"small\">{{ (educationIssuesByIndex()[ei] || []).join(' \u2022 ') }}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary action-icon-btn\"\r\n (click)=\"startEditEducation(ei)\" title=\"Edit\">\r\n <img class=\"action-icon-image edit-icon\" src=\"/assets/images/icons/edit-text.png\" alt=\"Edit\" />\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger action-icon-btn\" (click)=\"deleteEducation(ei)\"\r\n [disabled]=\"deletingEducationIndex() === ei\" title=\"Delete\">\r\n <span *ngIf=\"deletingEducationIndex() === ei\" class=\"spinner-border spinner-border-sm\"></span>\r\n <img *ngIf=\"deletingEducationIndex() !== ei\" class=\"action-icon-image delete-icon\" src=\"/assets/images/icons/delete.png\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #editEdu>\r\n <div *ngIf=\"tempEducationIssues().length > 0\" class=\"alert alert-warning py-2 px-3 mb-3\">\r\n <div class=\"fw-semibold\">Missing required fields</div>\r\n <div class=\"small\">{{ tempEducationIssues().join(' \u2022 ') }}</div>\r\n </div>\r\n <form class=\"row g-2 education-editor-row\">\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.degree\"\r\n (ngModelChange)=\"patchTempEducation({ degree: $event })\" name=\"eduDegree{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degree)\">Degree / Course name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Institution <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.institution\"\r\n (ngModelChange)=\"patchTempEducation({ institution: $event })\" name=\"eduInstitution{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.institution)\">Institution name is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Degree / Course Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"ng-select-sm education-degree-type-select\" [items]=\"educationDegreeTypeOptions\" [clearable]=\"false\"\r\n placeholder=\"Select degree / course type\" [ngModel]=\"tempEducation()?.degreeType\"\r\n (ngModelChange)=\"patchTempEducation({ degreeType: $event })\" name=\"eduDegreeType{{ ei }}\">\r\n </ng-select>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.degreeType)\">Degree / Course type is\r\n required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Country <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.country\"\r\n (ngModelChange)=\"patchTempEducation({ country: $event })\" name=\"eduCountry{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.country)\">Country is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">State <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.state\"\r\n (ngModelChange)=\"patchTempEducation({ state: $event })\" name=\"eduState{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.state)\">State is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">City <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [ngModel]=\"tempEducation()?.city\"\r\n (ngModelChange)=\"patchTempEducation({ city: $event })\" name=\"eduCity{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.city)\">City is required</div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">Start Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.startDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('startDate', $event)\" name=\"eduStartDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.startDate)\">Start date is required\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"small text-muted d-block\">End Date <span class=\"text-danger\">*</span></label>\r\n <input class=\"form-control form-control-sm\" placeholder=\"MM/YYYY\" bsDatepicker [maxDate]=\"futureMaxDate\"\r\n [bsConfig]=\"monthPickerConfig\" [ngModel]=\"monthInputToDate(tempEducation()?.endDate)\"\r\n (bsValueChange)=\"setTempEducationMonth('endDate', $event)\" name=\"eduEndDate{{ ei }}\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"educationShowFieldErrors && isBlank(tempEducation()?.endDate)\">End date is required</div>\r\n <div class=\"small text-danger mt-1\"\r\n *ngIf=\"educationShowFieldErrors && isMonthRangeInvalid(tempEducation()?.startDate, tempEducation()?.endDate)\">\r\n Start date must be less than end date\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <label class=\"small text-muted d-block\">Education File</label>\r\n <input #educationAttachmentInput type=\"file\" accept=\".pdf,.doc,.docx,.jpg,.jpeg,.png\" class=\"form-control form-control-sm\"\r\n (change)=\"onEducationFileSelected($event)\" name=\"educationAttachment{{ ei }}\" />\r\n <small class=\"text-muted\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG</small>\r\n <div class=\"small text-muted mt-1 d-flex align-items-center gap-2\" *ngIf=\"tempEducation()?.fileName\">\r\n <span>{{ tempEducation()?.fileName }}</span>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"previewSelectedFile(tempEducation())\">Preview</button>\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\"\r\n (click)=\"removeEducationFile(); educationAttachmentInput.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-2\">\r\n <button class=\"btn btn-sm btn-link text-secondary\" (click)=\"cancelEditEducation()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-success px-4\" [disabled]=\"isSavingEducation\" (click)=\"saveEducation()\">\r\n <span *ngIf=\"isSavingEducation\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingEducation ? 'Uploading...' : educationActionLabel(editingEducationIndex()) }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"d-flex gap-3 justify-content-center mt-5 pt-2\" *ngIf=\"!isResume\">\r\n <button class=\"btn btn-outline-secondary preview-back-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" (click)=\"onBackClick()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\" style=\"vertical-align:-0.1em\">\r\n <path d=\"M11 3 5 8l6 5\" />\r\n </svg> Back\r\n </button>\r\n <button class=\"btn btn-primary preview-dashboard-btn px-5 h-auto\" style=\"border-radius: 5px !important;\" [disabled]=\"!canConfirmAndContinue() || isSavingBasic\"\r\n (click)=\"onGoToDashboardClick()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Saving...' : 'Go to Dashboard' }}\r\n <img *ngIf=\"!isSavingBasic\" src=\"/assets/images/icons/arrow-right-white.svg\" width=\"14\" height=\"14\" class=\"ms-1\" style=\"vertical-align:-0.1em\" alt=\"\" />\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loading>\r\n <div class=\"text-center p-5\">\r\n <div class=\"spinner-border text-primary\"></div>\r\n <p class=\"text-muted mt-2\">Loading data...</p>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showCustomProfessionForm\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card add-profession-card\" style=\"max-width: 420px;\">\r\n <h4 class=\"mb-1\">Add New Profession</h4>\r\n <p class=\"text-muted small mb-4\">This profession isn't in the list yet. Add it here so you can link it to this\r\n {{ customProfessionContextLabel }}.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Name <span class=\"text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"customProfessionName\" name=\"customProfessionName\"\r\n placeholder=\"Enter profession name\" />\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Group <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionGroupOptions\" [(ngModel)]=\"customProfessionGroup\" name=\"customProfessionGroup\"\r\n placeholder=\"Select group\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Type <span class=\"text-danger\">*</span></label>\r\n <ng-select class=\"add-profession-select\" [items]=\"professionTypeOptions\" [(ngModel)]=\"customProfessionType\" name=\"customProfessionType\"\r\n placeholder=\"Select type\" [clearable]=\"false\" [appendTo]=\"'body'\">\r\n </ng-select>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"setTempCustomProfessionStars(s)\" [attr.aria-label]=\"'Set rating ' + s\">\r\n <span [class]=\"customProfessionStars >= s ? 'text-warning fs-5' : 'text-muted fs-5'\">\r\n {{ customProfessionStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ customProfessionStars }}/5</span>\r\n </div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"customProfessionYear\" name=\"customProfessionYear\"\r\n min=\"0\" max=\"30\" placeholder=\"Years of Experience\" />\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelCustomProfessionForm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"!canSaveCustomProfession || isSavingCustomProfession\"\r\n (click)=\"saveCustomProfession()\">\r\n <span *ngIf=\"isSavingCustomProfession\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingCustomProfession ? 'Saving...' : 'Add Profession' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkSkillConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Skills</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all skills that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkSkillProfessionId\" (change)=\"onBulkSkillProfessionChange($event)\"\r\n name=\"bulkSkillProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-skill')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkSkillStars = s\">\r\n <span [class]=\"bulkSkillStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkSkillStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkSkillStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkSkillYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkSkillYear === null || bulkSkillYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkSkillConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingSkill || bulkSkillStars <= 0 || bulkSkillYear === null\"\r\n (click)=\"applyBulkSkillConfirm()\">\r\n <span *ngIf=\"isSavingSkill\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingSkill ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBulkToolConfirm\">\r\n <div class=\"confirm-modal-card\" style=\"max-width: 480px;\">\r\n <h4 class=\"mb-1\">Set Rating for All Tools</h4>\r\n <p class=\"text-muted small mb-4\">Enter a star rating and years of experience (and optionally a profession type) to apply to all tools that are missing these values.</p>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Profession Type</label>\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <ng-select class=\"flex-grow-1\" [items]=\"userProfessionOptions\" bindLabel=\"professionName\" bindValue=\"id\"\r\n [ngModel]=\"bulkToolProfessionId\" (change)=\"onBulkToolProfessionChange($event)\"\r\n name=\"bulkToolProfessionType\" placeholder=\"Select or search profession type\" [clearable]=\"true\">\r\n </ng-select>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm add-profession-plus-btn\" title=\"Add new profession\"\r\n (click)=\"openCustomProfessionForm('bulk-tool')\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"small text-muted d-block mb-1\">Self-ability Rating <span class=\"text-danger\">*</span></label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button *ngFor=\"let s of [1,2,3,4,5]\" type=\"button\" class=\"btn btn-link p-0 text-decoration-none\"\r\n (click)=\"bulkToolStars = s\">\r\n <span [class]=\"bulkToolStars >= s ? 'text-warning fs-4' : 'text-muted fs-4'\">\r\n {{ bulkToolStars >= s ? '\u2605' : '\u2606' }}\r\n </span>\r\n </button>\r\n <span class=\"rating-count text-muted\">{{ bulkToolStars }}/5</span>\r\n </div>\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolStars <= 0\">Star rating is required</div>\r\n </div>\r\n <div class=\"mb-4\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience <span class=\"text-danger\">*</span></label>\r\n <input type=\"number\" class=\"form-control\" [(ngModel)]=\"bulkToolYear\" min=\"1\" max=\"30\"\r\n placeholder=\"Years of Experience\" />\r\n <div class=\"small text-danger mt-1\" *ngIf=\"bulkToolYear === null || bulkToolYear === undefined\">Years of experience is required</div>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"cancelBulkToolConfirm()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\"\r\n [disabled]=\"isSavingTool || bulkToolStars <= 0 || bulkToolYear === null\"\r\n (click)=\"applyBulkToolConfirm()\">\r\n <span *ngIf=\"isSavingTool\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingTool ? 'Saving...' : 'Apply to All & Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showBackConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Leave this page?</h4>\r\n <p class=\"text-muted mb-4\">If you go back, only saved data will be retained.</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"stayOnPreview()\">Stay</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"proceedBack()\">Proceed Back</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"modal-overlay\" *ngIf=\"showDashboardConfirmPopup\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Finish Setup and Continue</h4>\r\n <p class=\"text-muted mb-4\">Save your information and go to your dashboard</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" [disabled]=\"isSavingBasic\"\r\n (click)=\"cancelDashboardRedirect()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary h-auto\" [disabled]=\"isSavingBasic\" (click)=\"goToDashboard()\">\r\n <span *ngIf=\"isSavingBasic\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n {{ isSavingBasic ? 'Proceeding...' : 'Proceed' }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{color:#69707d}.res-flex:hover,.res-flex:focus,.res-flex:active{transform:none!important;box-shadow:none!important}::ng-deep .profession-acc-checkbox .form-check-input{margin-left:unset!important}.profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1fr 1fr 1fr 50px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical;font-size:12px}.profession-notes-input::placeholder{font-size:12px}.responsibilities-textarea{min-height:130px;resize:vertical}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.container{max-width:900px;margin:30px auto;font-family:Arial,sans-serif;color:#69707d}.preview-page-header{max-width:900px;margin:50px auto 10px;padding:0 12px}.preview-title{font-size:18px;font-weight:700;color:#69707d;margin:0}.preview-subtitle{margin-top:7px;font-size:14px;color:#69707d}.preview-card-gradient h2,.section h5.fw-bold{font-size:18px}.section{margin-bottom:25px}.section-title{font-weight:600;display:block;margin-bottom:8px}.section-title .sub{font-weight:400;color:#777;font-size:13px}.dropdown-box{border:1px solid #ddd;border-radius:8px;padding:12px 15px;display:flex;justify-content:space-between;align-items:center}.icons{display:flex;gap:10px}.icon{cursor:pointer;font-size:14px;color:#777}.card{border:1px solid #ddd;border-radius:5px;padding:20px;background:#fff}.category{border-bottom:1px solid #eee;padding:15px 0}.category:last-child{border-bottom:none}.category-header{display:flex;justify-content:space-between;font-weight:600;margin-bottom:10px}.tags{display:flex;flex-wrap:wrap;gap:10px}.tag{background:#f2f4f7;padding:6px 12px;border-radius:6px;font-size:13px}.footer{text-align:center;margin-top:15px;color:#777;cursor:pointer}.actions{display:flex;justify-content:space-between;margin:50px 0 27px}.text-secondary{white-space:pre-line;font-size:12px;color:#69707d}.extra-small{font-size:.8rem}.card{transition:box-shadow .2s ease}.achievement-section .badge{font-size:.75rem;white-space:normal;text-align:left}.skill-tag .badge{font-weight:500;font-size:.9rem;transition:all .2s ease;cursor:default}.skill-tag .badge:hover{transform:translateY(-2px)}.skill-tag .btn-close{opacity:.5}.skill-tag .btn-close:hover{opacity:1}.bg-light.text-dark.border{background-color:#f8f9fa!important;border-color:#dee2e6!important}.card{transition:all .3s cubic-bezier(.25,.8,.25,1)}.card:hover .bg-light{background-color:#e8f5e9!important}.position-fixed .card:hover{transform:none!important}code{background-color:#f8f9fa;padding:2px 6px;border-radius:4px}.list-group-item{transition:background-color .2s ease-in-out}.list-group-item:hover{background-color:#fcfcfc}.border-dashed{border-style:dashed!important}.tool-card{transition:all .2s ease-in-out;border-radius:12px}.tool-card:hover{transform:translateY(-5px);border-color:var(--bs-primary)!important}.tool-card:hover .icon-box{background-color:var(--bs-primary-subtle)!important}.tool-card .icon-box{width:60px;height:60px;transition:background-color .2s ease}.border-dashed{border:2px dashed #dee2e6!important}.border-dashed:hover{border-color:var(--bs-primary)!important;background-color:#fff!important}.popup{position:fixed;top:20%;right:20px;width:320px;max-width:calc(100vw - 32px);background:#fff;border-radius:10px;padding:16px}.status-row{display:flex;justify-content:space-between;margin:10px 0}.success{color:#2e7d32;font-weight:700}.error{color:#d32f2f}.pending{color:#f9a825}.section-flag{font-weight:600}button.btn.btn-sm.btn-outline-primary{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.add-profession-plus-btn{display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0;min-width:31px;width:31px;height:31px}button.btn.btn-sm.btn-outline-primary:hover{background-color:#356895;border-color:#356895;color:#fff}button.btn.btn-sm.btn-outline-danger{border:1px solid #dc3545;color:#dc3545;border-radius:5px!important}button.btn.btn-sm.btn-outline-primary.rounded-circle{background-color:#4077ad;border-color:#4077ad;color:#fff;border-radius:5px!important}button.action-icon-btn{min-width:22px;width:22px;height:22px;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:5px!important;background:transparent!important;border:none!important;line-height:1}button.action-icon-btn.btn-outline-primary{color:#4077ad!important;border-color:#4077ad!important}button.action-icon-btn.btn-outline-danger{color:#dc3545!important}.action-icon-image{width:20px;height:20px;object-fit:contain;display:inline-block}.action-icon-image.edit-icon{filter:brightness(0) saturate(100%) invert(41%) sepia(39%) saturate(774%) hue-rotate(170deg) brightness(91%) contrast(89%)}.action-icon-image.delete-icon{filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.status-modal-card{width:min(760px,96vw);max-height:85vh;overflow:auto;background:#fff;border-radius:16px;border:1px solid #e5e7eb}.status-modal-header{padding:20px 24px 14px;border-bottom:1px solid #eef2f7}.status-modal-body{padding:12px 20px 20px}.status-modal-footer{padding:12px 20px 20px;border-top:1px solid #eef2f7;display:flex;justify-content:end;align-items:center;gap:12px}.status-modal-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 10px;border-bottom:1px solid #f1f5f9}.status-modal-row:last-child{border-bottom:0}.status-modal-name{font-size:14px;font-weight:600;color:#69707d}.status-modal-state{font-size:.92rem;font-weight:600}.status-modal-state.pending{color:#a16207}.status-modal-state.success{color:#166534}.status-modal-state.partial{color:#b45309}.status-modal-state.error{color:#b91c1c}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{font-size:14px}.confirm-modal-card .form-control,.confirm-modal-card .form-select{font-size:12px}.year-experience-select{max-height:150px}::ng-deep .ng-dropdown-panel{min-width:180px;z-index:2147483647!important;border-radius:6px!important;overflow:hidden}::ng-deep .ng-dropdown-panel.ng-select-bottom,::ng-deep .ng-dropdown-panel.ng-select-top{border-radius:6px!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items{max-height:220px;overflow-y:auto}@media screen and (max-width: 768px){.res-flex{flex-wrap:wrap!important;justify-content:center!important}.res-flex .fw-normal{width:100%;text-align:center;font-size:14px!important}.d-flex.flex-wrap.gap-2.p-3.bg-white.border.rounded.shadow-sm{justify-content:center}.preview-page-header{margin:20px auto 8px;padding:0 4px}.container{padding-left:4px;padding-right:4px}.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.actions{margin:24px 0 16px}.section-header-title{flex-wrap:wrap}.section-header-title>.section-flag{flex-basis:53%}.section-header-row{align-items:flex-start}.preview-card-gradient{padding:14px 14px 12px}.preview-card-gradient h2{font-size:18px}.popup{width:calc(100vw - 40px);right:16px;top:12%}.card{padding:0}.card-body.p-4,.px-4.py-3{padding:12px!important}.row.g-4,.row.g-3{--bs-gutter-x: .75rem}.d-flex.gap-4{gap:10px!important}.preview-card-gradient>.d-flex.justify-content-between.align-items-start{flex-wrap:wrap;row-gap:8px}.preview-card-gradient>.d-flex.justify-content-between.align-items-start>.badge.bg-primary-subtle{margin-left:auto}}@media screen and (max-width: 575px){.preview-title{font-size:16px}.preview-subtitle{font-size:14px}.section>.d-flex{flex-wrap:wrap;row-gap:8px}.section>.d-flex>.d-flex:last-child{width:100%;justify-content:flex-end}}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .bs-datepicker-body table td span.selected,.bs-datepicker-body table td.selected span{background-color:#4077ad!important}.profile-avatar-circle{width:58px;height:58px;border-radius:5px;background:#4077ad;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;color:#fff;letter-spacing:1px;flex-shrink:0}.section-header-icon{font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;opacity:.9;filter:invert(47%) sepia(8%) saturate(483%) hue-rotate(176deg) brightness(91%) contrast(87%)}.section-header-title h5.fw-bold{color:#69707d}.text-muted{color:#69707d!important;font-size:12px}h6.text-uppercase.fw-bold.text-muted{font-size:14px;color:#69707d!important}.company-detail-label{font-size:14px;font-weight:700;text-transform:uppercase;color:#69707d!important}.work-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.work-accent-item:hover{background-color:#f5f8ff!important;box-shadow:0 4px 14px #4077ad17!important}.edu-accent-item{border-radius:5px!important;transition:background-color .18s ease,box-shadow .18s ease}.edu-accent-item:hover{background-color:#f8f8ff!important;box-shadow:0 4px 14px #6366f117!important}.cert-accent-item{border-radius:5px!important;transition:background-color .18s ease}.cert-accent-item:hover{background-color:#f0fdf4!important}.lic-accent-item{border-radius:5px!important;transition:background-color .18s ease}.lic-accent-item:hover{background-color:#fffbeb!important}.field-label-sm{font-size:14px;font-weight:700;color:#69707d;margin-bottom:3px;display:block}.item-name-text,.field-value-sm{font-size:12px;color:#69707d}.item-title-sm{font-size:14px;color:#69707d!important}.item-meta-line{display:block;font-size:12px;color:#69707d;margin-top:3px}.empty-state-wrap{text-align:center;padding:32px 20px;background:#fafbfc;border:1.5px dashed #d1d5db;border-radius:5px;cursor:pointer;transition:background-color .18s ease,border-color .18s ease}.empty-state-wrap .empty-icon{font-size:2rem;color:#d1d5db;margin-bottom:8px}.empty-state-wrap p{color:#9ca3af;margin:0;font-size:14px}.empty-state-wrap:hover{background:#f0f6ff;border-color:#4077ad}.form-panel{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:20px}.form-panel .form-control,.form-panel .form-select{border-color:#d1d5db;border-radius:5px;font-size:12px}.form-panel .form-control:focus,.form-panel .form-select:focus{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f}.section-header-bar{display:flex;align-items:center;justify-content:space-between;padding:10px 0 14px;border-bottom:2px solid #f1f5f9;margin-bottom:16px}.preview-card-gradient{background:linear-gradient(135deg,#fff,#eff6ff);border-bottom:1px solid #e2e8f0;padding:20px 24px 16px;border-radius:5px 5px 0 0}.profile-header-card{border:1px solid #e2e8f0!important}.item-icon-circle{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#fff;flex-shrink:0}.item-avatar--work{background:linear-gradient(135deg,#4077ad,#2d5a8a)}.item-avatar--edu{background:linear-gradient(135deg,#4077ad,#4338ca)}.provider-layout{display:flex;flex-direction:column}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.btn.btn-primary{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important;padding:.375rem .75rem;line-height:1.5}.btn.btn-primary:hover:not(:disabled),.btn.btn-primary:focus:not(:disabled),.btn.btn-primary:active:not(:disabled){background-color:#356895!important;border-color:#356895!important;color:#fff!important}.btn.btn-success,.btn.btn-outline-success{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-success:hover:not(:disabled),.btn.btn-success:focus:not(:disabled),.btn.btn-success:active:not(:disabled),.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:#336843!important;border-color:#336843!important;color:#fff!important}.btn.btn-outline-secondary.rounded-pill{background-color:#69707d!important;border-color:#69707d!important;color:#fff!important;border-radius:5px!important}.btn.btn-outline-secondary.rounded-pill:hover:not(:disabled),.btn.btn-outline-secondary.rounded-pill:focus:not(:disabled),.btn.btn-outline-secondary.rounded-pill:active:not(:disabled){background-color:#565c66!important;border-color:#565c66!important;color:#fff!important}.preview-back-btn{background-color:#426c85!important;border-color:#426c85!important;color:#fff!important}.preview-dashboard-btn{background-color:#4077ad!important;border-color:#4077ad!important;color:#fff!important}.btn.btn-outline-success:hover:not(:disabled),.btn.btn-outline-success:focus:not(:disabled),.btn.btn-outline-success:active:not(:disabled){background-color:transparent!important;border-color:#198754!important;color:#198754!important}.btn.btn-outline-secondary:not(.rounded-pill){background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.btn.btn-outline-secondary:not(.rounded-pill):hover:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):focus:not(:disabled),.btn.btn-outline-secondary:not(.rounded-pill):active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.btn.btn-danger:hover:not(:disabled),.btn.btn-danger:focus:not(:disabled),.btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}.btn.btn-outline-danger.rounded-circle{border-color:#b43026!important;color:#b43026!important;border-radius:5px!important}.btn.btn-outline-danger.rounded-circle:hover:not(:disabled),.btn.btn-outline-danger.rounded-circle:focus:not(:disabled),.btn.btn-outline-danger.rounded-circle:active:not(:disabled){border-color:#96271f!important;color:#b43026!important}.btn.btn-link.text-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-secondary:hover:not(:disabled),.btn.btn-link.text-secondary:focus:not(:disabled){background-color:#c2cbde!important;color:#69707d!important}.btn.btn-link.text-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important;text-decoration:none!important;border-radius:5px;padding:.375rem .75rem;line-height:1.5}.btn.btn-link.text-danger:hover:not(:disabled),.btn.btn-link.text-danger:focus:not(:disabled){background-color:#96271f!important;color:#fff!important}.btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.rating-count{font-size:14px}.card-footer.bg-white .btn{min-height:38px;display:inline-flex;align-items:center;justify-content:center;font-size:14px}.skill-tool-editor-card label,.skill-tool-editor-card .form-control,.skill-tool-editor-card .form-select{font-size:12px}.skill-tool-editor-card .form-control::placeholder{font-size:12px}.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-select-container,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-placeholder,.skill-tool-editor-card ::ng-deep .skill-tool-editor-select .ng-value-label{font-size:12px}.skill-tool-editor-card .form-control:not(textarea){height:32px!important}::ng-deep .skill-tool-editor-select .ng-option,::ng-deep .skill-tool-editor-select .ng-placeholder{font-size:12px}.badge.bg-warning-subtle.text-warning{background-color:#fff3cd!important;color:#664d03!important;border-color:#ffe69c!important}.badge.bg-success-subtle.text-success{background-color:#4077ad!important;color:#fff!important;border-color:#4077ad!important}.badge.bg-primary-subtle.text-primary{background-color:#e0edf2!important;color:#4077ad!important;border-color:#e0edf2!important}.work-editor-row label,.work-editor-row .form-control{font-size:12px}.work-editor-row .form-control::placeholder{font-size:12px}.education-editor-row label,.education-editor-row .form-control{font-size:12px}.education-editor-row .form-control::placeholder{font-size:12px}::ng-deep .education-degree-type-select .ng-select-container,::ng-deep .education-degree-type-select .ng-placeholder,::ng-deep .education-degree-type-select .ng-value-label,::ng-deep .education-degree-type-select .ng-option{font-size:12px}.license-editor-row label,.license-editor-row .form-control{font-size:12px}.license-editor-row .form-control::placeholder{font-size:12px}.certification-editor-row label,.certification-editor-row .form-control{font-size:12px}.certification-editor-row .form-control::placeholder{font-size:12px}::ng-deep .certification-profession-select .ng-select-container,::ng-deep .certification-profession-select .ng-placeholder,::ng-deep .certification-profession-select .ng-value-label,::ng-deep .certification-profession-select .ng-option{font-size:12px}.update-profile-card label,.update-profile-card .form-control,.update-profile-card .form-select{font-size:12px}.update-profile-card .form-control::placeholder{font-size:12px}.update-profile-card ::ng-deep im-address-verify-field .form-control{font-size:12px}.update-profile-card textarea.form-control{min-height:110px;resize:vertical}.add-profession-card label,.add-profession-card .form-control{font-size:12px}.add-profession-card .form-control::placeholder{font-size:12px}.add-profession-card .btn{font-size:14px}.add-profession-card ::ng-deep .add-profession-select .ng-select-container,.add-profession-card ::ng-deep .add-profession-select .ng-placeholder,.add-profession-card ::ng-deep .add-profession-select .ng-value-label{font-size:12px}::ng-deep .add-profession-select .ng-option,::ng-deep .add-profession-select .ng-placeholder{font-size:12px}label{margin-bottom:10px}\n"] }]
7793
7793
  }], ctorParameters: () => [{ type: CredentialingStore }, { type: FileService }, { type: UserSkillSetService }, { type: UserToolService }, { type: ProfessionService }, { type: UserProfessionService }, { type: UserDocumentService }, { type: UserEducationService }, { type: UserDetailService }, { type: UserExperienceService }, { type: i1$3.TokenService }, { type: i1$3.RoleContextService }, { type: ProvidersService }, { type: FrontEndProvidersService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
7794
7794
  type: Inject,
7795
7795
  args: [LIBRARY_CONFIG]
@@ -9016,11 +9016,11 @@ class EducationComponent {
9016
9016
  this.fileName = '';
9017
9017
  }
9018
9018
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EducationComponent, deps: [{ token: i1$3.RoleContextService }, { token: UserEducationService }, { token: UserService }, { token: CredentialingStore }, { token: EducationStore }, { token: CountryServices }, { token: PostalCodeServices }, { token: i1$3.TokenService }, { token: i7.FormBuilder }, { token: FileService }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
9019
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: EducationComponent, isStandalone: false, selector: "app-education", inputs: { providerId: "providerId", providerName: "providerName", cloudfrontUrl: "cloudfrontUrl" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!showpreview()\">\r\n <div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Add Education</h3>\r\n <p class=\"step-card-subtitle\">Please list your educational history from GED to college degree</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n <form [formGroup]=\"educationForm\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Degree Information</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">General Equivalency Diploma / Degree <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your Diploma here\" formControlName=\"courseName\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('courseName')?.touched &&\r\n educationForm.get('courseName')?.hasError('required')\">\r\n Degree is required\r\n </small>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">Diploma / Degree Type <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your Diploma / Degree Type\" formControlName=\"courseType\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('courseType')?.touched &&\r\n educationForm.get('courseType')?.hasError('required')\">\r\n Diploma / Degree Type is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <div class=\"head\">Institution Name <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter institution name here\" formControlName=\"instituteName\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('instituteName')?.touched &&\r\n educationForm.get('instituteName')?.hasError('required')\">\r\n Institution name is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Location &amp; Timeline</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\r\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\r\n &nbsp;{{ item.country }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\r\n placeholder=\"Select State\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\r\n &nbsp;{{ item.stateName }}\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"row form-row\">\r\n <div class=\"field city\">\r\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('city')?.touched &&\r\n educationForm.get('city')?.hasError('required')\">\r\n Enter City\r\n </small>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" [maxDate]=\"maxDate\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !educationForm.get('startDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"startDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"educationForm.get('startDate')?.touched &&\r\n educationForm.get('startDate')?.hasError('required')\">\r\n Start Date is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !educationForm.get('endDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"endDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"educationForm.get('endDate')?.touched &&\r\n educationForm.get('endDate')?.hasError('required')\">\r\n To Date is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Additional Details</div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"comments\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n <div class=\"upload-wrapper\">\r\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\r\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\r\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your diploma, degree certificate, or transcript (PDF, DOC, DOCX)</p>\r\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\r\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\r\n Upload Document\r\n </button>\r\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\r\n <p class=\"file-name\" *ngIf=\"fileName\">\r\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\r\n {{ fileName }}\r\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\r\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\r\n </button>\r\n <div class=\"right-actions\">\r\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\r\n class=\"secondary\" (click)=\"nextStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\r\n (click)=\"saveFile()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Success Toast -->\r\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\r\n <div class=\"step-toast-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"step-toast-body\">\r\n <div class=\"step-toast-title\">Saved Successfully</div>\r\n <div class=\"step-toast-msg\">Education record has been saved.</div>\r\n </div>\r\n <div class=\"step-toast-progress\"></div>\r\n</div>\r\n\r\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\r\n <div class=\"preview-header\">\r\n <div class=\"preview-header-icon\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"20\" height=\"20\" />\r\n </div>\r\n <div>\r\n <h3 class=\"preview-header-title\">Education</h3>\r\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"preview-timeline\">\r\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\r\n class=\"timeline-entry\" [class.last]=\"last\">\r\n <div class=\"timeline-track\">\r\n <div class=\"timeline-dot\"></div>\r\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\r\n </div>\r\n <div class=\"timeline-card\">\r\n <div class=\"tc-head\">\r\n <div class=\"tc-avatar\">{{ (exp.instituteName || exp.courseName || '?').charAt(0).toUpperCase() }}</div>\r\n <div class=\"tc-title-block\">\r\n <span class=\"tc-title\">{{ exp.courseName }}</span>\r\n <span class=\"tc-subtitle\">{{ exp.instituteName }}</span>\r\n </div>\r\n <div class=\"tc-actions\">\r\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\r\n </button>\r\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"detail-row\">\r\n <div class=\"detail-item\" *ngIf=\"exp.courseType\">\r\n <span class=\"detail-label\">Degree Type</span>\r\n <span class=\"detail-value\">{{ exp.courseType }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.startDate || exp.endDate\">\r\n <span class=\"detail-label\">Duration</span>\r\n <span class=\"detail-value\">{{ exp.startDate | date:'MMM yyyy' }}{{ exp.endDate ? ' \u2013 ' + (exp.endDate | date:'MMM yyyy') : '' }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\r\n <span class=\"detail-label\">Location</span>\r\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\r\n </div>\r\n </div>\r\n <p class=\"tc-description\" *ngIf=\"exp.comments\">{{ exp.comments }}</p>\r\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\r\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\r\n {{ exp.fileName }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\r\n Add More\r\n </button>\r\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#fff;color:#69707d;border:1.5px solid #e2e8f0;padding:10px 22px}button.secondary:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex;gap:0}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-icon{width:34px;height:34px;border-radius:8px;background:#ebf2f9;color:#4077ad;display:flex;align-items:center;justify-content:center;flex-shrink:0}.cred-icon--license{background:#f3f0ff;color:#7c3aed}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:13px;font-weight:700;color:#1e293b;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:11px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.job-title{color:#69707d;font-weight:400;font-size:14px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.row{flex-direction:column;gap:12px}.right-actions{gap:8px;flex-direction:column-reverse}.detail-grid{grid-template-columns:1fr}.actions,.action{gap:8px;display:flex;flex-direction:column-reverse}.add-btn{width:unset}.actions{margin:48px 0 20px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
9019
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: EducationComponent, isStandalone: false, selector: "app-education", inputs: { providerId: "providerId", providerName: "providerName", cloudfrontUrl: "cloudfrontUrl" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!showpreview()\">\n <div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Add Education</h3>\n <p class=\"step-card-subtitle\">Please list your educational history from GED to college degree</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n <form [formGroup]=\"educationForm\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Degree Information</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">General Equivalency Diploma / Degree <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your Diploma here\" formControlName=\"courseName\" />\n <small class=\"error\" *ngIf=\"educationForm.get('courseName')?.touched &&\n educationForm.get('courseName')?.hasError('required')\">\n Degree is required\n </small>\n </div>\n <div class=\"field\">\n <div class=\"head\">Diploma / Degree Type <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your Diploma / Degree Type\" formControlName=\"courseType\" />\n <small class=\"error\" *ngIf=\"educationForm.get('courseType')?.touched &&\n educationForm.get('courseType')?.hasError('required')\">\n Diploma / Degree Type is required\n </small>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <div class=\"head\">Institution Name <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter institution name here\" formControlName=\"instituteName\" />\n <small class=\"error\" *ngIf=\"educationForm.get('instituteName')?.touched &&\n educationForm.get('instituteName')?.hasError('required')\">\n Institution name is required\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Location &amp; Timeline</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\n &nbsp;{{ item.country }}\n </ng-template>\n </ng-select>\n </div>\n <div class=\"field\">\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\n placeholder=\"Select State\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\n &nbsp;{{ item.stateName }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n </div>\n <div class=\"row form-row\">\n <div class=\"field city\">\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\n <small class=\"error\" *ngIf=\"educationForm.get('city')?.touched &&\n educationForm.get('city')?.hasError('required')\">\n Enter City\n </small>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" [maxDate]=\"maxDate\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !educationForm.get('startDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"startDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"educationForm.get('startDate')?.touched &&\n educationForm.get('startDate')?.hasError('required')\">\n Start Date is required\n </small>\n </div>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !educationForm.get('endDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"endDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"educationForm.get('endDate')?.touched &&\n educationForm.get('endDate')?.hasError('required')\">\n To Date is required\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Additional Details</div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"comments\"></textarea>\n </div>\n </div>\n </div>\n\n </form>\n\n <div class=\"upload-wrapper\">\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your diploma, degree certificate, or transcript (PDF, DOC, DOCX)</p>\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\n Upload Document\n </button>\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\n <p class=\"file-name\" *ngIf=\"fileName\">\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\n {{ fileName }}\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\n </p>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\n </button>\n <div class=\"right-actions\">\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\n class=\"secondary\" (click)=\"nextStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\n (click)=\"saveFile()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<!-- Success Toast -->\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\n <div class=\"step-toast-icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"step-toast-body\">\n <div class=\"step-toast-title\">Saved Successfully</div>\n <div class=\"step-toast-msg\">Education record has been saved.</div>\n </div>\n <div class=\"step-toast-progress\"></div>\n</div>\n\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\n <div class=\"preview-header\">\n <div class=\"preview-header-icon\">\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"20\" height=\"20\" />\n </div>\n <div>\n <h3 class=\"preview-header-title\">Education</h3>\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\n </div>\n </div>\n\n <div class=\"preview-timeline\">\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\n class=\"timeline-entry\" [class.last]=\"last\">\n <div class=\"timeline-track\">\n <div class=\"timeline-dot\"></div>\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\n </div>\n <div class=\"timeline-card\">\n <div class=\"tc-head\">\n <div class=\"tc-avatar\">{{ (exp.instituteName || exp.courseName || '?').charAt(0).toUpperCase() }}</div>\n <div class=\"tc-title-block\">\n <span class=\"tc-title\">{{ exp.courseName }}</span>\n <span class=\"tc-subtitle\">{{ exp.instituteName }}</span>\n </div>\n <div class=\"tc-actions\">\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n </button>\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-item\" *ngIf=\"exp.courseType\">\n <span class=\"detail-label\">Degree Type</span>\n <span class=\"detail-value\">{{ exp.courseType }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.startDate || exp.endDate\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{ exp.startDate | date:'MMM yyyy' }}{{ exp.endDate ? ' \u2013 ' + (exp.endDate | date:'MMM yyyy') : '' }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\n <span class=\"detail-label\">Location</span>\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\n </div>\n </div>\n <p class=\"tc-description\" *ngIf=\"exp.comments\">{{ exp.comments }}</p>\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\n {{ exp.fileName }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\n Add More\n </button>\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#fff;color:#69707d;border:1.5px solid #e2e8f0;padding:10px 22px}button.secondary:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex;gap:0}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-icon{width:34px;height:34px;border-radius:8px;background:#ebf2f9;color:#4077ad;display:flex;align-items:center;justify-content:center;flex-shrink:0}.cred-icon--license{background:#f3f0ff;color:#7c3aed}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:13px;font-weight:700;color:#1e293b;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:11px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.job-title{color:#69707d;font-weight:400;font-size:14px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.row{flex-direction:column;gap:12px}.right-actions{gap:8px;flex-direction:column-reverse}.detail-grid{grid-template-columns:1fr}.actions,.action{gap:8px;display:flex;flex-direction:column-reverse}.add-btn{width:unset}.actions{margin:48px 0 20px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
9020
9020
  }
9021
9021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EducationComponent, decorators: [{
9022
9022
  type: Component,
9023
- args: [{ selector: 'app-education', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!showpreview()\">\r\n <div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Add Education</h3>\r\n <p class=\"step-card-subtitle\">Please list your educational history from GED to college degree</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n <form [formGroup]=\"educationForm\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Degree Information</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">General Equivalency Diploma / Degree <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your Diploma here\" formControlName=\"courseName\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('courseName')?.touched &&\r\n educationForm.get('courseName')?.hasError('required')\">\r\n Degree is required\r\n </small>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">Diploma / Degree Type <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your Diploma / Degree Type\" formControlName=\"courseType\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('courseType')?.touched &&\r\n educationForm.get('courseType')?.hasError('required')\">\r\n Diploma / Degree Type is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <div class=\"head\">Institution Name <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter institution name here\" formControlName=\"instituteName\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('instituteName')?.touched &&\r\n educationForm.get('instituteName')?.hasError('required')\">\r\n Institution name is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Location &amp; Timeline</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\r\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\r\n &nbsp;{{ item.country }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\r\n placeholder=\"Select State\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\r\n &nbsp;{{ item.stateName }}\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"row form-row\">\r\n <div class=\"field city\">\r\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\r\n <small class=\"error\" *ngIf=\"educationForm.get('city')?.touched &&\r\n educationForm.get('city')?.hasError('required')\">\r\n Enter City\r\n </small>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" [maxDate]=\"maxDate\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !educationForm.get('startDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"startDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"educationForm.get('startDate')?.touched &&\r\n educationForm.get('startDate')?.hasError('required')\">\r\n Start Date is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !educationForm.get('endDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"endDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"educationForm.get('endDate')?.touched &&\r\n educationForm.get('endDate')?.hasError('required')\">\r\n To Date is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Additional Details</div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"comments\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n <div class=\"upload-wrapper\">\r\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\r\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\r\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your diploma, degree certificate, or transcript (PDF, DOC, DOCX)</p>\r\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\r\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\r\n Upload Document\r\n </button>\r\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\r\n <p class=\"file-name\" *ngIf=\"fileName\">\r\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\r\n {{ fileName }}\r\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\r\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\r\n </button>\r\n <div class=\"right-actions\">\r\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\r\n class=\"secondary\" (click)=\"nextStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\r\n (click)=\"saveFile()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Success Toast -->\r\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\r\n <div class=\"step-toast-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"step-toast-body\">\r\n <div class=\"step-toast-title\">Saved Successfully</div>\r\n <div class=\"step-toast-msg\">Education record has been saved.</div>\r\n </div>\r\n <div class=\"step-toast-progress\"></div>\r\n</div>\r\n\r\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\r\n <div class=\"preview-header\">\r\n <div class=\"preview-header-icon\">\r\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"20\" height=\"20\" />\r\n </div>\r\n <div>\r\n <h3 class=\"preview-header-title\">Education</h3>\r\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"preview-timeline\">\r\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\r\n class=\"timeline-entry\" [class.last]=\"last\">\r\n <div class=\"timeline-track\">\r\n <div class=\"timeline-dot\"></div>\r\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\r\n </div>\r\n <div class=\"timeline-card\">\r\n <div class=\"tc-head\">\r\n <div class=\"tc-avatar\">{{ (exp.instituteName || exp.courseName || '?').charAt(0).toUpperCase() }}</div>\r\n <div class=\"tc-title-block\">\r\n <span class=\"tc-title\">{{ exp.courseName }}</span>\r\n <span class=\"tc-subtitle\">{{ exp.instituteName }}</span>\r\n </div>\r\n <div class=\"tc-actions\">\r\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\r\n </button>\r\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"detail-row\">\r\n <div class=\"detail-item\" *ngIf=\"exp.courseType\">\r\n <span class=\"detail-label\">Degree Type</span>\r\n <span class=\"detail-value\">{{ exp.courseType }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.startDate || exp.endDate\">\r\n <span class=\"detail-label\">Duration</span>\r\n <span class=\"detail-value\">{{ exp.startDate | date:'MMM yyyy' }}{{ exp.endDate ? ' \u2013 ' + (exp.endDate | date:'MMM yyyy') : '' }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\r\n <span class=\"detail-label\">Location</span>\r\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\r\n </div>\r\n </div>\r\n <p class=\"tc-description\" *ngIf=\"exp.comments\">{{ exp.comments }}</p>\r\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\r\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\r\n {{ exp.fileName }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\r\n Add More\r\n </button>\r\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#fff;color:#69707d;border:1.5px solid #e2e8f0;padding:10px 22px}button.secondary:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex;gap:0}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-icon{width:34px;height:34px;border-radius:8px;background:#ebf2f9;color:#4077ad;display:flex;align-items:center;justify-content:center;flex-shrink:0}.cred-icon--license{background:#f3f0ff;color:#7c3aed}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:13px;font-weight:700;color:#1e293b;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:11px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.job-title{color:#69707d;font-weight:400;font-size:14px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.row{flex-direction:column;gap:12px}.right-actions{gap:8px;flex-direction:column-reverse}.detail-grid{grid-template-columns:1fr}.actions,.action{gap:8px;display:flex;flex-direction:column-reverse}.add-btn{width:unset}.actions{margin:48px 0 20px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"] }]
9023
+ args: [{ selector: 'app-education', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!showpreview()\">\n <div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Add Education</h3>\n <p class=\"step-card-subtitle\">Please list your educational history from GED to college degree</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n <form [formGroup]=\"educationForm\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Degree Information</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">General Equivalency Diploma / Degree <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your Diploma here\" formControlName=\"courseName\" />\n <small class=\"error\" *ngIf=\"educationForm.get('courseName')?.touched &&\n educationForm.get('courseName')?.hasError('required')\">\n Degree is required\n </small>\n </div>\n <div class=\"field\">\n <div class=\"head\">Diploma / Degree Type <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your Diploma / Degree Type\" formControlName=\"courseType\" />\n <small class=\"error\" *ngIf=\"educationForm.get('courseType')?.touched &&\n educationForm.get('courseType')?.hasError('required')\">\n Diploma / Degree Type is required\n </small>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <div class=\"head\">Institution Name <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter institution name here\" formControlName=\"instituteName\" />\n <small class=\"error\" *ngIf=\"educationForm.get('instituteName')?.touched &&\n educationForm.get('instituteName')?.hasError('required')\">\n Institution name is required\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Location &amp; Timeline</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\n &nbsp;{{ item.country }}\n </ng-template>\n </ng-select>\n </div>\n <div class=\"field\">\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\n placeholder=\"Select State\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\n &nbsp;{{ item.stateName }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n </div>\n <div class=\"row form-row\">\n <div class=\"field city\">\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\n <small class=\"error\" *ngIf=\"educationForm.get('city')?.touched &&\n educationForm.get('city')?.hasError('required')\">\n Enter City\n </small>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" [maxDate]=\"maxDate\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !educationForm.get('startDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"startDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"educationForm.get('startDate')?.touched &&\n educationForm.get('startDate')?.hasError('required')\">\n Start Date is required\n </small>\n </div>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !educationForm.get('endDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"endDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"educationForm.get('endDate')?.touched &&\n educationForm.get('endDate')?.hasError('required')\">\n To Date is required\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Additional Details</div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"comments\"></textarea>\n </div>\n </div>\n </div>\n\n </form>\n\n <div class=\"upload-wrapper\">\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your diploma, degree certificate, or transcript (PDF, DOC, DOCX)</p>\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\n Upload Document\n </button>\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\n <p class=\"file-name\" *ngIf=\"fileName\">\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\n {{ fileName }}\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\n </p>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\n </button>\n <div class=\"right-actions\">\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\n class=\"secondary\" (click)=\"nextStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\n (click)=\"saveFile()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<!-- Success Toast -->\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\n <div class=\"step-toast-icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"step-toast-body\">\n <div class=\"step-toast-title\">Saved Successfully</div>\n <div class=\"step-toast-msg\">Education record has been saved.</div>\n </div>\n <div class=\"step-toast-progress\"></div>\n</div>\n\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\n <div class=\"preview-header\">\n <div class=\"preview-header-icon\">\n <img src=\"/assets/images/icons/mortarboard-fill.svg\" alt=\"education\" width=\"20\" height=\"20\" />\n </div>\n <div>\n <h3 class=\"preview-header-title\">Education</h3>\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\n </div>\n </div>\n\n <div class=\"preview-timeline\">\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\n class=\"timeline-entry\" [class.last]=\"last\">\n <div class=\"timeline-track\">\n <div class=\"timeline-dot\"></div>\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\n </div>\n <div class=\"timeline-card\">\n <div class=\"tc-head\">\n <div class=\"tc-avatar\">{{ (exp.instituteName || exp.courseName || '?').charAt(0).toUpperCase() }}</div>\n <div class=\"tc-title-block\">\n <span class=\"tc-title\">{{ exp.courseName }}</span>\n <span class=\"tc-subtitle\">{{ exp.instituteName }}</span>\n </div>\n <div class=\"tc-actions\">\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n </button>\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-item\" *ngIf=\"exp.courseType\">\n <span class=\"detail-label\">Degree Type</span>\n <span class=\"detail-value\">{{ exp.courseType }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.startDate || exp.endDate\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{ exp.startDate | date:'MMM yyyy' }}{{ exp.endDate ? ' \u2013 ' + (exp.endDate | date:'MMM yyyy') : '' }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\n <span class=\"detail-label\">Location</span>\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\n </div>\n </div>\n <p class=\"tc-description\" *ngIf=\"exp.comments\">{{ exp.comments }}</p>\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\n {{ exp.fileName }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\n Add More\n </button>\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#fff;color:#69707d;border:1.5px solid #e2e8f0;padding:10px 22px}button.secondary:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex;gap:0}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-icon{width:34px;height:34px;border-radius:8px;background:#ebf2f9;color:#4077ad;display:flex;align-items:center;justify-content:center;flex-shrink:0}.cred-icon--license{background:#f3f0ff;color:#7c3aed}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:13px;font-weight:700;color:#1e293b;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:11px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.job-title{color:#69707d;font-weight:400;font-size:14px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.row{flex-direction:column;gap:12px}.right-actions{gap:8px;flex-direction:column-reverse}.detail-grid{grid-template-columns:1fr}.actions,.action{gap:8px;display:flex;flex-direction:column-reverse}.add-btn{width:unset}.actions{margin:48px 0 20px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"] }]
9024
9024
  }], ctorParameters: () => [{ type: i1$3.RoleContextService }, { type: UserEducationService }, { type: UserService }, { type: CredentialingStore }, { type: EducationStore }, { type: CountryServices }, { type: PostalCodeServices }, { type: i1$3.TokenService }, { type: i7.FormBuilder }, { type: FileService }, { type: i1.HttpClient }], propDecorators: { providerId: [{
9025
9025
  type: Input
9026
9026
  }], providerName: [{
@@ -9578,7 +9578,7 @@ class CertificationComponent {
9578
9578
  };
9579
9579
  if (this.editingIndex >= 0) {
9580
9580
  this.userDocumentService
9581
- .updateUserDocument([apiPayload])
9581
+ .updateUserDocument(apiPayload)
9582
9582
  .subscribe({
9583
9583
  next: (res) => {
9584
9584
  if (res?.failed) {
@@ -9603,7 +9603,7 @@ class CertificationComponent {
9603
9603
  }
9604
9604
  else {
9605
9605
  this.userDocumentService
9606
- .createUserDocument([apiPayload])
9606
+ .createUserDocument(apiPayload)
9607
9607
  .subscribe({
9608
9608
  next: (res) => {
9609
9609
  if (res?.failed) {
@@ -11135,7 +11135,7 @@ class LicensesComponent {
11135
11135
  };
11136
11136
  if (this.editingIndex >= 0) {
11137
11137
  this.userDocumentService
11138
- .updateUserDocument([apiPayload])
11138
+ .updateUserDocument(apiPayload)
11139
11139
  .subscribe({
11140
11140
  next: (res) => {
11141
11141
  if (res?.failed) {
@@ -11160,7 +11160,7 @@ class LicensesComponent {
11160
11160
  }
11161
11161
  else {
11162
11162
  this.userDocumentService
11163
- .createUserDocument([apiPayload])
11163
+ .createUserDocument(apiPayload)
11164
11164
  .subscribe({
11165
11165
  next: (res) => {
11166
11166
  if (res?.failed) {
@@ -11249,11 +11249,11 @@ class LicensesComponent {
11249
11249
  this.fileName = '';
11250
11250
  }
11251
11251
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: LicensesComponent, deps: [{ token: UserDocumentService }, { token: UserService }, { token: i1$3.RoleContextService }, { token: CredentialingStore }, { token: LicenseStore }, { token: i1$3.TokenService }, { token: PostalCodeServices }, { token: i7.FormBuilder }, { token: FileService }], target: i0.ɵɵFactoryTarget.Component });
11252
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: LicensesComponent, isStandalone: false, selector: "app-licenses", inputs: { providerId: "providerId", providerName: "providerName", cloudfrontUrl: "cloudfrontUrl", roleData: "roleData", states: "states" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!showpreview()\">\r\n <div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Add Licenses</h3>\r\n <p class=\"step-card-subtitle\">Recommended for your role</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">License Type <span class=\"text-danger\">*</span></div>\r\n <div class=\"search-part\">\r\n <input type=\"text\" placeholder=\"Search / Add License type here...\" [formControl]=\"searchControl\" />\r\n <button class=\"btn\" type=\"button\" (click)=\"addManualDocumentType()\" tooltip=\"Add manually\">\r\n <img src=\"/assets/images/icons/plus.svg\" alt=\"add\" class=\"create-plus\" width=\"18\" height=\"18\" />\r\n </button>\r\n </div>\r\n <div *ngIf=\"manualTypeError\" class=\"invalid-feedback is-invalid d-block mb-2\">{{ manualTypeError }}</div>\r\n <div class=\"doc-type-chips\">\r\n <label class=\"doc-type-chip\" *ngFor=\"let item of documentTypes\"\r\n [class.selected]=\"isChecked(item.id)\"\r\n [attr.for]=\"'doc_' + item.id\">\r\n <input type=\"checkbox\" [id]=\"'doc_' + item.id\" [checked]=\"isChecked(item.id)\"\r\n (change)=\"toggleSelection(item, $event)\" />\r\n <svg *ngIf=\"isChecked(item.id)\" class=\"chip-check-icon\" width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n {{ item.type }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"certificateForm\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">License Details</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">License Number</div>\r\n <input type=\"text\" placeholder=\"Enter your License Number here\" formControlName=\"number\" />\r\n <small class=\"error\" *ngIf=\"certificateForm.get('number')?.touched &&\r\n certificateForm.get('number')?.hasError('required')\">\r\n License number is required\r\n </small>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">License Issued By</div>\r\n <input type=\"text\" placeholder=\"Enter License Issued By here\" formControlName=\"issuedBy\" />\r\n <small class=\"error\" *ngIf=\"certificateForm.get('issuedBy')?.touched &&\r\n certificateForm.get('issuedBy')?.hasError('required')\">\r\n License issued by is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Issued State</div>\r\n <ng-select formControlName=\"issuedState\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\r\n placeholder=\"Select Issued State\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\r\n &nbsp;{{ item.stateName }}\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Dates</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Issued Date</div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Issued On\" [maxDate]=\"maxDate\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true, showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !certificateForm.get('issueDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"issueDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"certificateForm.get('issueDate')?.touched &&\r\n certificateForm.get('issueDate')?.hasError('required')\">\r\n Issued date is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Expiration Date</div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Expired On\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !certificateForm.get('expiryDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"expiryDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"certificateForm.get('expiryDate')?.touched &&\r\n certificateForm.get('expiryDate')?.hasError('required')\">\r\n Expiry date is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Additional Notes</div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"notes\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n <div class=\"upload-wrapper\">\r\n <p *ngIf=\"!fileName\" class=\"upload-title\">License Document</p>\r\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\r\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your license document or proof of licensure (PDF, DOC, DOCX)</p>\r\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\r\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\r\n Upload Document\r\n </button>\r\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\r\n <p class=\"file-name\" *ngIf=\"fileName\">\r\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\r\n {{ fileName }}\r\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\r\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\r\n </button>\r\n <div class=\"right-actions\">\r\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\" class=\"secondary\"\r\n (click)=\"nextStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\r\n (click)=\"saveFile()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Success Toast -->\r\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\r\n <div class=\"step-toast-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"step-toast-body\">\r\n <div class=\"step-toast-title\">Saved Successfully</div>\r\n <div class=\"step-toast-msg\">License has been saved.</div>\r\n </div>\r\n <div class=\"step-toast-progress\"></div>\r\n</div>\r\n\r\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\r\n <div class=\"preview-header\">\r\n <div class=\"preview-header-icon\">\r\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"20\" height=\"20\" />\r\n </div>\r\n <div>\r\n <h3 class=\"preview-header-title\">Licenses</h3>\r\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} license{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cred-grid\">\r\n <div *ngFor=\"let exp of workStore.experiences(); let i = index\" class=\"cred-card\">\r\n <div class=\"cred-card-body\">\r\n <div class=\"cred-head\">\r\n <div class=\"cred-avatar cred-avatar--license\">{{ (exp.documentTypeName || '?').charAt(0).toUpperCase() }}</div>\r\n <div class=\"cred-title-block\">\r\n <span class=\"cred-name\">{{ exp.documentTypeName }}</span>\r\n <span class=\"cred-issuer\" *ngIf=\"exp.issuedBy\">{{ exp.issuedBy }}</span>\r\n </div>\r\n <div class=\"cred-top-actions\">\r\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\r\n </button>\r\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"detail-row\">\r\n <div class=\"detail-item\" *ngIf=\"exp.number\">\r\n <span class=\"detail-label\">License Number</span>\r\n <span class=\"detail-value\">{{ exp.number }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.issuedState\">\r\n <span class=\"detail-label\">Issued State</span>\r\n <span class=\"detail-value\">{{ exp.issuedState | stateName }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.issueDate\">\r\n <span class=\"detail-label\">Issued Date</span>\r\n <span class=\"detail-value\">{{ exp.issueDate | date:'MMM d, yyyy' }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.expiryDate\">\r\n <span class=\"detail-label\">Expiry Date</span>\r\n <span class=\"detail-value\">{{ exp.expiryDate | date:'MMM d, yyyy' }}</span>\r\n </div>\r\n </div>\r\n\r\n <p class=\"tc-description\" *ngIf=\"exp.notes\">{{ exp.notes }}</p>\r\n\r\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\r\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\r\n {{ exp.fileName }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\r\n Add More\r\n </button>\r\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.document-container{max-width:1100px;margin:auto}.search-part{width:100%;max-width:400px;position:relative;border-radius:8px;border:1.5px solid #e2e8f0;padding:0 0 0 14px;display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;height:42px;background:#f9fafb;transition:all .2s ease}.search-part:focus-within{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f}.search-part input{flex:1;color:#1e293b;font-size:14px;font-weight:400;border:none;background:none;outline:none;height:100%;padding:0}.search-part input::placeholder{color:#69707d}.search-part .btn{background:#4077ad;border-radius:0 5px 5px 0;padding:0;width:42px;height:40px;min-width:unset;display:flex;align-items:center;justify-content:center;border:none;cursor:pointer;transition:all .2s ease}.search-part .btn:hover{background:#2d5a8a}.search-part .btn img{filter:brightness(0) invert(1);width:16px;height:16px}.search-input{width:100%;max-width:400px;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box;outline:none;margin-bottom:16px}.search-input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.search-input::placeholder{color:#69707d}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.card{display:flex;align-items:center;min-height:48px}.checkbox{margin-top:4px;accent-color:#4077AD}.checkbox-row{display:flex;align-items:center;gap:8px;cursor:pointer;background:#fff;border:1.5px solid #e2e8f0;border-radius:8px;padding:10px 12px;transition:all .2s ease;width:100%}.checkbox-row:hover{border-color:#4077ad;background:#ebf2f9}.checkbox-row input{margin:0;accent-color:#4077AD}.content .title{font-weight:600;font-size:14px;color:#1e293b}.title{font-size:14px;font-weight:600;color:#1e293b}.content .desc{font-size:12px;color:#69707d;margin-top:4px}.save-btn{height:42px;margin-top:20px;padding:10px 22px;border-radius:5px;border:none;background:#4077ad;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.save-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.save-btn:active{transform:translateY(0)}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-avatar{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.cred-avatar--license{background:linear-gradient(135deg,#4077ad,#5b21b6)}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:16px;font-weight:700;color:#4077ad;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:12px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 1024px){.grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 600px){.grid{grid-template-columns:1fr}.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.hint{margin-bottom:7px}.date-time-filter{font-size:14px}.search-input{margin-bottom:0;max-width:100%}.right-actions{gap:8px}.detail-grid{grid-template-columns:1fr}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.actions{flex-direction:column-reverse;gap:8px;margin:24px 0 20px}.right-actions{gap:8px;flex-direction:column-reverse}.add-btn{width:unset}.action{display:flex;flex-direction:column-reverse;gap:8px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "directive", type: i13.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
11252
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: LicensesComponent, isStandalone: false, selector: "app-licenses", inputs: { providerId: "providerId", providerName: "providerName", cloudfrontUrl: "cloudfrontUrl", roleData: "roleData", states: "states" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!showpreview()\">\n <div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Add Licenses</h3>\n <p class=\"step-card-subtitle\">Recommended for your role</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">License Type <span class=\"text-danger\">*</span></div>\n <div class=\"search-part\">\n <input type=\"text\" placeholder=\"Search / Add License type here...\" [formControl]=\"searchControl\" />\n <button class=\"btn\" type=\"button\" (click)=\"addManualDocumentType()\" tooltip=\"Add manually\">\n <img src=\"/assets/images/icons/plus.svg\" alt=\"add\" class=\"create-plus\" width=\"18\" height=\"18\" />\n </button>\n </div>\n <div *ngIf=\"manualTypeError\" class=\"invalid-feedback is-invalid d-block mb-2\">{{ manualTypeError }}</div>\n <div class=\"doc-type-chips\">\n <label class=\"doc-type-chip\" *ngFor=\"let item of documentTypes\"\n [class.selected]=\"isChecked(item.id)\"\n [attr.for]=\"'doc_' + item.id\">\n <input type=\"checkbox\" [id]=\"'doc_' + item.id\" [checked]=\"isChecked(item.id)\"\n (change)=\"toggleSelection(item, $event)\" />\n <svg *ngIf=\"isChecked(item.id)\" class=\"chip-check-icon\" width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ item.type }}\n </label>\n </div>\n </div>\n\n <form [formGroup]=\"certificateForm\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">License Details</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">License Number</div>\n <input type=\"text\" placeholder=\"Enter your License Number here\" formControlName=\"number\" />\n <small class=\"error\" *ngIf=\"certificateForm.get('number')?.touched &&\n certificateForm.get('number')?.hasError('required')\">\n License number is required\n </small>\n </div>\n <div class=\"field\">\n <div class=\"head\">License Issued By</div>\n <input type=\"text\" placeholder=\"Enter License Issued By here\" formControlName=\"issuedBy\" />\n <small class=\"error\" *ngIf=\"certificateForm.get('issuedBy')?.touched &&\n certificateForm.get('issuedBy')?.hasError('required')\">\n License issued by is required\n </small>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Issued State</div>\n <ng-select formControlName=\"issuedState\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\n placeholder=\"Select Issued State\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\n &nbsp;{{ item.stateName }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Dates</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Issued Date</div>\n <input class=\"form-control date-time-filter\" placeholder=\"Issued On\" [maxDate]=\"maxDate\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true, showWeekNumbers: false, isAnimated: true,\n customTodayClass: !certificateForm.get('issueDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"issueDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"certificateForm.get('issueDate')?.touched &&\n certificateForm.get('issueDate')?.hasError('required')\">\n Issued date is required\n </small>\n </div>\n </div>\n <div class=\"field\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Expiration Date</div>\n <input class=\"form-control date-time-filter\" placeholder=\"Expired On\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !certificateForm.get('expiryDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"expiryDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"certificateForm.get('expiryDate')?.touched &&\n certificateForm.get('expiryDate')?.hasError('required')\">\n Expiry date is required\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Additional Notes</div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"notes\"></textarea>\n </div>\n </div>\n </div>\n\n </form>\n\n <div class=\"upload-wrapper\">\n <p *ngIf=\"!fileName\" class=\"upload-title\">License Document</p>\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your license document or proof of licensure (PDF, DOC, DOCX)</p>\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\n Upload Document\n </button>\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\n <p class=\"file-name\" *ngIf=\"fileName\">\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\n {{ fileName }}\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\n </p>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\n </button>\n <div class=\"right-actions\">\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\" class=\"secondary\"\n (click)=\"nextStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\n (click)=\"saveFile()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<!-- Success Toast -->\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\n <div class=\"step-toast-icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"step-toast-body\">\n <div class=\"step-toast-title\">Saved Successfully</div>\n <div class=\"step-toast-msg\">License has been saved.</div>\n </div>\n <div class=\"step-toast-progress\"></div>\n</div>\n\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\n <div class=\"preview-header\">\n <div class=\"preview-header-icon\">\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"20\" height=\"20\" />\n </div>\n <div>\n <h3 class=\"preview-header-title\">Licenses</h3>\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} license{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\n </div>\n </div>\n\n <div class=\"cred-grid\">\n <div *ngFor=\"let exp of workStore.experiences(); let i = index\" class=\"cred-card\">\n <div class=\"cred-card-body\">\n <div class=\"cred-head\">\n <div class=\"cred-avatar cred-avatar--license\">{{ (exp.documentTypeName || '?').charAt(0).toUpperCase() }}</div>\n <div class=\"cred-title-block\">\n <span class=\"cred-name\">{{ exp.documentTypeName }}</span>\n <span class=\"cred-issuer\" *ngIf=\"exp.issuedBy\">{{ exp.issuedBy }}</span>\n </div>\n <div class=\"cred-top-actions\">\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n </button>\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n </div>\n\n <div class=\"detail-row\">\n <div class=\"detail-item\" *ngIf=\"exp.number\">\n <span class=\"detail-label\">License Number</span>\n <span class=\"detail-value\">{{ exp.number }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.issuedState\">\n <span class=\"detail-label\">Issued State</span>\n <span class=\"detail-value\">{{ exp.issuedState | stateName }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.issueDate\">\n <span class=\"detail-label\">Issued Date</span>\n <span class=\"detail-value\">{{ exp.issueDate | date:'MMM d, yyyy' }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.expiryDate\">\n <span class=\"detail-label\">Expiry Date</span>\n <span class=\"detail-value\">{{ exp.expiryDate | date:'MMM d, yyyy' }}</span>\n </div>\n </div>\n\n <p class=\"tc-description\" *ngIf=\"exp.notes\">{{ exp.notes }}</p>\n\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\n {{ exp.fileName }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\n Add More\n </button>\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.document-container{max-width:1100px;margin:auto}.search-part{width:100%;max-width:400px;position:relative;border-radius:8px;border:1.5px solid #e2e8f0;padding:0 0 0 14px;display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;height:42px;background:#f9fafb;transition:all .2s ease}.search-part:focus-within{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f}.search-part input{flex:1;color:#1e293b;font-size:14px;font-weight:400;border:none;background:none;outline:none;height:100%;padding:0}.search-part input::placeholder{color:#69707d}.search-part .btn{background:#4077ad;border-radius:0 5px 5px 0;padding:0;width:42px;height:40px;min-width:unset;display:flex;align-items:center;justify-content:center;border:none;cursor:pointer;transition:all .2s ease}.search-part .btn:hover{background:#2d5a8a}.search-part .btn img{filter:brightness(0) invert(1);width:16px;height:16px}.search-input{width:100%;max-width:400px;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box;outline:none;margin-bottom:16px}.search-input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.search-input::placeholder{color:#69707d}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.card{display:flex;align-items:center;min-height:48px}.checkbox{margin-top:4px;accent-color:#4077AD}.checkbox-row{display:flex;align-items:center;gap:8px;cursor:pointer;background:#fff;border:1.5px solid #e2e8f0;border-radius:8px;padding:10px 12px;transition:all .2s ease;width:100%}.checkbox-row:hover{border-color:#4077ad;background:#ebf2f9}.checkbox-row input{margin:0;accent-color:#4077AD}.content .title{font-weight:600;font-size:14px;color:#1e293b}.title{font-size:14px;font-weight:600;color:#1e293b}.content .desc{font-size:12px;color:#69707d;margin-top:4px}.save-btn{height:42px;margin-top:20px;padding:10px 22px;border-radius:5px;border:none;background:#4077ad;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.save-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.save-btn:active{transform:translateY(0)}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-avatar{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.cred-avatar--license{background:linear-gradient(135deg,#4077ad,#5b21b6)}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:16px;font-weight:700;color:#4077ad;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:12px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 1024px){.grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 600px){.grid{grid-template-columns:1fr}.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.hint{margin-bottom:7px}.date-time-filter{font-size:14px}.search-input{margin-bottom:0;max-width:100%}.right-actions{gap:8px}.detail-grid{grid-template-columns:1fr}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.actions{flex-direction:column-reverse;gap:8px;margin:24px 0 20px}.right-actions{gap:8px;flex-direction:column-reverse}.add-btn{width:unset}.action{display:flex;flex-direction:column-reverse;gap:8px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "directive", type: i13.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
11253
11253
  }
11254
11254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: LicensesComponent, decorators: [{
11255
11255
  type: Component,
11256
- args: [{ selector: 'app-licenses', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!showpreview()\">\r\n <div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Add Licenses</h3>\r\n <p class=\"step-card-subtitle\">Recommended for your role</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">License Type <span class=\"text-danger\">*</span></div>\r\n <div class=\"search-part\">\r\n <input type=\"text\" placeholder=\"Search / Add License type here...\" [formControl]=\"searchControl\" />\r\n <button class=\"btn\" type=\"button\" (click)=\"addManualDocumentType()\" tooltip=\"Add manually\">\r\n <img src=\"/assets/images/icons/plus.svg\" alt=\"add\" class=\"create-plus\" width=\"18\" height=\"18\" />\r\n </button>\r\n </div>\r\n <div *ngIf=\"manualTypeError\" class=\"invalid-feedback is-invalid d-block mb-2\">{{ manualTypeError }}</div>\r\n <div class=\"doc-type-chips\">\r\n <label class=\"doc-type-chip\" *ngFor=\"let item of documentTypes\"\r\n [class.selected]=\"isChecked(item.id)\"\r\n [attr.for]=\"'doc_' + item.id\">\r\n <input type=\"checkbox\" [id]=\"'doc_' + item.id\" [checked]=\"isChecked(item.id)\"\r\n (change)=\"toggleSelection(item, $event)\" />\r\n <svg *ngIf=\"isChecked(item.id)\" class=\"chip-check-icon\" width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n {{ item.type }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"certificateForm\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">License Details</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">License Number</div>\r\n <input type=\"text\" placeholder=\"Enter your License Number here\" formControlName=\"number\" />\r\n <small class=\"error\" *ngIf=\"certificateForm.get('number')?.touched &&\r\n certificateForm.get('number')?.hasError('required')\">\r\n License number is required\r\n </small>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">License Issued By</div>\r\n <input type=\"text\" placeholder=\"Enter License Issued By here\" formControlName=\"issuedBy\" />\r\n <small class=\"error\" *ngIf=\"certificateForm.get('issuedBy')?.touched &&\r\n certificateForm.get('issuedBy')?.hasError('required')\">\r\n License issued by is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Issued State</div>\r\n <ng-select formControlName=\"issuedState\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\r\n placeholder=\"Select Issued State\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\r\n &nbsp;{{ item.stateName }}\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Dates</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Issued Date</div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Issued On\" [maxDate]=\"maxDate\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true, showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !certificateForm.get('issueDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"issueDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"certificateForm.get('issueDate')?.touched &&\r\n certificateForm.get('issueDate')?.hasError('required')\">\r\n Issued date is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Expiration Date</div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Expired On\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !certificateForm.get('expiryDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"expiryDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"certificateForm.get('expiryDate')?.touched &&\r\n certificateForm.get('expiryDate')?.hasError('required')\">\r\n Expiry date is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Additional Notes</div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"notes\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n <div class=\"upload-wrapper\">\r\n <p *ngIf=\"!fileName\" class=\"upload-title\">License Document</p>\r\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\r\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your license document or proof of licensure (PDF, DOC, DOCX)</p>\r\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\r\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\r\n Upload Document\r\n </button>\r\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\r\n <p class=\"file-name\" *ngIf=\"fileName\">\r\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\r\n {{ fileName }}\r\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\r\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\r\n </button>\r\n <div class=\"right-actions\">\r\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\" class=\"secondary\"\r\n (click)=\"nextStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\r\n (click)=\"saveFile()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Success Toast -->\r\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\r\n <div class=\"step-toast-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"step-toast-body\">\r\n <div class=\"step-toast-title\">Saved Successfully</div>\r\n <div class=\"step-toast-msg\">License has been saved.</div>\r\n </div>\r\n <div class=\"step-toast-progress\"></div>\r\n</div>\r\n\r\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\r\n <div class=\"preview-header\">\r\n <div class=\"preview-header-icon\">\r\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"20\" height=\"20\" />\r\n </div>\r\n <div>\r\n <h3 class=\"preview-header-title\">Licenses</h3>\r\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} license{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cred-grid\">\r\n <div *ngFor=\"let exp of workStore.experiences(); let i = index\" class=\"cred-card\">\r\n <div class=\"cred-card-body\">\r\n <div class=\"cred-head\">\r\n <div class=\"cred-avatar cred-avatar--license\">{{ (exp.documentTypeName || '?').charAt(0).toUpperCase() }}</div>\r\n <div class=\"cred-title-block\">\r\n <span class=\"cred-name\">{{ exp.documentTypeName }}</span>\r\n <span class=\"cred-issuer\" *ngIf=\"exp.issuedBy\">{{ exp.issuedBy }}</span>\r\n </div>\r\n <div class=\"cred-top-actions\">\r\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\r\n </button>\r\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"detail-row\">\r\n <div class=\"detail-item\" *ngIf=\"exp.number\">\r\n <span class=\"detail-label\">License Number</span>\r\n <span class=\"detail-value\">{{ exp.number }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.issuedState\">\r\n <span class=\"detail-label\">Issued State</span>\r\n <span class=\"detail-value\">{{ exp.issuedState | stateName }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.issueDate\">\r\n <span class=\"detail-label\">Issued Date</span>\r\n <span class=\"detail-value\">{{ exp.issueDate | date:'MMM d, yyyy' }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.expiryDate\">\r\n <span class=\"detail-label\">Expiry Date</span>\r\n <span class=\"detail-value\">{{ exp.expiryDate | date:'MMM d, yyyy' }}</span>\r\n </div>\r\n </div>\r\n\r\n <p class=\"tc-description\" *ngIf=\"exp.notes\">{{ exp.notes }}</p>\r\n\r\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\r\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\r\n {{ exp.fileName }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\r\n Add More\r\n </button>\r\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.document-container{max-width:1100px;margin:auto}.search-part{width:100%;max-width:400px;position:relative;border-radius:8px;border:1.5px solid #e2e8f0;padding:0 0 0 14px;display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;height:42px;background:#f9fafb;transition:all .2s ease}.search-part:focus-within{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f}.search-part input{flex:1;color:#1e293b;font-size:14px;font-weight:400;border:none;background:none;outline:none;height:100%;padding:0}.search-part input::placeholder{color:#69707d}.search-part .btn{background:#4077ad;border-radius:0 5px 5px 0;padding:0;width:42px;height:40px;min-width:unset;display:flex;align-items:center;justify-content:center;border:none;cursor:pointer;transition:all .2s ease}.search-part .btn:hover{background:#2d5a8a}.search-part .btn img{filter:brightness(0) invert(1);width:16px;height:16px}.search-input{width:100%;max-width:400px;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box;outline:none;margin-bottom:16px}.search-input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.search-input::placeholder{color:#69707d}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.card{display:flex;align-items:center;min-height:48px}.checkbox{margin-top:4px;accent-color:#4077AD}.checkbox-row{display:flex;align-items:center;gap:8px;cursor:pointer;background:#fff;border:1.5px solid #e2e8f0;border-radius:8px;padding:10px 12px;transition:all .2s ease;width:100%}.checkbox-row:hover{border-color:#4077ad;background:#ebf2f9}.checkbox-row input{margin:0;accent-color:#4077AD}.content .title{font-weight:600;font-size:14px;color:#1e293b}.title{font-size:14px;font-weight:600;color:#1e293b}.content .desc{font-size:12px;color:#69707d;margin-top:4px}.save-btn{height:42px;margin-top:20px;padding:10px 22px;border-radius:5px;border:none;background:#4077ad;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.save-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.save-btn:active{transform:translateY(0)}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-avatar{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.cred-avatar--license{background:linear-gradient(135deg,#4077ad,#5b21b6)}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:16px;font-weight:700;color:#4077ad;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:12px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 1024px){.grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 600px){.grid{grid-template-columns:1fr}.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.hint{margin-bottom:7px}.date-time-filter{font-size:14px}.search-input{margin-bottom:0;max-width:100%}.right-actions{gap:8px}.detail-grid{grid-template-columns:1fr}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.actions{flex-direction:column-reverse;gap:8px;margin:24px 0 20px}.right-actions{gap:8px;flex-direction:column-reverse}.add-btn{width:unset}.action{display:flex;flex-direction:column-reverse;gap:8px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"] }]
11256
+ args: [{ selector: 'app-licenses', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!showpreview()\">\n <div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Add Licenses</h3>\n <p class=\"step-card-subtitle\">Recommended for your role</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">License Type <span class=\"text-danger\">*</span></div>\n <div class=\"search-part\">\n <input type=\"text\" placeholder=\"Search / Add License type here...\" [formControl]=\"searchControl\" />\n <button class=\"btn\" type=\"button\" (click)=\"addManualDocumentType()\" tooltip=\"Add manually\">\n <img src=\"/assets/images/icons/plus.svg\" alt=\"add\" class=\"create-plus\" width=\"18\" height=\"18\" />\n </button>\n </div>\n <div *ngIf=\"manualTypeError\" class=\"invalid-feedback is-invalid d-block mb-2\">{{ manualTypeError }}</div>\n <div class=\"doc-type-chips\">\n <label class=\"doc-type-chip\" *ngFor=\"let item of documentTypes\"\n [class.selected]=\"isChecked(item.id)\"\n [attr.for]=\"'doc_' + item.id\">\n <input type=\"checkbox\" [id]=\"'doc_' + item.id\" [checked]=\"isChecked(item.id)\"\n (change)=\"toggleSelection(item, $event)\" />\n <svg *ngIf=\"isChecked(item.id)\" class=\"chip-check-icon\" width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ item.type }}\n </label>\n </div>\n </div>\n\n <form [formGroup]=\"certificateForm\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">License Details</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">License Number</div>\n <input type=\"text\" placeholder=\"Enter your License Number here\" formControlName=\"number\" />\n <small class=\"error\" *ngIf=\"certificateForm.get('number')?.touched &&\n certificateForm.get('number')?.hasError('required')\">\n License number is required\n </small>\n </div>\n <div class=\"field\">\n <div class=\"head\">License Issued By</div>\n <input type=\"text\" placeholder=\"Enter License Issued By here\" formControlName=\"issuedBy\" />\n <small class=\"error\" *ngIf=\"certificateForm.get('issuedBy')?.touched &&\n certificateForm.get('issuedBy')?.hasError('required')\">\n License issued by is required\n </small>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Issued State</div>\n <ng-select formControlName=\"issuedState\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\n placeholder=\"Select Issued State\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\n &nbsp;{{ item.stateName }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Dates</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Issued Date</div>\n <input class=\"form-control date-time-filter\" placeholder=\"Issued On\" [maxDate]=\"maxDate\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true, showWeekNumbers: false, isAnimated: true,\n customTodayClass: !certificateForm.get('issueDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"issueDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"certificateForm.get('issueDate')?.touched &&\n certificateForm.get('issueDate')?.hasError('required')\">\n Issued date is required\n </small>\n </div>\n </div>\n <div class=\"field\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Expiration Date</div>\n <input class=\"form-control date-time-filter\" placeholder=\"Expired On\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !certificateForm.get('expiryDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"expiryDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"certificateForm.get('expiryDate')?.touched &&\n certificateForm.get('expiryDate')?.hasError('required')\">\n Expiry date is required\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Additional Notes</div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <textarea placeholder=\"Comments or additional notes\" formControlName=\"notes\"></textarea>\n </div>\n </div>\n </div>\n\n </form>\n\n <div class=\"upload-wrapper\">\n <p *ngIf=\"!fileName\" class=\"upload-title\">License Document</p>\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your license document or proof of licensure (PDF, DOC, DOCX)</p>\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\n Upload Document\n </button>\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\n <p class=\"file-name\" *ngIf=\"fileName\">\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\n {{ fileName }}\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\n </p>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\n </button>\n <div class=\"right-actions\">\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\" class=\"secondary\"\n (click)=\"nextStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\n (click)=\"saveFile()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<!-- Success Toast -->\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\n <div class=\"step-toast-icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"step-toast-body\">\n <div class=\"step-toast-title\">Saved Successfully</div>\n <div class=\"step-toast-msg\">License has been saved.</div>\n </div>\n <div class=\"step-toast-progress\"></div>\n</div>\n\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\n <div class=\"preview-header\">\n <div class=\"preview-header-icon\">\n <img src=\"/assets/images/icons/card-checklist.svg\" alt=\"licenses\" width=\"20\" height=\"20\" />\n </div>\n <div>\n <h3 class=\"preview-header-title\">Licenses</h3>\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} license{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\n </div>\n </div>\n\n <div class=\"cred-grid\">\n <div *ngFor=\"let exp of workStore.experiences(); let i = index\" class=\"cred-card\">\n <div class=\"cred-card-body\">\n <div class=\"cred-head\">\n <div class=\"cred-avatar cred-avatar--license\">{{ (exp.documentTypeName || '?').charAt(0).toUpperCase() }}</div>\n <div class=\"cred-title-block\">\n <span class=\"cred-name\">{{ exp.documentTypeName }}</span>\n <span class=\"cred-issuer\" *ngIf=\"exp.issuedBy\">{{ exp.issuedBy }}</span>\n </div>\n <div class=\"cred-top-actions\">\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n </button>\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n </div>\n\n <div class=\"detail-row\">\n <div class=\"detail-item\" *ngIf=\"exp.number\">\n <span class=\"detail-label\">License Number</span>\n <span class=\"detail-value\">{{ exp.number }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.issuedState\">\n <span class=\"detail-label\">Issued State</span>\n <span class=\"detail-value\">{{ exp.issuedState | stateName }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.issueDate\">\n <span class=\"detail-label\">Issued Date</span>\n <span class=\"detail-value\">{{ exp.issueDate | date:'MMM d, yyyy' }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.expiryDate\">\n <span class=\"detail-label\">Expiry Date</span>\n <span class=\"detail-value\">{{ exp.expiryDate | date:'MMM d, yyyy' }}</span>\n </div>\n </div>\n\n <p class=\"tc-description\" *ngIf=\"exp.notes\">{{ exp.notes }}</p>\n\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\n {{ exp.fileName }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\n Add More\n </button>\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input[type=text],input[type=email],input[type=number],input[type=password],select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input[type=text]:focus,input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input[type=text]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input[type=text].is-invalid,input[type=email].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.action{display:flex;justify-content:space-between;margin:48px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.document-container{max-width:1100px;margin:auto}.search-part{width:100%;max-width:400px;position:relative;border-radius:8px;border:1.5px solid #e2e8f0;padding:0 0 0 14px;display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;height:42px;background:#f9fafb;transition:all .2s ease}.search-part:focus-within{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f}.search-part input{flex:1;color:#1e293b;font-size:14px;font-weight:400;border:none;background:none;outline:none;height:100%;padding:0}.search-part input::placeholder{color:#69707d}.search-part .btn{background:#4077ad;border-radius:0 5px 5px 0;padding:0;width:42px;height:40px;min-width:unset;display:flex;align-items:center;justify-content:center;border:none;cursor:pointer;transition:all .2s ease}.search-part .btn:hover{background:#2d5a8a}.search-part .btn img{filter:brightness(0) invert(1);width:16px;height:16px}.search-input{width:100%;max-width:400px;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box;outline:none;margin-bottom:16px}.search-input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.search-input::placeholder{color:#69707d}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.card{display:flex;align-items:center;min-height:48px}.checkbox{margin-top:4px;accent-color:#4077AD}.checkbox-row{display:flex;align-items:center;gap:8px;cursor:pointer;background:#fff;border:1.5px solid #e2e8f0;border-radius:8px;padding:10px 12px;transition:all .2s ease;width:100%}.checkbox-row:hover{border-color:#4077ad;background:#ebf2f9}.checkbox-row input{margin:0;accent-color:#4077AD}.content .title{font-weight:600;font-size:14px;color:#1e293b}.title{font-size:14px;font-weight:600;color:#1e293b}.content .desc{font-size:12px;color:#69707d;margin-top:4px}.save-btn{height:42px;margin-top:20px;padding:10px 22px;border-radius:5px;border:none;background:#4077ad;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.save-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.save-btn:active{transform:translateY(0)}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.cred-grid{display:grid;gap:14px;margin-bottom:28px}.cred-card{display:flex;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;background:#fff;transition:box-shadow .18s ease,transform .18s ease}.cred-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.cred-card-body{flex:1;padding:15px 16px;min-width:0}.cred-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cred-avatar{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.cred-avatar--license{background:linear-gradient(135deg,#4077ad,#5b21b6)}.cred-title-block{flex:1;min-width:0}.cred-name{display:block;font-size:16px;font-weight:700;color:#4077ad;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-issuer{display:block;font-size:12px;color:#69707d;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cred-top-actions{display:flex;gap:2px;flex-shrink:0}.cred-meta-row{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.cred-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.cred-date-item{display:flex;flex-direction:column;gap:2px}.cred-date-label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#69707d}.cred-date-sep{font-size:12px;color:#69707d;align-self:flex-end;padding-bottom:3px}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 1024px){.grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 600px){.grid{grid-template-columns:1fr}.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.hint{margin-bottom:7px}.date-time-filter{font-size:14px}.search-input{margin-bottom:0;max-width:100%}.right-actions{gap:8px}.detail-grid{grid-template-columns:1fr}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.actions{flex-direction:column-reverse;gap:8px;margin:24px 0 20px}.right-actions{gap:8px;flex-direction:column-reverse}.add-btn{width:unset}.action{display:flex;flex-direction:column-reverse;gap:8px}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"] }]
11257
11257
  }], ctorParameters: () => [{ type: UserDocumentService }, { type: UserService }, { type: i1$3.RoleContextService }, { type: CredentialingStore }, { type: LicenseStore }, { type: i1$3.TokenService }, { type: PostalCodeServices }, { type: i7.FormBuilder }, { type: FileService }], propDecorators: { providerId: [{
11258
11258
  type: Input
11259
11259
  }], providerName: [{
@@ -13090,11 +13090,11 @@ class RoleSelectComponent {
13090
13090
  this.store.previousStep();
13091
13091
  }
13092
13092
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RoleSelectComponent, deps: [{ token: CredentialingStore }, { token: ProvidersService }, { token: UserService }, { token: i2.Router }, { token: IndustryService }, { token: UserDetailService }, { token: FileService }, { token: i1$3.TokenService }, { token: i1$3.RoleContextService }, { token: FrontEndProvidersService }, { token: i7.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
13093
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: RoleSelectComponent, isStandalone: false, selector: "app-role-select", inputs: { roleData: "roleData", cloudfrontUrl: "cloudfrontUrl", providerId: "providerId", providerName: "providerName" }, outputs: { backToParent: "backToParent", providerSaved: "providerSaved" }, ngImport: i0, template: "<div class=\"role-selection-container\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- NON-PROVIDER LAYOUT -->\r\n <ng-container *ngIf=\"roleData?.role?.name !== 'Provider'\">\r\n <h2>Basic Details</h2>\r\n <p class=\"note\">We need basic information and a headshot for your profile</p>\r\n <div class=\"profile-field\">\r\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\r\n <div class=\"spinner-border\"></div>\r\n </div>\r\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\r\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\r\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\r\n <div *ngIf=\" u?.firstName?.invalid &&\r\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\r\n First Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.lastName.invalid &&\r\n (u.lastName.touched || u.lastName.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\r\n Last Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.email.invalid && (u.email.touched || u.email.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.email.invalid &&\r\n (u.email.touched || u.email.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\r\n Email is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\r\n Please enter a valid email address\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\r\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\r\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\r\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\r\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.address1.invalid &&\r\n (u.address1.touched || u.address1.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\r\n Home Address 1 is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.city.invalid && (u.city.touched || u.city.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.city.invalid &&\r\n (u.city.touched || u.city.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\r\n City is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\r\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.state.invalid && (u.state.touched || u.state.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.state.invalid &&\r\n (u.state.touched || u.state.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\r\n State is required\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\r\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.zipcode.invalid &&\r\n (u.zipcode.touched || u.zipcode.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\r\n Zipcode is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.country.invalid && (u.country.touched || u.country.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.country.invalid &&\r\n (u.country.touched || u.country.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\r\n Country is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\r\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\r\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\r\n Phone Number is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\r\n Phone Number must be 10 digits\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\r\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\r\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\r\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\r\n id=\"yearsOfExperince\"></ng-select>\r\n <div *ngIf=\" u.yearsOfExperince.invalid &&\r\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\r\n Years Of Experience is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\r\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\r\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\r\n </ng-select>\r\n <div *ngIf=\" u.userJobTitle.invalid &&\r\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\r\n Job title is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\r\n <label class=\"note-label mb-2\">Profile image</label>\r\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\r\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\r\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\r\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\r\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Industry</label>\r\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\r\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <span class=\"form-check\">\r\n <span class=\"form-check-input-wrapper\">\r\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\r\n </span>\r\n {{ item.industryName }}\r\n </span>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"form-group col-sm-12 col-md-4\">\r\n <div class=\"image-wrapper\">\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\r\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\r\n <div>{{ userError }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"primary ct-btn\" [disabled]=\"showLoader\" [ng2-loading]=\"showLoader\"\r\n (click)=\"saveFinal()\">\r\n Continue\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- PROVIDER LAYOUT: one card with Business Information + User Information -->\r\n <ng-container *ngIf=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- Business Information -->\r\n <h2>Business Information</h2>\r\n <p class=\"note\">We need company information</p>\r\n <div class=\"profile-field\">\r\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\r\n <div class=\"spinner-border\"></div>\r\n </div>\r\n <form *ngIf=\"isLoaded\" [formGroup]=\"companyForm\" class=\"form pb-0\">\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Company Name<span class=\"req\">*</span></label>\r\n <input [ngClass]=\"{ 'is-invalid': c.companyName.invalid && (c.companyName.touched || c.companyName.dirty) }\"\r\n type=\"text\" class=\"form-control\" placeholder=\"Company Name\" formControlName=\"companyName\" id=\"companyName\">\r\n <div *ngIf=\" c.companyName.invalid &&\r\n (c.companyName.touched || c.companyName.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"c.companyName.errors.required\">\r\n Company Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Company Phone Number<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control block shadow-none\" id=\"inputPhone\" name=\"inputPhone\"\r\n placeholder=\"Phone Number\" autocomplete=\"off\" formControlName=\"companyPhoneNumber\" maxlength=\"14\"\r\n (input)=\"phoneMask($event, 'company')\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.companyPhoneNumber.invalid &&\r\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.companyPhoneNumber.invalid &&\r\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.required\">\r\n Company Phone Number is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.pattern\">\r\n Company Phone Number must be 10 digits\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Address 1<span class=\"req\">*</span></label>\r\n <im-address-verify-field formControlName=\"address1\" inputId=\"companyAddress1\" placeholder=\"Home Address 1\"\r\n [options]=\"options\" [invalid]=\"c.address1.invalid && (c.address1.touched || c.address1.dirty)\"\r\n [initialLat]=\"c.latitude.value\" [initialLng]=\"c.longitude.value\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.address1.invalid &&\r\n (c.address1.touched || c.address1.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.address1.errors?.required\">\r\n Home Address 1 is required\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.city.invalid && (c.city.touched || c.city.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.city.invalid &&\r\n (c.city.touched || c.city.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.city.errors?.required\">\r\n City is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.state.invalid && (c.state.touched || c.state.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.state.invalid &&\r\n (c.state.touched || c.state.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.state.errors?.required\">\r\n State is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\r\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.zipcode.invalid && (c.zipcode.touched || c.zipcode.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.zipcode.invalid &&\r\n (c.zipcode.touched || c.zipcode.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.zipcode.errors?.required\">\r\n Zipcode is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n c.country.invalid && (c.country.touched || c.country.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.country.invalid &&\r\n (c.country.touched || c.country.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.country.errors?.required\">\r\n Country is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\r\n <label class=\"note-label mb-2\">Company Logo</label>\r\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploacompanyImage($event)\" class=\"d-none\" />\r\n <input [(ngModel)]=\"fileNameCompany\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\"\r\n class=\"form-control pe-5\" placeholder=\"Upload Company Logo\" (click)=\"uploadFile.click()\" />\r\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n <img *ngIf=\"!isLogoLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\r\n <div *ngIf=\"isLogoLoading\" class=\"upload-spinner\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-sm-12 col-md-4\">\r\n <div class=\"image-wrapper\">\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewCompanyUrl\">\r\n <img [src]=\"previewCompanyUrl\" class=\"preview-image mt-2\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoImage(); uploadFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!-- User Information -->\r\n <h2 style=\"margin-top: 30px;\">User Information</h2>\r\n <p class=\"note\">We need basic information and a headshot for your profile</p>\r\n <div class=\"profile-field\">\r\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\r\n <div class=\"spinner-border\"></div>\r\n </div>\r\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\r\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\r\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\r\n <div *ngIf=\" u?.firstName?.invalid &&\r\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\r\n First Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.lastName.invalid &&\r\n (u.lastName.touched || u.lastName.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\r\n Last Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.email.invalid && (u.email.touched || u.email.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.email.invalid &&\r\n (u.email.touched || u.email.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\r\n Email is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\r\n Please enter a valid email address\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\r\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\r\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\r\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\r\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.address1.invalid &&\r\n (u.address1.touched || u.address1.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\r\n Home Address 1 is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.city.invalid && (u.city.touched || u.city.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.city.invalid &&\r\n (u.city.touched || u.city.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\r\n City is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\r\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.state.invalid && (u.state.touched || u.state.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.state.invalid &&\r\n (u.state.touched || u.state.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\r\n State is required\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\r\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.zipcode.invalid &&\r\n (u.zipcode.touched || u.zipcode.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\r\n Zipcode is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.country.invalid && (u.country.touched || u.country.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.country.invalid &&\r\n (u.country.touched || u.country.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\r\n Country is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\r\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\r\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\r\n Phone Number is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\r\n Phone Number must be 10 digits\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\r\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\r\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\r\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\r\n id=\"yearsOfExperince\"></ng-select>\r\n <div *ngIf=\" u.yearsOfExperince.invalid &&\r\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\r\n Years Of Experience is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\r\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\r\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\r\n </ng-select>\r\n <div *ngIf=\" u.userJobTitle.invalid &&\r\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\r\n Job title is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\r\n <label class=\"note-label mb-2\">Profile image</label>\r\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\r\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\r\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\r\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\r\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Industry</label>\r\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\r\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <span class=\"form-check\">\r\n <span class=\"form-check-input-wrapper\">\r\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\r\n </span>\r\n {{ item.industryName }}\r\n </span>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"form-group col-sm-12 col-md-4\">\r\n <div class=\"image-wrapper\">\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\r\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\r\n <div>{{ userError }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"primary ct-btn\"\r\n [disabled]=\"showLoader || companyForm.invalid || userForm.invalid\"\r\n [ng2-loading]=\"showLoader\"\r\n (click)=\"saveFinal()\">\r\n Continue\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n</div>\r\n", styles: [".provider-layout{display:flex;flex-direction:column}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.provider-company-first{order:-1}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.preview-image{width:250px;height:100px;object-fit:contain;margin-top:5px;border-radius:8px;border:1px solid #e2e8f0}.upload-icon-resume{position:absolute;right:25px;top:17px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon-resume:hover{opacity:1}.upload-icon{position:absolute;right:25px;top:45px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon:hover{opacity:1}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-top:3px;font-size:14px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{font-size:14px;color:#69707d}::ng-deep .custom-ng-select.ng-select-multiple .ng-select-container{min-height:42px!important;height:auto!important;display:flex;align-items:center;overflow:visible!important}::ng-deep .custom-ng-select.ng-select-multiple .ng-value-container{flex-wrap:wrap!important;overflow:visible!important;padding-top:2px;padding-bottom:2px}::ng-deep .custom-ng-select.ng-select-multiple .ng-value{margin-bottom:4px}::ng-deep .custom-ng-select.ng-select-multiple .ng-arrow-wrapper{display:flex;align-items:center;height:100%}:host ::ng-deep .custom-ng-select .ng-select-container{padding:0!important;font-size:14px!important}::ng-deep .job-title-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .job-title-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}::ng-deep .industry-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .industry-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}.form-control{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box}.form-control:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.form-control::placeholder{color:#69707d}.form-control.is-invalid{border-color:#ef4444}::ng-deep im-address-verify-field .im-avf__input{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease}::ng-deep im-address-verify-field .im-avf__input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}::ng-deep im-address-verify-field .im-avf__input.is-invalid{border-color:#ef4444}.role-selection-container{max-width:950px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.role-selection-container h2{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.role-selection-container .note{font-size:14px;color:#69707d;margin-bottom:20px}.role-selection-container .note-label{font-size:13px;font-weight:700;color:#69707d;letter-spacing:.05em;padding-left:0;display:block;margin-bottom:6px}.role-selection-container .note-label .req{color:#ef4444}.role-selection-container .dropdown-wrapper{display:flex;gap:8px;margin-bottom:16px}.role-selection-container .dropdown-wrapper select{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease}.role-selection-container .dropdown-wrapper select:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.role-selection-container .dropdown-wrapper .add-btn{height:42px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .dropdown-wrapper .add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .dropdown-wrapper .add-btn:active{transform:translateY(0)}.role-selection-container .dropdown-wrapper .add-btn:disabled{background:#69707d;cursor:not-allowed;transform:none}.role-selection-container .selected-roles{display:flex;flex-direction:column;gap:8px;margin-bottom:20px}.role-selection-container .selected-roles .role-card{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-radius:8px;background:#ebf2f9;border:1px solid rgba(64,119,173,.2);color:#2d5a8a}.role-selection-container .selected-roles .role-card .remove-btn{background:none;border:none;font-size:1.1rem;font-weight:700;cursor:pointer;color:#ef4444;min-width:auto;height:auto;padding:0 4px;transition:all .2s ease}.role-selection-container .selected-roles .role-card .remove-btn:hover{opacity:.75}.role-selection-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.role-selection-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.role-selection-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .navigation-buttons .next:active{transform:translateY(0)}.role-selection-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.image-wrapper{position:relative;width:150px;height:150px}.resume-wrapper{position:relative;width:550px;height:1px}.upload-spinner{position:absolute;right:25px;top:45px;width:18px;height:18px;display:flex;align-items:center;justify-content:center}.spinner-resume{width:36px;height:36px;border:3px solid #e2e8f0;border-top:3px solid #4077AD;border-radius:50%;position:absolute;top:-32%;left:99%;margin-top:-51px;margin-left:-20px;animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.profile-field{margin-top:-10px}.profile-field input{line-height:30px}.producer-type-container{max-width:1000px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.producer-type-container h2{font-size:20px;font-weight:700;color:#1e293b;margin-bottom:4px}.producer-type-container p{font-size:14px;color:#69707d;margin-bottom:20px}.producer-type-container .job-list{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.producer-type-container .job-list .job-item{padding:12px 16px;font-size:15px;border:1.5px solid #e2e8f0;border-radius:8px;cursor:pointer;display:flex;align-items:center;gap:8px;background:#fff;color:#1e293b;transition:all .2s ease;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .job-list .job-item:hover{border-color:#4077ad;background:#ebf2f9}.producer-type-container .job-list .job-item.selected{border-color:#4077ad;background:#ebf2f9;color:#2d5a8a;font-weight:600}.producer-type-container .job-list .job-item .plus{font-weight:700;color:#4077ad}.producer-type-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin:40px 0}.producer-type-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.producer-type-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .navigation-buttons .next:active{transform:translateY(0)}.producer-type-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.actions{display:flex;justify-content:space-between;margin:48px 0 28px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}@media screen and (max-width: 767px){h2{font-size:18px}select,.form-control{font-size:16px}.actions{margin:16px 0;flex-direction:column-reverse;gap:8px}.res{flex-direction:column-reverse}.upload-spinner{right:20px;top:45px}.spinner-resume{width:24px;height:24px;top:-22%;left:32%}.ct-btn{width:100%;margin-top:32px}button,.resume-wrapper{width:100%}.role-selection-container .navigation-buttons,.producer-type-container .navigation-buttons{margin-top:24px;margin-bottom:16px}}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "directive", type: MaskedInputDirective, selector: "[textMask]", inputs: ["textMask"], exportAs: ["textMask"] }, { kind: "component", type: AddressVerifyFieldComponent, selector: "im-address-verify-field", inputs: ["placeholder", "options", "maxLength", "inputId", "name", "autocompleteAttr", "inputClass", "invalid", "inputStyle", "initialLat", "initialLng"], outputs: ["addressResolved", "manualEdit"] }] });
13093
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: RoleSelectComponent, isStandalone: false, selector: "app-role-select", inputs: { roleData: "roleData", cloudfrontUrl: "cloudfrontUrl", providerId: "providerId", providerName: "providerName" }, outputs: { backToParent: "backToParent", providerSaved: "providerSaved" }, ngImport: i0, template: "<div class=\"role-selection-container\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\n\n <!-- NON-PROVIDER LAYOUT -->\n <ng-container *ngIf=\"roleData?.role?.name !== 'Provider'\">\n <h2>Basic Details</h2>\n <p class=\"note\">We need basic information and a headshot for your profile</p>\n <div class=\"profile-field\">\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\n <div class=\"spinner-border\"></div>\n </div>\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\n <div *ngIf=\" u?.firstName?.invalid &&\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\n First Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\n [ngClass]=\"{\n 'is-invalid':\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.lastName.invalid &&\n (u.lastName.touched || u.lastName.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\n Last Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\n 'is-invalid':\n u.email.invalid && (u.email.touched || u.email.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.email.invalid &&\n (u.email.touched || u.email.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\n Email is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\n Please enter a valid email address\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\n (addressResolved)=\"onUserAddressResolved($event)\"\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\n <div class=\"invalid-feedback\" *ngIf=\"\n u.address1.invalid &&\n (u.address1.touched || u.address1.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\n Home Address 1 is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\n 'is-invalid':\n u.city.invalid && (u.city.touched || u.city.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.city.invalid &&\n (u.city.touched || u.city.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\n City is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\n 'is-invalid':\n u.state.invalid && (u.state.touched || u.state.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.state.invalid &&\n (u.state.touched || u.state.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\n State is required\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\n 'is-invalid':\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.zipcode.invalid &&\n (u.zipcode.touched || u.zipcode.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\n Zipcode is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\n [ngClass]=\"{\n 'is-invalid':\n u.country.invalid && (u.country.touched || u.country.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.country.invalid &&\n (u.country.touched || u.country.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\n Country is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\n 'is-invalid':\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\n Phone Number is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\n Phone Number must be 10 digits\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\n id=\"yearsOfExperince\"></ng-select>\n <div *ngIf=\" u.yearsOfExperince.invalid &&\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\n Years Of Experience is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\n </ng-select>\n <div *ngIf=\" u.userJobTitle.invalid &&\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\n Job title is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\n <label class=\"note-label mb-2\">Profile image</label>\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Industry</label>\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <span class=\"form-check\">\n <span class=\"form-check-input-wrapper\">\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\n </span>\n {{ item.industryName }}\n </span>\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n <div class=\"form-group col-sm-12 col-md-4\">\n <div class=\"image-wrapper\">\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\n </button>\n </div>\n </div>\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\n <div>{{ userError }}</div>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"primary ct-btn\" [disabled]=\"showLoader\" [ng2-loading]=\"showLoader\"\n (click)=\"saveFinal()\">\n Continue\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- PROVIDER LAYOUT: one card with Business Information + User Information -->\n <ng-container *ngIf=\"roleData?.role?.name === 'Provider'\">\n\n <!-- Business Information -->\n <h2>Business Information</h2>\n <p class=\"note\">We need company information</p>\n <div class=\"profile-field\">\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\n <div class=\"spinner-border\"></div>\n </div>\n <form *ngIf=\"isLoaded\" [formGroup]=\"companyForm\" class=\"form pb-0\">\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Company Name<span class=\"req\">*</span></label>\n <input [ngClass]=\"{ 'is-invalid': c.companyName.invalid && (c.companyName.touched || c.companyName.dirty) }\"\n type=\"text\" class=\"form-control\" placeholder=\"Company Name\" formControlName=\"companyName\" id=\"companyName\">\n <div *ngIf=\" c.companyName.invalid &&\n (c.companyName.touched || c.companyName.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"c.companyName.errors.required\">\n Company Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Company Phone Number<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control block shadow-none\" id=\"inputPhone\" name=\"inputPhone\"\n placeholder=\"Phone Number\" autocomplete=\"off\" formControlName=\"companyPhoneNumber\" maxlength=\"14\"\n (input)=\"phoneMask($event, 'company')\" [ngClass]=\"{\n 'is-invalid':\n c.companyPhoneNumber.invalid &&\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.companyPhoneNumber.invalid &&\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.required\">\n Company Phone Number is required\n </div>\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.pattern\">\n Company Phone Number must be 10 digits\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Address 1<span class=\"req\">*</span></label>\n <im-address-verify-field formControlName=\"address1\" inputId=\"companyAddress1\" placeholder=\"Home Address 1\"\n [options]=\"options\" [invalid]=\"c.address1.invalid && (c.address1.touched || c.address1.dirty)\"\n [initialLat]=\"c.latitude.value\" [initialLng]=\"c.longitude.value\"\n (addressResolved)=\"onCompanyAddressResolved($event)\"\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\n <div class=\"invalid-feedback\" *ngIf=\"\n c.address1.invalid &&\n (c.address1.touched || c.address1.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.address1.errors?.required\">\n Home Address 1 is required\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\n 'is-invalid':\n c.city.invalid && (c.city.touched || c.city.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.city.invalid &&\n (c.city.touched || c.city.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.city.errors?.required\">\n City is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\n 'is-invalid':\n c.state.invalid && (c.state.touched || c.state.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.state.invalid &&\n (c.state.touched || c.state.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.state.errors?.required\">\n State is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\n 'is-invalid':\n c.zipcode.invalid && (c.zipcode.touched || c.zipcode.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.zipcode.invalid &&\n (c.zipcode.touched || c.zipcode.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.zipcode.errors?.required\">\n Zipcode is required\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\n [ngClass]=\"{\n 'is-invalid':\n c.country.invalid && (c.country.touched || c.country.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.country.invalid &&\n (c.country.touched || c.country.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.country.errors?.required\">\n Country is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\n <label class=\"note-label mb-2\">Company Logo</label>\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploacompanyImage($event)\" class=\"d-none\" />\n <input [(ngModel)]=\"fileNameCompany\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\"\n class=\"form-control pe-5\" placeholder=\"Upload Company Logo\" (click)=\"uploadFile.click()\" />\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\n <img *ngIf=\"!isLogoLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\n <div *ngIf=\"isLogoLoading\" class=\"upload-spinner\">\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\n </div>\n </div>\n <div class=\"form-group col-sm-12 col-md-4\">\n <div class=\"image-wrapper\">\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewCompanyUrl\">\n <img [src]=\"previewCompanyUrl\" class=\"preview-image mt-2\" />\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoImage(); uploadFile.value=''\" title=\"Remove file\">\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n\n <!-- User Information -->\n <h2 style=\"margin-top: 30px;\">User Information</h2>\n <p class=\"note\">We need basic information and a headshot for your profile</p>\n <div class=\"profile-field\">\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\n <div class=\"spinner-border\"></div>\n </div>\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\n <div *ngIf=\" u?.firstName?.invalid &&\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\n First Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\n [ngClass]=\"{\n 'is-invalid':\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.lastName.invalid &&\n (u.lastName.touched || u.lastName.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\n Last Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\n 'is-invalid':\n u.email.invalid && (u.email.touched || u.email.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.email.invalid &&\n (u.email.touched || u.email.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\n Email is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\n Please enter a valid email address\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\n (addressResolved)=\"onUserAddressResolved($event)\"\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\n <div class=\"invalid-feedback\" *ngIf=\"\n u.address1.invalid &&\n (u.address1.touched || u.address1.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\n Home Address 1 is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\n 'is-invalid':\n u.city.invalid && (u.city.touched || u.city.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.city.invalid &&\n (u.city.touched || u.city.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\n City is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\n 'is-invalid':\n u.state.invalid && (u.state.touched || u.state.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.state.invalid &&\n (u.state.touched || u.state.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\n State is required\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\n 'is-invalid':\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.zipcode.invalid &&\n (u.zipcode.touched || u.zipcode.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\n Zipcode is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\n [ngClass]=\"{\n 'is-invalid':\n u.country.invalid && (u.country.touched || u.country.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.country.invalid &&\n (u.country.touched || u.country.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\n Country is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\n 'is-invalid':\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\n Phone Number is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\n Phone Number must be 10 digits\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\n id=\"yearsOfExperince\"></ng-select>\n <div *ngIf=\" u.yearsOfExperince.invalid &&\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\n Years Of Experience is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\n </ng-select>\n <div *ngIf=\" u.userJobTitle.invalid &&\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\n Job title is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\n <label class=\"note-label mb-2\">Profile image</label>\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Industry</label>\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <span class=\"form-check\">\n <span class=\"form-check-input-wrapper\">\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\n </span>\n {{ item.industryName }}\n </span>\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n <div class=\"form-group col-sm-12 col-md-4\">\n <div class=\"image-wrapper\">\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\n </button>\n </div>\n </div>\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\n <div>{{ userError }}</div>\n </div>\n </div>\n </div>\n </form>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"primary ct-btn\"\n [disabled]=\"showLoader || companyForm.invalid || userForm.invalid\"\n [ng2-loading]=\"showLoader\"\n (click)=\"saveFinal()\">\n Continue\n </button>\n </div>\n </div>\n\n </ng-container>\n\n</div>\n", styles: [".provider-layout{display:flex;flex-direction:column}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.provider-company-first{order:-1}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.preview-image{width:250px;height:100px;object-fit:contain;margin-top:5px;border-radius:8px;border:1px solid #e2e8f0}.upload-icon-resume{position:absolute;right:25px;top:17px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon-resume:hover{opacity:1}.upload-icon{position:absolute;right:25px;top:45px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon:hover{opacity:1}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-top:3px;font-size:14px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{font-size:14px;color:#69707d}::ng-deep .custom-ng-select.ng-select-multiple .ng-select-container{min-height:42px!important;height:auto!important;display:flex;align-items:center;overflow:visible!important}::ng-deep .custom-ng-select.ng-select-multiple .ng-value-container{flex-wrap:wrap!important;overflow:visible!important;padding-top:2px;padding-bottom:2px}::ng-deep .custom-ng-select.ng-select-multiple .ng-value{margin-bottom:4px}::ng-deep .custom-ng-select.ng-select-multiple .ng-arrow-wrapper{display:flex;align-items:center;height:100%}:host ::ng-deep .custom-ng-select .ng-select-container{padding:0!important;font-size:14px!important}::ng-deep .job-title-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .job-title-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}::ng-deep .industry-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .industry-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}.form-control{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box}.form-control:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.form-control::placeholder{color:#69707d}.form-control.is-invalid{border-color:#ef4444}::ng-deep im-address-verify-field .im-avf__input{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease}::ng-deep im-address-verify-field .im-avf__input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}::ng-deep im-address-verify-field .im-avf__input.is-invalid{border-color:#ef4444}.role-selection-container{max-width:950px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.role-selection-container h2{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.role-selection-container .note{font-size:14px;color:#69707d;margin-bottom:20px}.role-selection-container .note-label{font-size:13px;font-weight:700;color:#69707d;letter-spacing:.05em;padding-left:0;display:block;margin-bottom:6px}.role-selection-container .note-label .req{color:#ef4444}.role-selection-container .dropdown-wrapper{display:flex;gap:8px;margin-bottom:16px}.role-selection-container .dropdown-wrapper select{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease}.role-selection-container .dropdown-wrapper select:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.role-selection-container .dropdown-wrapper .add-btn{height:42px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .dropdown-wrapper .add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .dropdown-wrapper .add-btn:active{transform:translateY(0)}.role-selection-container .dropdown-wrapper .add-btn:disabled{background:#69707d;cursor:not-allowed;transform:none}.role-selection-container .selected-roles{display:flex;flex-direction:column;gap:8px;margin-bottom:20px}.role-selection-container .selected-roles .role-card{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-radius:8px;background:#ebf2f9;border:1px solid rgba(64,119,173,.2);color:#2d5a8a}.role-selection-container .selected-roles .role-card .remove-btn{background:none;border:none;font-size:1.1rem;font-weight:700;cursor:pointer;color:#ef4444;min-width:auto;height:auto;padding:0 4px;transition:all .2s ease}.role-selection-container .selected-roles .role-card .remove-btn:hover{opacity:.75}.role-selection-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.role-selection-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.role-selection-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .navigation-buttons .next:active{transform:translateY(0)}.role-selection-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.image-wrapper{position:relative;width:150px;height:150px}.resume-wrapper{position:relative;width:550px;height:1px}.upload-spinner{position:absolute;right:25px;top:45px;width:18px;height:18px;display:flex;align-items:center;justify-content:center}.spinner-resume{width:36px;height:36px;border:3px solid #e2e8f0;border-top:3px solid #4077AD;border-radius:50%;position:absolute;top:-32%;left:99%;margin-top:-51px;margin-left:-20px;animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.profile-field{margin-top:-10px}.profile-field input{line-height:30px}.producer-type-container{max-width:1000px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.producer-type-container h2{font-size:20px;font-weight:700;color:#1e293b;margin-bottom:4px}.producer-type-container p{font-size:14px;color:#69707d;margin-bottom:20px}.producer-type-container .job-list{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.producer-type-container .job-list .job-item{padding:12px 16px;font-size:15px;border:1.5px solid #e2e8f0;border-radius:8px;cursor:pointer;display:flex;align-items:center;gap:8px;background:#fff;color:#1e293b;transition:all .2s ease;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .job-list .job-item:hover{border-color:#4077ad;background:#ebf2f9}.producer-type-container .job-list .job-item.selected{border-color:#4077ad;background:#ebf2f9;color:#2d5a8a;font-weight:600}.producer-type-container .job-list .job-item .plus{font-weight:700;color:#4077ad}.producer-type-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin:40px 0}.producer-type-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.producer-type-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .navigation-buttons .next:active{transform:translateY(0)}.producer-type-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.actions{display:flex;justify-content:space-between;margin:48px 0 28px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}@media screen and (max-width: 767px){h2{font-size:18px}select,.form-control{font-size:16px}.actions{margin:16px 0;flex-direction:column-reverse;gap:8px}.res{flex-direction:column-reverse}.upload-spinner{right:20px;top:45px}.spinner-resume{width:24px;height:24px;top:-22%;left:32%}.ct-btn{width:100%;margin-top:32px}button,.resume-wrapper{width:100%}.role-selection-container .navigation-buttons,.producer-type-container .navigation-buttons{margin-top:24px;margin-bottom:16px}}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "directive", type: MaskedInputDirective, selector: "[textMask]", inputs: ["textMask"], exportAs: ["textMask"] }, { kind: "component", type: AddressVerifyFieldComponent, selector: "im-address-verify-field", inputs: ["placeholder", "options", "maxLength", "inputId", "name", "autocompleteAttr", "inputClass", "invalid", "inputStyle", "initialLat", "initialLng"], outputs: ["addressResolved", "manualEdit"] }] });
13094
13094
  }
13095
13095
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RoleSelectComponent, decorators: [{
13096
13096
  type: Component,
13097
- args: [{ selector: 'app-role-select', standalone: false, template: "<div class=\"role-selection-container\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- NON-PROVIDER LAYOUT -->\r\n <ng-container *ngIf=\"roleData?.role?.name !== 'Provider'\">\r\n <h2>Basic Details</h2>\r\n <p class=\"note\">We need basic information and a headshot for your profile</p>\r\n <div class=\"profile-field\">\r\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\r\n <div class=\"spinner-border\"></div>\r\n </div>\r\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\r\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\r\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\r\n <div *ngIf=\" u?.firstName?.invalid &&\r\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\r\n First Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.lastName.invalid &&\r\n (u.lastName.touched || u.lastName.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\r\n Last Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.email.invalid && (u.email.touched || u.email.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.email.invalid &&\r\n (u.email.touched || u.email.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\r\n Email is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\r\n Please enter a valid email address\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\r\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\r\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\r\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\r\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.address1.invalid &&\r\n (u.address1.touched || u.address1.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\r\n Home Address 1 is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.city.invalid && (u.city.touched || u.city.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.city.invalid &&\r\n (u.city.touched || u.city.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\r\n City is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\r\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.state.invalid && (u.state.touched || u.state.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.state.invalid &&\r\n (u.state.touched || u.state.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\r\n State is required\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\r\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.zipcode.invalid &&\r\n (u.zipcode.touched || u.zipcode.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\r\n Zipcode is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.country.invalid && (u.country.touched || u.country.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.country.invalid &&\r\n (u.country.touched || u.country.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\r\n Country is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\r\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\r\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\r\n Phone Number is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\r\n Phone Number must be 10 digits\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\r\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\r\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\r\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\r\n id=\"yearsOfExperince\"></ng-select>\r\n <div *ngIf=\" u.yearsOfExperince.invalid &&\r\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\r\n Years Of Experience is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\r\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\r\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\r\n </ng-select>\r\n <div *ngIf=\" u.userJobTitle.invalid &&\r\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\r\n Job title is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\r\n <label class=\"note-label mb-2\">Profile image</label>\r\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\r\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\r\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\r\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\r\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Industry</label>\r\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\r\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <span class=\"form-check\">\r\n <span class=\"form-check-input-wrapper\">\r\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\r\n </span>\r\n {{ item.industryName }}\r\n </span>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"form-group col-sm-12 col-md-4\">\r\n <div class=\"image-wrapper\">\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\r\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\r\n <div>{{ userError }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"primary ct-btn\" [disabled]=\"showLoader\" [ng2-loading]=\"showLoader\"\r\n (click)=\"saveFinal()\">\r\n Continue\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- PROVIDER LAYOUT: one card with Business Information + User Information -->\r\n <ng-container *ngIf=\"roleData?.role?.name === 'Provider'\">\r\n\r\n <!-- Business Information -->\r\n <h2>Business Information</h2>\r\n <p class=\"note\">We need company information</p>\r\n <div class=\"profile-field\">\r\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\r\n <div class=\"spinner-border\"></div>\r\n </div>\r\n <form *ngIf=\"isLoaded\" [formGroup]=\"companyForm\" class=\"form pb-0\">\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Company Name<span class=\"req\">*</span></label>\r\n <input [ngClass]=\"{ 'is-invalid': c.companyName.invalid && (c.companyName.touched || c.companyName.dirty) }\"\r\n type=\"text\" class=\"form-control\" placeholder=\"Company Name\" formControlName=\"companyName\" id=\"companyName\">\r\n <div *ngIf=\" c.companyName.invalid &&\r\n (c.companyName.touched || c.companyName.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"c.companyName.errors.required\">\r\n Company Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Company Phone Number<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control block shadow-none\" id=\"inputPhone\" name=\"inputPhone\"\r\n placeholder=\"Phone Number\" autocomplete=\"off\" formControlName=\"companyPhoneNumber\" maxlength=\"14\"\r\n (input)=\"phoneMask($event, 'company')\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.companyPhoneNumber.invalid &&\r\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.companyPhoneNumber.invalid &&\r\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.required\">\r\n Company Phone Number is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.pattern\">\r\n Company Phone Number must be 10 digits\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Address 1<span class=\"req\">*</span></label>\r\n <im-address-verify-field formControlName=\"address1\" inputId=\"companyAddress1\" placeholder=\"Home Address 1\"\r\n [options]=\"options\" [invalid]=\"c.address1.invalid && (c.address1.touched || c.address1.dirty)\"\r\n [initialLat]=\"c.latitude.value\" [initialLng]=\"c.longitude.value\"\r\n (addressResolved)=\"onCompanyAddressResolved($event)\"\r\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.address1.invalid &&\r\n (c.address1.touched || c.address1.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.address1.errors?.required\">\r\n Home Address 1 is required\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.city.invalid && (c.city.touched || c.city.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.city.invalid &&\r\n (c.city.touched || c.city.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.city.errors?.required\">\r\n City is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.state.invalid && (c.state.touched || c.state.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.state.invalid &&\r\n (c.state.touched || c.state.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.state.errors?.required\">\r\n State is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\r\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\r\n 'is-invalid':\r\n c.zipcode.invalid && (c.zipcode.touched || c.zipcode.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.zipcode.invalid &&\r\n (c.zipcode.touched || c.zipcode.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.zipcode.errors?.required\">\r\n Zipcode is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n c.country.invalid && (c.country.touched || c.country.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n c.country.invalid &&\r\n (c.country.touched || c.country.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"c.country.errors?.required\">\r\n Country is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\r\n <label class=\"note-label mb-2\">Company Logo</label>\r\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploacompanyImage($event)\" class=\"d-none\" />\r\n <input [(ngModel)]=\"fileNameCompany\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\"\r\n class=\"form-control pe-5\" placeholder=\"Upload Company Logo\" (click)=\"uploadFile.click()\" />\r\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n <img *ngIf=\"!isLogoLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\r\n <div *ngIf=\"isLogoLoading\" class=\"upload-spinner\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-sm-12 col-md-4\">\r\n <div class=\"image-wrapper\">\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewCompanyUrl\">\r\n <img [src]=\"previewCompanyUrl\" class=\"preview-image mt-2\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoImage(); uploadFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!-- User Information -->\r\n <h2 style=\"margin-top: 30px;\">User Information</h2>\r\n <p class=\"note\">We need basic information and a headshot for your profile</p>\r\n <div class=\"profile-field\">\r\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\r\n <div class=\"spinner-border\"></div>\r\n </div>\r\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\r\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\r\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\r\n <div *ngIf=\" u?.firstName?.invalid &&\r\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\r\n First Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.lastName.invalid &&\r\n (u.lastName.touched || u.lastName.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\r\n Last Name is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.email.invalid && (u.email.touched || u.email.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.email.invalid &&\r\n (u.email.touched || u.email.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\r\n Email is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\r\n Please enter a valid email address\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\r\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\r\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\r\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\r\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\r\n (addressResolved)=\"onUserAddressResolved($event)\"\r\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.address1.invalid &&\r\n (u.address1.touched || u.address1.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\r\n Home Address 1 is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.city.invalid && (u.city.touched || u.city.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.city.invalid &&\r\n (u.city.touched || u.city.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\r\n City is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\r\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.state.invalid && (u.state.touched || u.state.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.state.invalid &&\r\n (u.state.touched || u.state.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\r\n State is required\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\r\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.zipcode.invalid &&\r\n (u.zipcode.touched || u.zipcode.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\r\n Zipcode is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n u.country.invalid && (u.country.touched || u.country.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.country.invalid &&\r\n (u.country.touched || u.country.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\r\n Country is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\r\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\r\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\r\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\r\n 'is-invalid':\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n }\" />\r\n <div class=\"invalid-feedback\" *ngIf=\"\r\n u.phoneNumber.invalid &&\r\n (u.phoneNumber.touched || u.phoneNumber.dirty)\r\n \">\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\r\n Phone Number is required\r\n </div>\r\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\r\n Phone Number must be 10 digits\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex flex-wrap justify-content-between row\">\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\r\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\r\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\r\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\r\n id=\"yearsOfExperince\"></ng-select>\r\n <div *ngIf=\" u.yearsOfExperince.invalid &&\r\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\r\n Years Of Experience is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\r\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\r\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\r\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\r\n </ng-select>\r\n <div *ngIf=\" u.userJobTitle.invalid &&\r\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\r\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\r\n Job title is required\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\r\n <label class=\"note-label mb-2\">Profile image</label>\r\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\r\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\r\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\r\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\r\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\r\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\r\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\r\n <label class=\"note-label mb-2\">Industry</label>\r\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\r\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\r\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <span class=\"form-check\">\r\n <span class=\"form-check-input-wrapper\">\r\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\r\n </span>\r\n {{ item.industryName }}\r\n </span>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"form-group col-sm-12 col-md-4\">\r\n <div class=\"image-wrapper\">\r\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\r\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\r\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\r\n <div>{{ userError }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"primary ct-btn\"\r\n [disabled]=\"showLoader || companyForm.invalid || userForm.invalid\"\r\n [ng2-loading]=\"showLoader\"\r\n (click)=\"saveFinal()\">\r\n Continue\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n</div>\r\n", styles: [".provider-layout{display:flex;flex-direction:column}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.provider-company-first{order:-1}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.preview-image{width:250px;height:100px;object-fit:contain;margin-top:5px;border-radius:8px;border:1px solid #e2e8f0}.upload-icon-resume{position:absolute;right:25px;top:17px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon-resume:hover{opacity:1}.upload-icon{position:absolute;right:25px;top:45px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon:hover{opacity:1}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-top:3px;font-size:14px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{font-size:14px;color:#69707d}::ng-deep .custom-ng-select.ng-select-multiple .ng-select-container{min-height:42px!important;height:auto!important;display:flex;align-items:center;overflow:visible!important}::ng-deep .custom-ng-select.ng-select-multiple .ng-value-container{flex-wrap:wrap!important;overflow:visible!important;padding-top:2px;padding-bottom:2px}::ng-deep .custom-ng-select.ng-select-multiple .ng-value{margin-bottom:4px}::ng-deep .custom-ng-select.ng-select-multiple .ng-arrow-wrapper{display:flex;align-items:center;height:100%}:host ::ng-deep .custom-ng-select .ng-select-container{padding:0!important;font-size:14px!important}::ng-deep .job-title-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .job-title-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}::ng-deep .industry-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .industry-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}.form-control{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box}.form-control:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.form-control::placeholder{color:#69707d}.form-control.is-invalid{border-color:#ef4444}::ng-deep im-address-verify-field .im-avf__input{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease}::ng-deep im-address-verify-field .im-avf__input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}::ng-deep im-address-verify-field .im-avf__input.is-invalid{border-color:#ef4444}.role-selection-container{max-width:950px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.role-selection-container h2{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.role-selection-container .note{font-size:14px;color:#69707d;margin-bottom:20px}.role-selection-container .note-label{font-size:13px;font-weight:700;color:#69707d;letter-spacing:.05em;padding-left:0;display:block;margin-bottom:6px}.role-selection-container .note-label .req{color:#ef4444}.role-selection-container .dropdown-wrapper{display:flex;gap:8px;margin-bottom:16px}.role-selection-container .dropdown-wrapper select{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease}.role-selection-container .dropdown-wrapper select:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.role-selection-container .dropdown-wrapper .add-btn{height:42px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .dropdown-wrapper .add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .dropdown-wrapper .add-btn:active{transform:translateY(0)}.role-selection-container .dropdown-wrapper .add-btn:disabled{background:#69707d;cursor:not-allowed;transform:none}.role-selection-container .selected-roles{display:flex;flex-direction:column;gap:8px;margin-bottom:20px}.role-selection-container .selected-roles .role-card{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-radius:8px;background:#ebf2f9;border:1px solid rgba(64,119,173,.2);color:#2d5a8a}.role-selection-container .selected-roles .role-card .remove-btn{background:none;border:none;font-size:1.1rem;font-weight:700;cursor:pointer;color:#ef4444;min-width:auto;height:auto;padding:0 4px;transition:all .2s ease}.role-selection-container .selected-roles .role-card .remove-btn:hover{opacity:.75}.role-selection-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.role-selection-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.role-selection-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .navigation-buttons .next:active{transform:translateY(0)}.role-selection-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.image-wrapper{position:relative;width:150px;height:150px}.resume-wrapper{position:relative;width:550px;height:1px}.upload-spinner{position:absolute;right:25px;top:45px;width:18px;height:18px;display:flex;align-items:center;justify-content:center}.spinner-resume{width:36px;height:36px;border:3px solid #e2e8f0;border-top:3px solid #4077AD;border-radius:50%;position:absolute;top:-32%;left:99%;margin-top:-51px;margin-left:-20px;animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.profile-field{margin-top:-10px}.profile-field input{line-height:30px}.producer-type-container{max-width:1000px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.producer-type-container h2{font-size:20px;font-weight:700;color:#1e293b;margin-bottom:4px}.producer-type-container p{font-size:14px;color:#69707d;margin-bottom:20px}.producer-type-container .job-list{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.producer-type-container .job-list .job-item{padding:12px 16px;font-size:15px;border:1.5px solid #e2e8f0;border-radius:8px;cursor:pointer;display:flex;align-items:center;gap:8px;background:#fff;color:#1e293b;transition:all .2s ease;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .job-list .job-item:hover{border-color:#4077ad;background:#ebf2f9}.producer-type-container .job-list .job-item.selected{border-color:#4077ad;background:#ebf2f9;color:#2d5a8a;font-weight:600}.producer-type-container .job-list .job-item .plus{font-weight:700;color:#4077ad}.producer-type-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin:40px 0}.producer-type-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.producer-type-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .navigation-buttons .next:active{transform:translateY(0)}.producer-type-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.actions{display:flex;justify-content:space-between;margin:48px 0 28px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}@media screen and (max-width: 767px){h2{font-size:18px}select,.form-control{font-size:16px}.actions{margin:16px 0;flex-direction:column-reverse;gap:8px}.res{flex-direction:column-reverse}.upload-spinner{right:20px;top:45px}.spinner-resume{width:24px;height:24px;top:-22%;left:32%}.ct-btn{width:100%;margin-top:32px}button,.resume-wrapper{width:100%}.role-selection-container .navigation-buttons,.producer-type-container .navigation-buttons{margin-top:24px;margin-bottom:16px}}\n"] }]
13097
+ args: [{ selector: 'app-role-select', standalone: false, template: "<div class=\"role-selection-container\" [class.provider-layout]=\"roleData?.role?.name === 'Provider'\">\n\n <!-- NON-PROVIDER LAYOUT -->\n <ng-container *ngIf=\"roleData?.role?.name !== 'Provider'\">\n <h2>Basic Details</h2>\n <p class=\"note\">We need basic information and a headshot for your profile</p>\n <div class=\"profile-field\">\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\n <div class=\"spinner-border\"></div>\n </div>\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\n <div *ngIf=\" u?.firstName?.invalid &&\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\n First Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\n [ngClass]=\"{\n 'is-invalid':\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.lastName.invalid &&\n (u.lastName.touched || u.lastName.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\n Last Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\n 'is-invalid':\n u.email.invalid && (u.email.touched || u.email.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.email.invalid &&\n (u.email.touched || u.email.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\n Email is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\n Please enter a valid email address\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\n (addressResolved)=\"onUserAddressResolved($event)\"\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\n <div class=\"invalid-feedback\" *ngIf=\"\n u.address1.invalid &&\n (u.address1.touched || u.address1.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\n Home Address 1 is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\n 'is-invalid':\n u.city.invalid && (u.city.touched || u.city.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.city.invalid &&\n (u.city.touched || u.city.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\n City is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\n 'is-invalid':\n u.state.invalid && (u.state.touched || u.state.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.state.invalid &&\n (u.state.touched || u.state.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\n State is required\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\n 'is-invalid':\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.zipcode.invalid &&\n (u.zipcode.touched || u.zipcode.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\n Zipcode is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\n [ngClass]=\"{\n 'is-invalid':\n u.country.invalid && (u.country.touched || u.country.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.country.invalid &&\n (u.country.touched || u.country.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\n Country is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\n 'is-invalid':\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\n Phone Number is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\n Phone Number must be 10 digits\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\n id=\"yearsOfExperince\"></ng-select>\n <div *ngIf=\" u.yearsOfExperince.invalid &&\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\n Years Of Experience is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\n </ng-select>\n <div *ngIf=\" u.userJobTitle.invalid &&\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\n Job title is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\n <label class=\"note-label mb-2\">Profile image</label>\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Industry</label>\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <span class=\"form-check\">\n <span class=\"form-check-input-wrapper\">\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\n </span>\n {{ item.industryName }}\n </span>\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n <div class=\"form-group col-sm-12 col-md-4\">\n <div class=\"image-wrapper\">\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\n </button>\n </div>\n </div>\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\n <div>{{ userError }}</div>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"primary ct-btn\" [disabled]=\"showLoader\" [ng2-loading]=\"showLoader\"\n (click)=\"saveFinal()\">\n Continue\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- PROVIDER LAYOUT: one card with Business Information + User Information -->\n <ng-container *ngIf=\"roleData?.role?.name === 'Provider'\">\n\n <!-- Business Information -->\n <h2>Business Information</h2>\n <p class=\"note\">We need company information</p>\n <div class=\"profile-field\">\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\n <div class=\"spinner-border\"></div>\n </div>\n <form *ngIf=\"isLoaded\" [formGroup]=\"companyForm\" class=\"form pb-0\">\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Company Name<span class=\"req\">*</span></label>\n <input [ngClass]=\"{ 'is-invalid': c.companyName.invalid && (c.companyName.touched || c.companyName.dirty) }\"\n type=\"text\" class=\"form-control\" placeholder=\"Company Name\" formControlName=\"companyName\" id=\"companyName\">\n <div *ngIf=\" c.companyName.invalid &&\n (c.companyName.touched || c.companyName.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"c.companyName.errors.required\">\n Company Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Company Phone Number<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control block shadow-none\" id=\"inputPhone\" name=\"inputPhone\"\n placeholder=\"Phone Number\" autocomplete=\"off\" formControlName=\"companyPhoneNumber\" maxlength=\"14\"\n (input)=\"phoneMask($event, 'company')\" [ngClass]=\"{\n 'is-invalid':\n c.companyPhoneNumber.invalid &&\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.companyPhoneNumber.invalid &&\n (c.companyPhoneNumber.touched || c.companyPhoneNumber.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.required\">\n Company Phone Number is required\n </div>\n <div class=\"ms-1\" *ngIf=\"c.companyPhoneNumber.errors?.pattern\">\n Company Phone Number must be 10 digits\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Address 1<span class=\"req\">*</span></label>\n <im-address-verify-field formControlName=\"address1\" inputId=\"companyAddress1\" placeholder=\"Home Address 1\"\n [options]=\"options\" [invalid]=\"c.address1.invalid && (c.address1.touched || c.address1.dirty)\"\n [initialLat]=\"c.latitude.value\" [initialLng]=\"c.longitude.value\"\n (addressResolved)=\"onCompanyAddressResolved($event)\"\n (manualEdit)=\"onCompanyAddressManualEdit()\"></im-address-verify-field>\n <div class=\"invalid-feedback\" *ngIf=\"\n c.address1.invalid &&\n (c.address1.touched || c.address1.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.address1.errors?.required\">\n Home Address 1 is required\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\n 'is-invalid':\n c.city.invalid && (c.city.touched || c.city.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.city.invalid &&\n (c.city.touched || c.city.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.city.errors?.required\">\n City is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\n 'is-invalid':\n c.state.invalid && (c.state.touched || c.state.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.state.invalid &&\n (c.state.touched || c.state.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.state.errors?.required\">\n State is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\n 'is-invalid':\n c.zipcode.invalid && (c.zipcode.touched || c.zipcode.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.zipcode.invalid &&\n (c.zipcode.touched || c.zipcode.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.zipcode.errors?.required\">\n Zipcode is required\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\n [ngClass]=\"{\n 'is-invalid':\n c.country.invalid && (c.country.touched || c.country.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n c.country.invalid &&\n (c.country.touched || c.country.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"c.country.errors?.required\">\n Country is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\n <label class=\"note-label mb-2\">Company Logo</label>\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploacompanyImage($event)\" class=\"d-none\" />\n <input [(ngModel)]=\"fileNameCompany\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\"\n class=\"form-control pe-5\" placeholder=\"Upload Company Logo\" (click)=\"uploadFile.click()\" />\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\n <img *ngIf=\"!isLogoLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\n <div *ngIf=\"isLogoLoading\" class=\"upload-spinner\">\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\n </div>\n </div>\n <div class=\"form-group col-sm-12 col-md-4\">\n <div class=\"image-wrapper\">\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewCompanyUrl\">\n <img [src]=\"previewCompanyUrl\" class=\"preview-image mt-2\" />\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeCompanyLogoImage(); uploadFile.value=''\" title=\"Remove file\">\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n\n <!-- User Information -->\n <h2 style=\"margin-top: 30px;\">User Information</h2>\n <p class=\"note\">We need basic information and a headshot for your profile</p>\n <div class=\"profile-field\">\n <div *ngIf=\"!isLoaded\" class=\"text-center p-4\">\n <div class=\"spinner-border\"></div>\n </div>\n <form *ngIf=\"isLoaded\" [formGroup]=\"userForm\" class=\"form pb-0\">\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">First Name<span class=\"req\">*</span></label>\n <input [ngClass]=\"{ 'is-invalid': u.firstName.invalid && (u.firstName.touched || u.firstName.dirty) }\"\n type=\"text\" class=\"form-control\" placeholder=\"First Name\" formControlName=\"firstName\" id=\"firstName\">\n <div *ngIf=\" u?.firstName?.invalid &&\n (u?.firstName?.touched || u?.firstName?.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.firstName.errors.required\">\n First Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2 mb-3\">Last Name<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Last Name\" formControlName=\"lastName\" id=\"lastName\"\n [ngClass]=\"{\n 'is-invalid':\n u.lastName.invalid && (u.lastName.touched || u.lastName.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.lastName.invalid &&\n (u.lastName.touched || u.lastName.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.lastName.errors?.required\">\n Last Name is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Email<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" placeholder=\"Email\" formControlName=\"email\" id=\"email\" [ngClass]=\"{\n 'is-invalid':\n u.email.invalid && (u.email.touched || u.email.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.email.invalid &&\n (u.email.touched || u.email.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.required\">\n Email is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.email.errors?.email\">\n Please enter a valid email address\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Home Address 1<span class=\"req\">*</span></label>\n <im-address-verify-field formControlName=\"address1\" inputId=\"address1\" [name]=\"'random-address-' + randomId\"\n autocompleteAttr=\"new-address-view\" placeholder=\"Home Address 1\" [options]=\"options\"\n [invalid]=\"u.address1.invalid && (u.address1.touched || u.address1.dirty)\"\n [initialLat]=\"u.latitude.value\" [initialLng]=\"u.longitude.value\"\n (addressResolved)=\"onUserAddressResolved($event)\"\n (manualEdit)=\"onUserAddressManualEdit()\"></im-address-verify-field>\n <div class=\"invalid-feedback\" *ngIf=\"\n u.address1.invalid &&\n (u.address1.touched || u.address1.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.address1.errors?.required\">\n Home Address 1 is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">City<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"City\" placeholder=\"City\" formControlName=\"city\" [ngClass]=\"{\n 'is-invalid':\n u.city.invalid && (u.city.touched || u.city.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.city.invalid &&\n (u.city.touched || u.city.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.city.errors?.required\">\n City is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">State<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-state-view\" name=\"random-state-{{randomId}}\" class=\"form-control\"\n id=\"State\" placeholder=\"State\" formControlName=\"state\" [ngClass]=\"{\n 'is-invalid':\n u.state.invalid && (u.state.touched || u.state.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.state.invalid &&\n (u.state.touched || u.state.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.state.errors?.required\">\n State is required\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Zip Code<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Zipcode\" placeholder=\"Zipcode\" formControlName=\"zipcode\"\n [textMask]=\"{ mask: zipcodeMask }\" [ngClass]=\"{\n 'is-invalid':\n u.zipcode.invalid && (u.zipcode.touched || u.zipcode.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.zipcode.invalid &&\n (u.zipcode.touched || u.zipcode.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.zipcode.errors?.required\">\n Zipcode is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Country<span class=\"req\">*</span></label>\n <input type=\"text\" class=\"form-control\" id=\"Country\" placeholder=\"Country\" formControlName=\"country\"\n [ngClass]=\"{\n 'is-invalid':\n u.country.invalid && (u.country.touched || u.country.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.country.invalid &&\n (u.country.touched || u.country.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.country.errors?.required\">\n Country is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Phone Number<span class=\"req\">*</span></label>\n <input type=\"text\" autocomplete=\"new-phone-view\" name=\"random-phone-{{randomId}}\"\n class=\"form-control block shadow-none\" id=\"inputPhone\" placeholder=\"Phone Number\" autocomplete=\"off\"\n formControlName=\"phoneNumber\" maxlength=\"14\" (input)=\"phoneMask($event, 'user')\" [ngClass]=\"{\n 'is-invalid':\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n }\" />\n <div class=\"invalid-feedback\" *ngIf=\"\n u.phoneNumber.invalid &&\n (u.phoneNumber.touched || u.phoneNumber.dirty)\n \">\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.required\">\n Phone Number is required\n </div>\n <div class=\"ms-1\" *ngIf=\"u.phoneNumber.errors?.pattern\">\n Phone Number must be 10 digits\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex flex-wrap justify-content-between row\">\n <div class=\"form-group col-md-4 col-sm-12 mt-3\">\n <label class=\"note-label mb-2\">Years of experience<span class=\"req\">*</span></label>\n <ng-select class=\"w-100\" [items]=\"expYears\" [searchable]=\"false\" [clearable]=\"false\" bindLabel=\"text\"\n formControlName=\"yearsOfExperince\" [ngClass]=\"{ 'is-invalid':u?.yearsOfExperince?.errors }\"\n bindValue=\"value\" [closeOnSelect]=\"true\" placeholder=\"Years of experience\"\n id=\"yearsOfExperince\"></ng-select>\n <div *ngIf=\" u.yearsOfExperince.invalid &&\n (u.yearsOfExperince.touched || u.yearsOfExperince.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.yearsOfExperince.errors.required\">\n Years Of Experience is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Job Title<span class=\"req\">*</span></label>\n <ng-select class=\"w-100 custom-ng-select job-title-select\" [items]=\"jobTitles\" bindLabel=\"text\" bindValue=\"value\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"false\"\n [ngClass]=\"{ 'is-invalid':u?.userJobTitle?.errors }\" id=\"userJobTitle\" [closeOnSelect]=\"false\"\n placeholder=\"Select Job Titles\" formControlName=\"userJobTitle\">\n </ng-select>\n <div *ngIf=\" u.userJobTitle.invalid &&\n (u.userJobTitle.touched || u.userJobTitle.dirty)\" class=\"invalid-feedback\">\n <div class=\"ms-1\" *ngIf=\"u.userJobTitle.errors.required\">\n Job title is required\n </div>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 position-relative\">\n <label class=\"note-label mb-2\">Profile image</label>\n <input #uploadFile type=\"file\" accept=\".png,.jpg,.jpeg\" (change)=\"uploadUserImage($event)\" class=\"d-none\" />\n <input [(ngModel)]=\"fileName\" [ngModelOptions]=\"{ standalone: true }\" readonly type=\"text\" class=\"form-control pe-5\"\n placeholder=\"Upload Profile Picture\" (click)=\"uploadFile.click()\" />\n <small class=\"text-muted d-block\" style=\"font-size: 12px;\">Allowed formats: PNG, JPG, JPEG</small>\n <img *ngIf=\"!isImageLoading\" src=\"/assets/images/icons/upload.svg\" alt=\"Upload\" class=\"upload-icon\" (click)=\"uploadFile.click()\" />\n <div *ngIf=\"isImageLoading\" class=\"upload-spinner\">\n <span class=\"spinner-border spinner-border-sm text-primary\"></span>\n </div>\n </div>\n <div class=\"form-group col-md-4 col-sm-12 mt-3 mb-2\">\n <label class=\"note-label mb-2\">Industry</label>\n <ng-select class=\"w-100 custom-ng-select industry-select\" formControlName=\"industries\" [items]=\"industries\"\n [multiple]=\"true\" [searchable]=\"false\" [clearable]=\"true\" bindLabel=\"industryName\" bindValue=\"id\"\n [closeOnSelect]=\"false\" id=\"industries\" placeholder=\"Select Industry\" [loading]=\"isIndustriesLoading\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <span class=\"form-check\">\n <span class=\"form-check-input-wrapper\">\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\n </span>\n {{ item.industryName }}\n </span>\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.industryName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n <div class=\"form-group col-sm-12 col-md-4\">\n <div class=\"image-wrapper\">\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"previewUrl\">\n <img [src]=\"cloudfrontUrl+previewUrl\" class=\"preview-image mt-2\" />\n <button type=\"button\" class=\"btn btn-link btn-sm p-0\" (click)=\"removeUserImage(); uploadFile.value=''\" title=\"Remove file\">\n <img src=\"/assets/images/icons/delete.png\" class=\"remove-file-icon\" alt=\"Remove\" />\n </button>\n </div>\n </div>\n <div *ngIf=\"userError\" class=\"invalid-feedback\">\n <div>{{ userError }}</div>\n </div>\n </div>\n </div>\n </form>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">Back</button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"primary ct-btn\"\n [disabled]=\"showLoader || companyForm.invalid || userForm.invalid\"\n [ng2-loading]=\"showLoader\"\n (click)=\"saveFinal()\">\n Continue\n </button>\n </div>\n </div>\n\n </ng-container>\n\n</div>\n", styles: [".provider-layout{display:flex;flex-direction:column}.remove-file-icon{width:16px;height:16px;object-fit:contain;cursor:pointer;vertical-align:middle;filter:brightness(0) saturate(100%) invert(24%) sepia(79%) saturate(4008%) hue-rotate(344deg) brightness(91%) contrast(90%)}.provider-company-first{order:-1}.section-locked{pointer-events:none;opacity:.45;filter:blur(1.5px);-webkit-user-select:none;user-select:none}.preview-image{width:250px;height:100px;object-fit:contain;margin-top:5px;border-radius:8px;border:1px solid #e2e8f0}.upload-icon-resume{position:absolute;right:25px;top:17px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon-resume:hover{opacity:1}.upload-icon{position:absolute;right:25px;top:45px;width:18px;height:18px;cursor:pointer;opacity:.6;transition:all .2s ease}.upload-icon:hover{opacity:1}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-top:3px;font-size:14px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{font-size:14px;color:#69707d}::ng-deep .custom-ng-select.ng-select-multiple .ng-select-container{min-height:42px!important;height:auto!important;display:flex;align-items:center;overflow:visible!important}::ng-deep .custom-ng-select.ng-select-multiple .ng-value-container{flex-wrap:wrap!important;overflow:visible!important;padding-top:2px;padding-bottom:2px}::ng-deep .custom-ng-select.ng-select-multiple .ng-value{margin-bottom:4px}::ng-deep .custom-ng-select.ng-select-multiple .ng-arrow-wrapper{display:flex;align-items:center;height:100%}:host ::ng-deep .custom-ng-select .ng-select-container{padding:0!important;font-size:14px!important}::ng-deep .job-title-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .job-title-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}::ng-deep .industry-select.ng-select-multiple .ng-select-container{height:42px!important}::ng-deep .industry-select.ng-select-multiple .ng-value-container{flex-wrap:nowrap!important;overflow:hidden!important}.form-control{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box}.form-control:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.form-control::placeholder{color:#69707d}.form-control.is-invalid{border-color:#ef4444}::ng-deep im-address-verify-field .im-avf__input{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease}::ng-deep im-address-verify-field .im-avf__input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}::ng-deep im-address-verify-field .im-avf__input.is-invalid{border-color:#ef4444}.role-selection-container{max-width:950px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.role-selection-container h2{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.role-selection-container .note{font-size:14px;color:#69707d;margin-bottom:20px}.role-selection-container .note-label{font-size:13px;font-weight:700;color:#69707d;letter-spacing:.05em;padding-left:0;display:block;margin-bottom:6px}.role-selection-container .note-label .req{color:#ef4444}.role-selection-container .dropdown-wrapper{display:flex;gap:8px;margin-bottom:16px}.role-selection-container .dropdown-wrapper select{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease}.role-selection-container .dropdown-wrapper select:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.role-selection-container .dropdown-wrapper .add-btn{height:42px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .dropdown-wrapper .add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .dropdown-wrapper .add-btn:active{transform:translateY(0)}.role-selection-container .dropdown-wrapper .add-btn:disabled{background:#69707d;cursor:not-allowed;transform:none}.role-selection-container .selected-roles{display:flex;flex-direction:column;gap:8px;margin-bottom:20px}.role-selection-container .selected-roles .role-card{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-radius:8px;background:#ebf2f9;border:1px solid rgba(64,119,173,.2);color:#2d5a8a}.role-selection-container .selected-roles .role-card .remove-btn{background:none;border:none;font-size:1.1rem;font-weight:700;cursor:pointer;color:#ef4444;min-width:auto;height:auto;padding:0 4px;transition:all .2s ease}.role-selection-container .selected-roles .role-card .remove-btn:hover{opacity:.75}.role-selection-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.role-selection-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.role-selection-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.role-selection-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.role-selection-container .navigation-buttons .next:active{transform:translateY(0)}.role-selection-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.image-wrapper{position:relative;width:150px;height:150px}.resume-wrapper{position:relative;width:550px;height:1px}.upload-spinner{position:absolute;right:25px;top:45px;width:18px;height:18px;display:flex;align-items:center;justify-content:center}.spinner-resume{width:36px;height:36px;border:3px solid #e2e8f0;border-top:3px solid #4077AD;border-radius:50%;position:absolute;top:-32%;left:99%;margin-top:-51px;margin-left:-20px;animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.profile-field{margin-top:-10px}.profile-field input{line-height:30px}.producer-type-container{max-width:1000px;margin:0 auto;min-height:300px;padding:28px 24px;background:#fff}.producer-type-container h2{font-size:20px;font-weight:700;color:#1e293b;margin-bottom:4px}.producer-type-container p{font-size:14px;color:#69707d;margin-bottom:20px}.producer-type-container .job-list{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.producer-type-container .job-list .job-item{padding:12px 16px;font-size:15px;border:1.5px solid #e2e8f0;border-radius:8px;cursor:pointer;display:flex;align-items:center;gap:8px;background:#fff;color:#1e293b;transition:all .2s ease;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .job-list .job-item:hover{border-color:#4077ad;background:#ebf2f9}.producer-type-container .job-list .job-item.selected{border-color:#4077ad;background:#ebf2f9;color:#2d5a8a;font-weight:600}.producer-type-container .job-list .job-item .plus{font-weight:700;color:#4077ad}.producer-type-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin:40px 0}.producer-type-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.producer-type-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.producer-type-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.producer-type-container .navigation-buttons .next:active{transform:translateY(0)}.producer-type-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}.actions{display:flex;justify-content:space-between;margin:48px 0 28px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}@media screen and (max-width: 767px){h2{font-size:18px}select,.form-control{font-size:16px}.actions{margin:16px 0;flex-direction:column-reverse;gap:8px}.res{flex-direction:column-reverse}.upload-spinner{right:20px;top:45px}.spinner-resume{width:24px;height:24px;top:-22%;left:32%}.ct-btn{width:100%;margin-top:32px}button,.resume-wrapper{width:100%}.role-selection-container .navigation-buttons,.producer-type-container .navigation-buttons{margin-top:24px;margin-bottom:16px}}\n"] }]
13098
13098
  }], ctorParameters: () => [{ type: CredentialingStore }, { type: ProvidersService }, { type: UserService }, { type: i2.Router }, { type: IndustryService }, { type: UserDetailService }, { type: FileService }, { type: i1$3.TokenService }, { type: i1$3.RoleContextService }, { type: FrontEndProvidersService }, { type: i7.FormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { backToParent: [{
13099
13099
  type: Output
13100
13100
  }], providerSaved: [{
@@ -35682,11 +35682,11 @@ class Step2CoverageComponent {
35682
35682
  }));
35683
35683
  }
35684
35684
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: Step2CoverageComponent, deps: [{ token: CredentialingStore }, { token: UsMapLatestService }, { token: UserCoverageAreaService }, { token: AlertService }, { token: i1$3.RoleContextService }, { token: i1$3.TokenService }], target: i0.ɵɵFactoryTarget.Component });
35685
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: Step2CoverageComponent, isStandalone: false, selector: "app-coverage", inputs: { providerId: "providerId", providerName: "providerName", states: "states", roleData: "roleData" }, ngImport: i0, template: "<div class=\"coverage-container\">\r\n <div class=\"step-card-header mb-4\" style=\"border-radius: 10px; margin: -28px -24px 24px;\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/geo-alt.svg\" alt=\"coverage area\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Coverage Area</h3>\r\n <p class=\"step-card-subtitle\">Select the states and counties where you can complete assignments</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coverage-options\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"coverage-question\">Where can you complete assignments?</h6>\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMap()\">\r\n </div>\r\n <label class=\"form-check-label\">Show Map</label>\r\n </div>\r\n </div>\r\n <hr class=\"m-0 border-3\">\r\n </div>\r\n\r\n <div class=\"state-selector\">\r\n <div class=\"row pb-2\">\r\n <div class=\"col-md-12\">\r\n <div class=\"position-relative\">\r\n <ng-select [clearable]=\"true\" [multiple]=\"true\" (change)=\"setSelectedStates($event)\" [items]=\"states\"\r\n [(ngModel)]=\"selectedStates\" bindLabel=\"stateName\" bindValue=\"stateCode\" [closeOnSelect]=\"false\"\r\n placeholder=\"Select State\" id=\"reqStates\" [loading]=\"isStatesLoading\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <span class=\"form-check\">\r\n <span class=\"form-check-input-wrapper\">\r\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\r\n </span>\r\n {{ item.stateName }}\r\n </span>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <ng-container *ngIf=\"!isStatesLoading\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"empty-message mt-4\" *ngIf=\"!isStatesLoading && coverages.length == 0\">\r\n <div class=\"text-center text-secondary\">No States Selected yet</div>\r\n </div>\r\n\r\n <div class=\"coverage-options\">\r\n <div class=\"col-md-10 col-12 py-2 map-wrapper\" [class.open]=\"showMap\">\r\n <us-map [filteredLocations]=\"filteredLocations\"></us-map>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12 mt-4\" *ngIf=\"!isStatesLoading\">\r\n <div *ngIf=\"coverages.length > 0\" class=\"counties-heading\">\r\n <h4 class=\"head\">Coverage Area Counties</h4>\r\n </div>\r\n <div class=\"row pt-2 pb-2\">\r\n <div class=\"col-12\">\r\n <div class=\"row\">\r\n <div class=\"col-12\" *ngFor=\"let coverage of coverages; let coverageIndex = index\">\r\n <div class=\"state-header-row\">\r\n <div class=\"state-header-left\">\r\n <div class=\"select-all-wrap\">\r\n <input type=\"checkbox\" class=\"state-checkbox\"\r\n id=\"stateCheckbox{{ coverage.state + coverageIndex }}\"\r\n [(ngModel)]=\"coverage.checked\"\r\n [indeterminate]=\"coverage.indeterminate\"\r\n (change)=\"onSelectAllChanged(coverage)\" />\r\n <label class=\"select-all-label\" for=\"stateCheckbox{{ coverage?.state + coverageIndex }}\">\r\n Select All\r\n </label>\r\n </div>\r\n <label class=\"state-name\" [attr.for]=\"'stateCheckbox' + coverage.state + coverageIndex\">\r\n {{ coverage.state | stateName }}\r\n </label>\r\n </div>\r\n <button type=\"button\" class=\"state-toggle-btn\" (click)=\"coverage.isShow = !coverage?.isShow\">\r\n <img [src]=\"coverage?.isShow ? '/assets/images/icons/arrow-up.svg' : '/assets/images/icons/arrow-down.svg'\" alt=\"toggle\" />\r\n </button>\r\n </div>\r\n <hr class=\"mt-0\" />\r\n <ng-container *ngIf=\"coverage?.isShow\">\r\n <div class=\"form-group mb-1\">\r\n <input type=\"text\" class=\"font-default form-check-inline form-control h-37\"\r\n placeholder=\"Select Counties In {{ coverage.state | stateName }}\"\r\n [(ngModel)]=\"coverage.query\" />\r\n </div>\r\n <div class=\"county-list-scroll row m-lg-2\">\r\n <div class=\"list-group-item col-3 res-coverage col-sm-6 p-1\"\r\n *ngFor=\"let county of coverage.counties | SearchBy: 'countyName':coverage.query; let countyIndex = index\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\"\r\n [(ngModel)]=\"county.checked\"\r\n (change)=\"onChangedCounty($event, coverage.state, county.countyName)\" />\r\n <label class=\"form-check-label\"\r\n [for]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\">\r\n {{ county.countyName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"previousStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"skip()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"coverageSave\" [ng2-loading]=\"coverageSave\"\r\n (click)=\"saveCoverage()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".coverage-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}.coverage-container .head{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.coverage-container p{font-size:14px;color:#69707d;margin-bottom:16px;margin-top:20px;font-weight:400}.coverage-container .form-check-label{font-size:14px;color:#69707d}.coverage-container .first-section span{color:#69707d;font-size:13px}.coverage-container .location-inputs{display:flex;gap:12px;margin-bottom:32px;margin-top:16px}.coverage-container .location-inputs input{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box}.coverage-container .location-inputs input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.coverage-container .location-inputs input::placeholder{color:#69707d;font-size:14px}.coverage-container .state-selector .empty-message{width:100%;padding:16px;background:#fff;text-align:center;color:#69707d;border-radius:8px;border:1px solid #e2e8f0;font-size:14px}.coverage-container .state-selector .custom-control{font-size:14px;display:flex;align-items:center;gap:7px;color:#69707d;padding-left:13px}.coverage-container .state-selector .custom-control-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .state-selector .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options{margin-bottom:16px}.coverage-container .coverage-options label{font-size:12px;font-weight:700;color:#69707d;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px;width:110px}.coverage-container .coverage-options label .show-map{margin-left:auto}.coverage-container .coverage-options .icon-black{filter:brightness(0) saturate(100%) invert(10%) sepia(47%) saturate(3454%) hue-rotate(184deg) brightness(98%) contrast(101%)}.coverage-container .coverage-options .icon-gray{filter:brightness(0) saturate(100%) invert(100%) sepia(4%) saturate(29%) hue-rotate(68deg) brightness(112%) contrast(80%)}.coverage-container .coverage-options .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options .square-box{width:12px;height:12px;border:2px solid;display:inline-block}.coverage-container .coverage-options .square-box.black{background:#002b49;border:0;width:15px;height:14px}.coverage-container .coverage-options .square-box.gray{border:1px solid rgba(128,128,128,.23)!important;border:0;width:15px;height:15px}.coverage-container .coverage-options .map-wrapper{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .4s ease,opacity .3s ease}.coverage-container .coverage-options .map-wrapper>*{overflow:hidden}.coverage-container .coverage-options .map-wrapper.open{grid-template-rows:1fr;opacity:1}.coverage-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.coverage-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.coverage-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.coverage-container .navigation-buttons .next:active{transform:translateY(0)}.coverage-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d;font-size:14px}.custom-checkbox1{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;margin-right:8px;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox1.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox1.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.custom-checkbox2{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox2.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox2.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.select-loader{position:absolute;top:-28px;left:0;font-size:12px;color:#4077ad;display:flex;align-items:center;gap:6px}::ng-deep .form-check{display:block;min-height:1.5rem;margin-bottom:.125rem}.actions{display:flex;justify-content:space-between;margin:48px 0 32px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.icon-color{cursor:pointer;background:transparent;width:20px;height:20px;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.custom-control label{padding-top:8px;font-size:14px;color:#69707d}.coverage-question{font-size:14px;font-weight:600;color:#69707d;margin:0}.coverage-option-text{font-size:14px;color:#69707d}.option-cursor{cursor:pointer}.counties-heading{margin-bottom:8px}.state-header-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#ebf2f9;border:1px solid #e2e8f0;border-radius:8px 8px 0 0;gap:12px}.state-header-left{display:flex;align-items:center;gap:20px;flex:1}.select-all-wrap{display:flex;align-items:center;gap:6px}.state-checkbox{width:16px;height:16px;border:1.5px solid #e2e8f0;border-radius:6px;cursor:pointer;accent-color:#4077AD;flex-shrink:0}.select-all-label{font-size:12px;font-weight:600;color:#69707d;cursor:pointer;margin:0}.state-name{font-size:14px;font-weight:700;color:#1e293b;cursor:pointer;margin:0}.state-toggle-btn{background:none;border:none;padding:4px 6px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;transition:all .2s ease;min-width:unset;height:auto;font-size:0}.state-toggle-btn:hover{background:#4077ad1f}.state-toggle-btn img{width:18px;height:18px}.county-list-scroll{height:160px;overflow-y:auto;padding-left:1rem}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media screen and (max-width: 767px){.coverage-container{padding:16px}.coverage-container .head{font-size:18px}.coverage-container input{font-size:16px}.actions{gap:8px;display:flex;flex-direction:column-reverse}.actions button{min-width:100%}.right-actions{gap:8px;justify-content:space-between;display:flex;flex-direction:column-reverse}.custom-control label{padding-top:0}.res-coverage{width:50%}.pointer{display:none}.coverage-container .location-inputs{flex-direction:column}.coverage-container .form-check-label{font-size:14px}.coverage-container .navigation-buttons{margin-top:24px;margin-bottom:16px}.coverage-question{font-size:14px}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: UsMapComponent, selector: "us-map", inputs: ["selectedStates", "allowedStates", "isReadOnly", "filteredLocations"], outputs: ["onMapClick"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "pipe", type: SearchPipe, name: "SearchBy" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
35685
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: Step2CoverageComponent, isStandalone: false, selector: "app-coverage", inputs: { providerId: "providerId", providerName: "providerName", states: "states", roleData: "roleData" }, ngImport: i0, template: "<div class=\"coverage-container\">\n <div class=\"step-card-header mb-4\" style=\"border-radius: 10px; margin: -28px -24px 24px;\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/geo-alt.svg\" alt=\"coverage area\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Coverage Area</h3>\n <p class=\"step-card-subtitle\">Select the states and counties where you can complete assignments</p>\n </div>\n </div>\n\n <div class=\"coverage-options\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <h6 class=\"coverage-question\">Where can you complete assignments?</h6>\n <div class=\"d-flex gap-1 align-items-center\">\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMap()\">\n </div>\n <label class=\"form-check-label\">Show Map</label>\n </div>\n </div>\n <hr class=\"m-0 border-3\">\n </div>\n\n <div class=\"state-selector\">\n <div class=\"row pb-2\">\n <div class=\"col-md-12\">\n <div class=\"position-relative\">\n <ng-select [clearable]=\"true\" [multiple]=\"true\" (change)=\"setSelectedStates($event)\" [items]=\"states\"\n [(ngModel)]=\"selectedStates\" bindLabel=\"stateName\" bindValue=\"stateCode\" [closeOnSelect]=\"false\"\n placeholder=\"Select State\" id=\"reqStates\" [loading]=\"isStatesLoading\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <span class=\"form-check\">\n <span class=\"form-check-input-wrapper\">\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\n </span>\n {{ item.stateName }}\n </span>\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <ng-container *ngIf=\"!isStatesLoading\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-container>\n </ng-template>\n </ng-select>\n </div>\n </div>\n </div>\n\n <div class=\"empty-message mt-4\" *ngIf=\"!isStatesLoading && coverages.length == 0\">\n <div class=\"text-center text-secondary\">No States Selected yet</div>\n </div>\n\n <div class=\"coverage-options\">\n <div class=\"col-md-10 col-12 py-2 map-wrapper\" [class.open]=\"showMap\">\n <us-map [filteredLocations]=\"filteredLocations\"></us-map>\n </div>\n </div>\n\n <div class=\"col-12 mt-4\" *ngIf=\"!isStatesLoading\">\n <div *ngIf=\"coverages.length > 0\" class=\"counties-heading\">\n <h4 class=\"head\">Coverage Area Counties</h4>\n </div>\n <div class=\"row pt-2 pb-2\">\n <div class=\"col-12\">\n <div class=\"row\">\n <div class=\"col-12\" *ngFor=\"let coverage of coverages; let coverageIndex = index\">\n <div class=\"state-header-row\">\n <div class=\"state-header-left\">\n <div class=\"select-all-wrap\">\n <input type=\"checkbox\" class=\"state-checkbox\"\n id=\"stateCheckbox{{ coverage.state + coverageIndex }}\"\n [(ngModel)]=\"coverage.checked\"\n [indeterminate]=\"coverage.indeterminate\"\n (change)=\"onSelectAllChanged(coverage)\" />\n <label class=\"select-all-label\" for=\"stateCheckbox{{ coverage?.state + coverageIndex }}\">\n Select All\n </label>\n </div>\n <label class=\"state-name\" [attr.for]=\"'stateCheckbox' + coverage.state + coverageIndex\">\n {{ coverage.state | stateName }}\n </label>\n </div>\n <button type=\"button\" class=\"state-toggle-btn\" (click)=\"coverage.isShow = !coverage?.isShow\">\n <img [src]=\"coverage?.isShow ? '/assets/images/icons/arrow-up.svg' : '/assets/images/icons/arrow-down.svg'\" alt=\"toggle\" />\n </button>\n </div>\n <hr class=\"mt-0\" />\n <ng-container *ngIf=\"coverage?.isShow\">\n <div class=\"form-group mb-1\">\n <input type=\"text\" class=\"font-default form-check-inline form-control h-37\"\n placeholder=\"Select Counties In {{ coverage.state | stateName }}\"\n [(ngModel)]=\"coverage.query\" />\n </div>\n <div class=\"county-list-scroll row m-lg-2\">\n <div class=\"list-group-item col-3 res-coverage col-sm-6 p-1\"\n *ngFor=\"let county of coverage.counties | SearchBy: 'countyName':coverage.query; let countyIndex = index\">\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\"\n [id]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\"\n [(ngModel)]=\"county.checked\"\n (change)=\"onChangedCounty($event, coverage.state, county.countyName)\" />\n <label class=\"form-check-label\"\n [for]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\">\n {{ county.countyName }}\n </label>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"previousStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"skip()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"coverageSave\" [ng2-loading]=\"coverageSave\"\n (click)=\"saveCoverage()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".coverage-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}.coverage-container .head{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.coverage-container p{font-size:14px;color:#69707d;margin-bottom:16px;margin-top:20px;font-weight:400}.coverage-container .form-check-label{font-size:14px;color:#69707d}.coverage-container .first-section span{color:#69707d;font-size:13px}.coverage-container .location-inputs{display:flex;gap:12px;margin-bottom:32px;margin-top:16px}.coverage-container .location-inputs input{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box}.coverage-container .location-inputs input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.coverage-container .location-inputs input::placeholder{color:#69707d;font-size:14px}.coverage-container .state-selector .empty-message{width:100%;padding:16px;background:#fff;text-align:center;color:#69707d;border-radius:8px;border:1px solid #e2e8f0;font-size:14px}.coverage-container .state-selector .custom-control{font-size:14px;display:flex;align-items:center;gap:7px;color:#69707d;padding-left:13px}.coverage-container .state-selector .custom-control-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .state-selector .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options{margin-bottom:16px}.coverage-container .coverage-options label{font-size:12px;font-weight:700;color:#69707d;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px;width:110px}.coverage-container .coverage-options label .show-map{margin-left:auto}.coverage-container .coverage-options .icon-black{filter:brightness(0) saturate(100%) invert(10%) sepia(47%) saturate(3454%) hue-rotate(184deg) brightness(98%) contrast(101%)}.coverage-container .coverage-options .icon-gray{filter:brightness(0) saturate(100%) invert(100%) sepia(4%) saturate(29%) hue-rotate(68deg) brightness(112%) contrast(80%)}.coverage-container .coverage-options .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options .square-box{width:12px;height:12px;border:2px solid;display:inline-block}.coverage-container .coverage-options .square-box.black{background:#002b49;border:0;width:15px;height:14px}.coverage-container .coverage-options .square-box.gray{border:1px solid rgba(128,128,128,.23)!important;border:0;width:15px;height:15px}.coverage-container .coverage-options .map-wrapper{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .4s ease,opacity .3s ease}.coverage-container .coverage-options .map-wrapper>*{overflow:hidden}.coverage-container .coverage-options .map-wrapper.open{grid-template-rows:1fr;opacity:1}.coverage-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.coverage-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.coverage-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.coverage-container .navigation-buttons .next:active{transform:translateY(0)}.coverage-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d;font-size:14px}.custom-checkbox1{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;margin-right:8px;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox1.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox1.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.custom-checkbox2{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox2.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox2.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.select-loader{position:absolute;top:-28px;left:0;font-size:12px;color:#4077ad;display:flex;align-items:center;gap:6px}::ng-deep .form-check{display:block;min-height:1.5rem;margin-bottom:.125rem}.actions{display:flex;justify-content:space-between;margin:48px 0 32px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.icon-color{cursor:pointer;background:transparent;width:20px;height:20px;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.custom-control label{padding-top:8px;font-size:14px;color:#69707d}.coverage-question{font-size:14px;font-weight:600;color:#69707d;margin:0}.coverage-option-text{font-size:14px;color:#69707d}.option-cursor{cursor:pointer}.counties-heading{margin-bottom:8px}.state-header-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#ebf2f9;border:1px solid #e2e8f0;border-radius:8px 8px 0 0;gap:12px}.state-header-left{display:flex;align-items:center;gap:20px;flex:1}.select-all-wrap{display:flex;align-items:center;gap:6px}.state-checkbox{width:16px;height:16px;border:1.5px solid #e2e8f0;border-radius:6px;cursor:pointer;accent-color:#4077AD;flex-shrink:0}.select-all-label{font-size:12px;font-weight:600;color:#69707d;cursor:pointer;margin:0}.state-name{font-size:14px;font-weight:700;color:#1e293b;cursor:pointer;margin:0}.state-toggle-btn{background:none;border:none;padding:4px 6px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;transition:all .2s ease;min-width:unset;height:auto;font-size:0}.state-toggle-btn:hover{background:#4077ad1f}.state-toggle-btn img{width:18px;height:18px}.county-list-scroll{height:160px;overflow-y:auto;padding-left:1rem}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media screen and (max-width: 767px){.coverage-container{padding:16px}.coverage-container .head{font-size:18px}.coverage-container input{font-size:16px}.actions{gap:8px;display:flex;flex-direction:column-reverse}.actions button{min-width:100%}.right-actions{gap:8px;justify-content:space-between;display:flex;flex-direction:column-reverse}.custom-control label{padding-top:0}.res-coverage{width:50%}.pointer{display:none}.coverage-container .location-inputs{flex-direction:column}.coverage-container .form-check-label{font-size:14px}.coverage-container .navigation-buttons{margin-top:24px;margin-bottom:16px}.coverage-question{font-size:14px}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: UsMapComponent, selector: "us-map", inputs: ["selectedStates", "allowedStates", "isReadOnly", "filteredLocations"], outputs: ["onMapClick"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "pipe", type: SearchPipe, name: "SearchBy" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
35686
35686
  }
35687
35687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: Step2CoverageComponent, decorators: [{
35688
35688
  type: Component,
35689
- args: [{ selector: 'app-coverage', standalone: false, template: "<div class=\"coverage-container\">\r\n <div class=\"step-card-header mb-4\" style=\"border-radius: 10px; margin: -28px -24px 24px;\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/geo-alt.svg\" alt=\"coverage area\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Coverage Area</h3>\r\n <p class=\"step-card-subtitle\">Select the states and counties where you can complete assignments</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coverage-options\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"coverage-question\">Where can you complete assignments?</h6>\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMap()\">\r\n </div>\r\n <label class=\"form-check-label\">Show Map</label>\r\n </div>\r\n </div>\r\n <hr class=\"m-0 border-3\">\r\n </div>\r\n\r\n <div class=\"state-selector\">\r\n <div class=\"row pb-2\">\r\n <div class=\"col-md-12\">\r\n <div class=\"position-relative\">\r\n <ng-select [clearable]=\"true\" [multiple]=\"true\" (change)=\"setSelectedStates($event)\" [items]=\"states\"\r\n [(ngModel)]=\"selectedStates\" bindLabel=\"stateName\" bindValue=\"stateCode\" [closeOnSelect]=\"false\"\r\n placeholder=\"Select State\" id=\"reqStates\" [loading]=\"isStatesLoading\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <span class=\"form-check\">\r\n <span class=\"form-check-input-wrapper\">\r\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\r\n </span>\r\n {{ item.stateName }}\r\n </span>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <ng-container *ngIf=\"!isStatesLoading\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"empty-message mt-4\" *ngIf=\"!isStatesLoading && coverages.length == 0\">\r\n <div class=\"text-center text-secondary\">No States Selected yet</div>\r\n </div>\r\n\r\n <div class=\"coverage-options\">\r\n <div class=\"col-md-10 col-12 py-2 map-wrapper\" [class.open]=\"showMap\">\r\n <us-map [filteredLocations]=\"filteredLocations\"></us-map>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12 mt-4\" *ngIf=\"!isStatesLoading\">\r\n <div *ngIf=\"coverages.length > 0\" class=\"counties-heading\">\r\n <h4 class=\"head\">Coverage Area Counties</h4>\r\n </div>\r\n <div class=\"row pt-2 pb-2\">\r\n <div class=\"col-12\">\r\n <div class=\"row\">\r\n <div class=\"col-12\" *ngFor=\"let coverage of coverages; let coverageIndex = index\">\r\n <div class=\"state-header-row\">\r\n <div class=\"state-header-left\">\r\n <div class=\"select-all-wrap\">\r\n <input type=\"checkbox\" class=\"state-checkbox\"\r\n id=\"stateCheckbox{{ coverage.state + coverageIndex }}\"\r\n [(ngModel)]=\"coverage.checked\"\r\n [indeterminate]=\"coverage.indeterminate\"\r\n (change)=\"onSelectAllChanged(coverage)\" />\r\n <label class=\"select-all-label\" for=\"stateCheckbox{{ coverage?.state + coverageIndex }}\">\r\n Select All\r\n </label>\r\n </div>\r\n <label class=\"state-name\" [attr.for]=\"'stateCheckbox' + coverage.state + coverageIndex\">\r\n {{ coverage.state | stateName }}\r\n </label>\r\n </div>\r\n <button type=\"button\" class=\"state-toggle-btn\" (click)=\"coverage.isShow = !coverage?.isShow\">\r\n <img [src]=\"coverage?.isShow ? '/assets/images/icons/arrow-up.svg' : '/assets/images/icons/arrow-down.svg'\" alt=\"toggle\" />\r\n </button>\r\n </div>\r\n <hr class=\"mt-0\" />\r\n <ng-container *ngIf=\"coverage?.isShow\">\r\n <div class=\"form-group mb-1\">\r\n <input type=\"text\" class=\"font-default form-check-inline form-control h-37\"\r\n placeholder=\"Select Counties In {{ coverage.state | stateName }}\"\r\n [(ngModel)]=\"coverage.query\" />\r\n </div>\r\n <div class=\"county-list-scroll row m-lg-2\">\r\n <div class=\"list-group-item col-3 res-coverage col-sm-6 p-1\"\r\n *ngFor=\"let county of coverage.counties | SearchBy: 'countyName':coverage.query; let countyIndex = index\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\"\r\n [(ngModel)]=\"county.checked\"\r\n (change)=\"onChangedCounty($event, coverage.state, county.countyName)\" />\r\n <label class=\"form-check-label\"\r\n [for]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\">\r\n {{ county.countyName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"previousStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"skip()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"coverageSave\" [ng2-loading]=\"coverageSave\"\r\n (click)=\"saveCoverage()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".coverage-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}.coverage-container .head{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.coverage-container p{font-size:14px;color:#69707d;margin-bottom:16px;margin-top:20px;font-weight:400}.coverage-container .form-check-label{font-size:14px;color:#69707d}.coverage-container .first-section span{color:#69707d;font-size:13px}.coverage-container .location-inputs{display:flex;gap:12px;margin-bottom:32px;margin-top:16px}.coverage-container .location-inputs input{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box}.coverage-container .location-inputs input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.coverage-container .location-inputs input::placeholder{color:#69707d;font-size:14px}.coverage-container .state-selector .empty-message{width:100%;padding:16px;background:#fff;text-align:center;color:#69707d;border-radius:8px;border:1px solid #e2e8f0;font-size:14px}.coverage-container .state-selector .custom-control{font-size:14px;display:flex;align-items:center;gap:7px;color:#69707d;padding-left:13px}.coverage-container .state-selector .custom-control-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .state-selector .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options{margin-bottom:16px}.coverage-container .coverage-options label{font-size:12px;font-weight:700;color:#69707d;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px;width:110px}.coverage-container .coverage-options label .show-map{margin-left:auto}.coverage-container .coverage-options .icon-black{filter:brightness(0) saturate(100%) invert(10%) sepia(47%) saturate(3454%) hue-rotate(184deg) brightness(98%) contrast(101%)}.coverage-container .coverage-options .icon-gray{filter:brightness(0) saturate(100%) invert(100%) sepia(4%) saturate(29%) hue-rotate(68deg) brightness(112%) contrast(80%)}.coverage-container .coverage-options .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options .square-box{width:12px;height:12px;border:2px solid;display:inline-block}.coverage-container .coverage-options .square-box.black{background:#002b49;border:0;width:15px;height:14px}.coverage-container .coverage-options .square-box.gray{border:1px solid rgba(128,128,128,.23)!important;border:0;width:15px;height:15px}.coverage-container .coverage-options .map-wrapper{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .4s ease,opacity .3s ease}.coverage-container .coverage-options .map-wrapper>*{overflow:hidden}.coverage-container .coverage-options .map-wrapper.open{grid-template-rows:1fr;opacity:1}.coverage-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.coverage-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.coverage-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.coverage-container .navigation-buttons .next:active{transform:translateY(0)}.coverage-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d;font-size:14px}.custom-checkbox1{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;margin-right:8px;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox1.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox1.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.custom-checkbox2{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox2.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox2.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.select-loader{position:absolute;top:-28px;left:0;font-size:12px;color:#4077ad;display:flex;align-items:center;gap:6px}::ng-deep .form-check{display:block;min-height:1.5rem;margin-bottom:.125rem}.actions{display:flex;justify-content:space-between;margin:48px 0 32px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.icon-color{cursor:pointer;background:transparent;width:20px;height:20px;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.custom-control label{padding-top:8px;font-size:14px;color:#69707d}.coverage-question{font-size:14px;font-weight:600;color:#69707d;margin:0}.coverage-option-text{font-size:14px;color:#69707d}.option-cursor{cursor:pointer}.counties-heading{margin-bottom:8px}.state-header-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#ebf2f9;border:1px solid #e2e8f0;border-radius:8px 8px 0 0;gap:12px}.state-header-left{display:flex;align-items:center;gap:20px;flex:1}.select-all-wrap{display:flex;align-items:center;gap:6px}.state-checkbox{width:16px;height:16px;border:1.5px solid #e2e8f0;border-radius:6px;cursor:pointer;accent-color:#4077AD;flex-shrink:0}.select-all-label{font-size:12px;font-weight:600;color:#69707d;cursor:pointer;margin:0}.state-name{font-size:14px;font-weight:700;color:#1e293b;cursor:pointer;margin:0}.state-toggle-btn{background:none;border:none;padding:4px 6px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;transition:all .2s ease;min-width:unset;height:auto;font-size:0}.state-toggle-btn:hover{background:#4077ad1f}.state-toggle-btn img{width:18px;height:18px}.county-list-scroll{height:160px;overflow-y:auto;padding-left:1rem}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media screen and (max-width: 767px){.coverage-container{padding:16px}.coverage-container .head{font-size:18px}.coverage-container input{font-size:16px}.actions{gap:8px;display:flex;flex-direction:column-reverse}.actions button{min-width:100%}.right-actions{gap:8px;justify-content:space-between;display:flex;flex-direction:column-reverse}.custom-control label{padding-top:0}.res-coverage{width:50%}.pointer{display:none}.coverage-container .location-inputs{flex-direction:column}.coverage-container .form-check-label{font-size:14px}.coverage-container .navigation-buttons{margin-top:24px;margin-bottom:16px}.coverage-question{font-size:14px}}\n"] }]
35689
+ args: [{ selector: 'app-coverage', standalone: false, template: "<div class=\"coverage-container\">\n <div class=\"step-card-header mb-4\" style=\"border-radius: 10px; margin: -28px -24px 24px;\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/geo-alt.svg\" alt=\"coverage area\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Coverage Area</h3>\n <p class=\"step-card-subtitle\">Select the states and counties where you can complete assignments</p>\n </div>\n </div>\n\n <div class=\"coverage-options\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <h6 class=\"coverage-question\">Where can you complete assignments?</h6>\n <div class=\"d-flex gap-1 align-items-center\">\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMap()\">\n </div>\n <label class=\"form-check-label\">Show Map</label>\n </div>\n </div>\n <hr class=\"m-0 border-3\">\n </div>\n\n <div class=\"state-selector\">\n <div class=\"row pb-2\">\n <div class=\"col-md-12\">\n <div class=\"position-relative\">\n <ng-select [clearable]=\"true\" [multiple]=\"true\" (change)=\"setSelectedStates($event)\" [items]=\"states\"\n [(ngModel)]=\"selectedStates\" bindLabel=\"stateName\" bindValue=\"stateCode\" [closeOnSelect]=\"false\"\n placeholder=\"Select State\" id=\"reqStates\" [loading]=\"isStatesLoading\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <span class=\"form-check\">\n <span class=\"form-check-input-wrapper\">\n <span class=\"custom-checkbox1\" [class.checked]=\"item$.selected\"></span>\n </span>\n {{ item.stateName }}\n </span>\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <ng-container *ngIf=\"!isStatesLoading\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-container>\n </ng-template>\n </ng-select>\n </div>\n </div>\n </div>\n\n <div class=\"empty-message mt-4\" *ngIf=\"!isStatesLoading && coverages.length == 0\">\n <div class=\"text-center text-secondary\">No States Selected yet</div>\n </div>\n\n <div class=\"coverage-options\">\n <div class=\"col-md-10 col-12 py-2 map-wrapper\" [class.open]=\"showMap\">\n <us-map [filteredLocations]=\"filteredLocations\"></us-map>\n </div>\n </div>\n\n <div class=\"col-12 mt-4\" *ngIf=\"!isStatesLoading\">\n <div *ngIf=\"coverages.length > 0\" class=\"counties-heading\">\n <h4 class=\"head\">Coverage Area Counties</h4>\n </div>\n <div class=\"row pt-2 pb-2\">\n <div class=\"col-12\">\n <div class=\"row\">\n <div class=\"col-12\" *ngFor=\"let coverage of coverages; let coverageIndex = index\">\n <div class=\"state-header-row\">\n <div class=\"state-header-left\">\n <div class=\"select-all-wrap\">\n <input type=\"checkbox\" class=\"state-checkbox\"\n id=\"stateCheckbox{{ coverage.state + coverageIndex }}\"\n [(ngModel)]=\"coverage.checked\"\n [indeterminate]=\"coverage.indeterminate\"\n (change)=\"onSelectAllChanged(coverage)\" />\n <label class=\"select-all-label\" for=\"stateCheckbox{{ coverage?.state + coverageIndex }}\">\n Select All\n </label>\n </div>\n <label class=\"state-name\" [attr.for]=\"'stateCheckbox' + coverage.state + coverageIndex\">\n {{ coverage.state | stateName }}\n </label>\n </div>\n <button type=\"button\" class=\"state-toggle-btn\" (click)=\"coverage.isShow = !coverage?.isShow\">\n <img [src]=\"coverage?.isShow ? '/assets/images/icons/arrow-up.svg' : '/assets/images/icons/arrow-down.svg'\" alt=\"toggle\" />\n </button>\n </div>\n <hr class=\"mt-0\" />\n <ng-container *ngIf=\"coverage?.isShow\">\n <div class=\"form-group mb-1\">\n <input type=\"text\" class=\"font-default form-check-inline form-control h-37\"\n placeholder=\"Select Counties In {{ coverage.state | stateName }}\"\n [(ngModel)]=\"coverage.query\" />\n </div>\n <div class=\"county-list-scroll row m-lg-2\">\n <div class=\"list-group-item col-3 res-coverage col-sm-6 p-1\"\n *ngFor=\"let county of coverage.counties | SearchBy: 'countyName':coverage.query; let countyIndex = index\">\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\"\n [id]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\"\n [(ngModel)]=\"county.checked\"\n (change)=\"onChangedCounty($event, coverage.state, county.countyName)\" />\n <label class=\"form-check-label\"\n [for]=\"'stateCheckbox' + coverage.state + county.countyName + countyIndex\">\n {{ county.countyName }}\n </label>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"previousStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"skip()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"coverageSave\" [ng2-loading]=\"coverageSave\"\n (click)=\"saveCoverage()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".coverage-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}.coverage-container .head{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.coverage-container p{font-size:14px;color:#69707d;margin-bottom:16px;margin-top:20px;font-weight:400}.coverage-container .form-check-label{font-size:14px;color:#69707d}.coverage-container .first-section span{color:#69707d;font-size:13px}.coverage-container .location-inputs{display:flex;gap:12px;margin-bottom:32px;margin-top:16px}.coverage-container .location-inputs input{flex:1;height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:15px;color:#1e293b;background:#f9fafb;transition:all .2s ease;box-sizing:border-box}.coverage-container .location-inputs input:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}.coverage-container .location-inputs input::placeholder{color:#69707d;font-size:14px}.coverage-container .state-selector .empty-message{width:100%;padding:16px;background:#fff;text-align:center;color:#69707d;border-radius:8px;border:1px solid #e2e8f0;font-size:14px}.coverage-container .state-selector .custom-control{font-size:14px;display:flex;align-items:center;gap:7px;color:#69707d;padding-left:13px}.coverage-container .state-selector .custom-control-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .state-selector .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options{margin-bottom:16px}.coverage-container .coverage-options label{font-size:12px;font-weight:700;color:#69707d;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px;width:110px}.coverage-container .coverage-options label .show-map{margin-left:auto}.coverage-container .coverage-options .icon-black{filter:brightness(0) saturate(100%) invert(10%) sepia(47%) saturate(3454%) hue-rotate(184deg) brightness(98%) contrast(101%)}.coverage-container .coverage-options .icon-gray{filter:brightness(0) saturate(100%) invert(100%) sepia(4%) saturate(29%) hue-rotate(68deg) brightness(112%) contrast(80%)}.coverage-container .coverage-options .form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.coverage-container .coverage-options .square-box{width:12px;height:12px;border:2px solid;display:inline-block}.coverage-container .coverage-options .square-box.black{background:#002b49;border:0;width:15px;height:14px}.coverage-container .coverage-options .square-box.gray{border:1px solid rgba(128,128,128,.23)!important;border:0;width:15px;height:15px}.coverage-container .coverage-options .map-wrapper{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .4s ease,opacity .3s ease}.coverage-container .coverage-options .map-wrapper>*{overflow:hidden}.coverage-container .coverage-options .map-wrapper.open{grid-template-rows:1fr;opacity:1}.coverage-container .navigation-buttons{display:flex;justify-content:flex-end;gap:12px;margin-top:48px;margin-bottom:32px}.coverage-container .navigation-buttons .back{height:42px;min-width:130px;padding:10px 22px;background:#fff;color:#69707d;border:1.5px solid #e2e8f0;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .back:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.coverage-container .navigation-buttons .next{height:42px;min-width:130px;padding:10px 22px;background:#4077ad;color:#fff;border:none;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.coverage-container .navigation-buttons .next:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.coverage-container .navigation-buttons .next:active{transform:translateY(0)}.coverage-container .navigation-buttons .next:disabled{background:#69707d;cursor:not-allowed;transform:none}::ng-deep .ng-select .ng-select-container{min-height:42px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container:hover{border-color:#69707d}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d;font-size:14px}.custom-checkbox1{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;margin-right:8px;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox1.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox1.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.custom-checkbox2{display:inline-block;width:16px;height:16px;border:1.5px solid #e2e8f0;vertical-align:middle;position:relative;cursor:pointer;border-radius:6px;background-color:#fff;transition:all .2s ease}.custom-checkbox2.checked{background-color:#4077ad;border-color:#4077ad}.custom-checkbox2.checked:after{content:\"\";position:absolute;left:4px;top:0;width:4px;height:8px;border:solid #ffffff;border-width:0 2px 2px 0;transform:rotate(45deg)}.select-loader{position:absolute;top:-28px;left:0;font-size:12px;color:#4077ad;display:flex;align-items:center;gap:6px}::ng-deep .form-check{display:block;min-height:1.5rem;margin-bottom:.125rem}.actions{display:flex;justify-content:space-between;margin:48px 0 32px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.icon-color{cursor:pointer;background:transparent;width:20px;height:20px;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.custom-control label{padding-top:8px;font-size:14px;color:#69707d}.coverage-question{font-size:14px;font-weight:600;color:#69707d;margin:0}.coverage-option-text{font-size:14px;color:#69707d}.option-cursor{cursor:pointer}.counties-heading{margin-bottom:8px}.state-header-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#ebf2f9;border:1px solid #e2e8f0;border-radius:8px 8px 0 0;gap:12px}.state-header-left{display:flex;align-items:center;gap:20px;flex:1}.select-all-wrap{display:flex;align-items:center;gap:6px}.state-checkbox{width:16px;height:16px;border:1.5px solid #e2e8f0;border-radius:6px;cursor:pointer;accent-color:#4077AD;flex-shrink:0}.select-all-label{font-size:12px;font-weight:600;color:#69707d;cursor:pointer;margin:0}.state-name{font-size:14px;font-weight:700;color:#1e293b;cursor:pointer;margin:0}.state-toggle-btn{background:none;border:none;padding:4px 6px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;transition:all .2s ease;min-width:unset;height:auto;font-size:0}.state-toggle-btn:hover{background:#4077ad1f}.state-toggle-btn img{width:18px;height:18px}.county-list-scroll{height:160px;overflow-y:auto;padding-left:1rem}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media screen and (max-width: 767px){.coverage-container{padding:16px}.coverage-container .head{font-size:18px}.coverage-container input{font-size:16px}.actions{gap:8px;display:flex;flex-direction:column-reverse}.actions button{min-width:100%}.right-actions{gap:8px;justify-content:space-between;display:flex;flex-direction:column-reverse}.custom-control label{padding-top:0}.res-coverage{width:50%}.pointer{display:none}.coverage-container .location-inputs{flex-direction:column}.coverage-container .form-check-label{font-size:14px}.coverage-container .navigation-buttons{margin-top:24px;margin-bottom:16px}.coverage-question{font-size:14px}}\n"] }]
35690
35690
  }], ctorParameters: () => [{ type: CredentialingStore }, { type: UsMapLatestService }, { type: UserCoverageAreaService }, { type: AlertService }, { type: i1$3.RoleContextService }, { type: i1$3.TokenService }], propDecorators: { providerId: [{
35691
35691
  type: Input
35692
35692
  }], providerName: [{
@@ -36119,11 +36119,11 @@ class WorkexperienceComponent {
36119
36119
  this.fileName = '';
36120
36120
  }
36121
36121
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WorkexperienceComponent, deps: [{ token: UserExperienceService }, { token: UserService }, { token: WorkExperienceStore }, { token: CredentialingStore }, { token: CountryServices }, { token: PostalCodeServices }, { token: i1$3.TokenService }, { token: i1$3.RoleContextService }, { token: i7.FormBuilder }, { token: FileService }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
36122
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: WorkexperienceComponent, isStandalone: false, selector: "app-workexperience", inputs: { providerId: "providerId", providerName: "providerName", cloudfrontUrl: "cloudfrontUrl" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!showpreview()\">\r\n <div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Add Work Experience</h3>\r\n <p class=\"step-card-subtitle\">Add your prior and current work history below</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n <form [formGroup]=\"workexperienceForm\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Basic Information</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Company Name <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your company name here\" formControlName=\"companyName\" />\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('companyName')?.touched &&\r\n workexperienceForm.get('companyName')?.hasError('required')\">\r\n Company name is required\r\n </small>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">Job Title <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your job title here\" formControlName=\"jobTitle\" />\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('jobTitle')?.touched &&\r\n workexperienceForm.get('jobTitle')?.hasError('required')\">\r\n Job title is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Location &amp; Timeline</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\r\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\r\n &nbsp;{{ item.country }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\r\n placeholder=\"Select State\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\r\n &nbsp;{{ item.stateName }}\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"row form-row\">\r\n <div class=\"field\">\r\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('city')?.touched &&\r\n workexperienceForm.get('city')?.hasError('required')\">\r\n City is required\r\n </small>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"{ adaptivePosition: true, isAnimated: true, showWeekNumbers: false,\r\n customTodayClass: !workexperienceForm.get('fromDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"fromDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('fromDate')?.touched &&\r\n workexperienceForm.get('fromDate')?.hasError('required')\">\r\n Start Date is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !workexperienceForm.get('toDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"toDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('toDate')?.touched &&\r\n workexperienceForm.get('toDate')?.hasError('required')\">\r\n To Date is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Job Description</div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <textarea placeholder=\"Describe your role and responsibilities\" formControlName=\"jobDescription\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n <div class=\"upload-wrapper\">\r\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\r\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\r\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your employment contract, offer letter, or reference letter (PDF, DOC, DOCX)</p>\r\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\r\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\r\n Upload Document\r\n </button>\r\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\r\n <p class=\"file-name\" *ngIf=\"fileName\">\r\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\r\n {{ fileName }}\r\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\r\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\r\n </button>\r\n <div class=\"right-actions\">\r\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\r\n class=\"secondary\" (click)=\"nextStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\r\n (click)=\"saveFile()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Success Toast -->\r\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\r\n <div class=\"step-toast-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"step-toast-body\">\r\n <div class=\"step-toast-title\">Saved Successfully</div>\r\n <div class=\"step-toast-msg\">Work experience has been saved.</div>\r\n </div>\r\n <div class=\"step-toast-progress\"></div>\r\n</div>\r\n\r\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\r\n <div class=\"preview-header\">\r\n <div class=\"preview-header-icon\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"20\" height=\"20\" />\r\n </div>\r\n <div>\r\n <h3 class=\"preview-header-title\">Work Experience</h3>\r\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"preview-timeline\">\r\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\r\n class=\"timeline-entry\" [class.last]=\"last\">\r\n <div class=\"timeline-track\">\r\n <div class=\"timeline-dot\"></div>\r\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\r\n </div>\r\n <div class=\"timeline-card\">\r\n <div class=\"tc-head\">\r\n <div class=\"tc-avatar\">{{ (exp.companyName || exp.jobTitle || '?').charAt(0).toUpperCase() }}</div>\r\n <div class=\"tc-title-block\">\r\n <span class=\"tc-title\">{{ exp.jobTitle }}</span>\r\n <span class=\"tc-subtitle\">{{ exp.companyName }}</span>\r\n </div>\r\n <div class=\"tc-actions\">\r\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\r\n </button>\r\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"detail-row\">\r\n <div class=\"detail-item\" *ngIf=\"exp.fromDate || exp.toDate\">\r\n <span class=\"detail-label\">Duration</span>\r\n <span class=\"detail-value\">{{ exp.fromDate | date:'MMM yyyy' }}{{ exp.toDate ? ' \u2013 ' + (exp.toDate | date:'MMM yyyy') : ' \u2013 Present' }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\r\n <span class=\"detail-label\">Location</span>\r\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.country\">\r\n <span class=\"detail-label\">Country</span>\r\n <span class=\"detail-value\">{{ exp.country }}</span>\r\n </div>\r\n </div>\r\n <p class=\"tc-description\" *ngIf=\"exp.jobDescription\">{{ exp.jobDescription }}</p>\r\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\r\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\r\n {{ exp.fileName }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\r\n Add More\r\n </button>\r\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input,select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input.is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 0 20px}.action{display:flex;justify-content:space-between;margin:24px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.job-title{color:#69707d;font-weight:400;font-size:14px}.edit-icon{cursor:pointer}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.form-check-input{width:auto!important;height:auto!important}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.detail-grid{grid-template-columns:1fr}.actions,.action{flex-direction:column-reverse;gap:8px}.action{margin:48px 0 20px}.right-actions{justify-content:space-between;gap:8px;display:flex;flex-direction:column-reverse}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.form-row{gap:14px;flex-direction:column}.pointer{display:none}.add-btn{width:unset}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
36122
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: WorkexperienceComponent, isStandalone: false, selector: "app-workexperience", inputs: { providerId: "providerId", providerName: "providerName", cloudfrontUrl: "cloudfrontUrl" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!showpreview()\">\n <div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Add Work Experience</h3>\n <p class=\"step-card-subtitle\">Add your prior and current work history below</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n <form [formGroup]=\"workexperienceForm\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Basic Information</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Company Name <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your company name here\" formControlName=\"companyName\" />\n <small class=\"error\" *ngIf=\"workexperienceForm.get('companyName')?.touched &&\n workexperienceForm.get('companyName')?.hasError('required')\">\n Company name is required\n </small>\n </div>\n <div class=\"field\">\n <div class=\"head\">Job Title <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your job title here\" formControlName=\"jobTitle\" />\n <small class=\"error\" *ngIf=\"workexperienceForm.get('jobTitle')?.touched &&\n workexperienceForm.get('jobTitle')?.hasError('required')\">\n Job title is required\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Location &amp; Timeline</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\n &nbsp;{{ item.country }}\n </ng-template>\n </ng-select>\n </div>\n <div class=\"field\">\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\n placeholder=\"Select State\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\n &nbsp;{{ item.stateName }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n </div>\n <div class=\"row form-row\">\n <div class=\"field\">\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\n <small class=\"error\" *ngIf=\"workexperienceForm.get('city')?.touched &&\n workexperienceForm.get('city')?.hasError('required')\">\n City is required\n </small>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" bsDatepicker [maxDate]=\"maxDate\"\n [bsConfig]=\"{ adaptivePosition: true, isAnimated: true, showWeekNumbers: false,\n customTodayClass: !workexperienceForm.get('fromDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"fromDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"workexperienceForm.get('fromDate')?.touched &&\n workexperienceForm.get('fromDate')?.hasError('required')\">\n Start Date is required\n </small>\n </div>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !workexperienceForm.get('toDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"toDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"workexperienceForm.get('toDate')?.touched &&\n workexperienceForm.get('toDate')?.hasError('required')\">\n To Date is required\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Job Description</div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <textarea placeholder=\"Describe your role and responsibilities\" formControlName=\"jobDescription\"></textarea>\n </div>\n </div>\n </div>\n\n </form>\n\n <div class=\"upload-wrapper\">\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your employment contract, offer letter, or reference letter (PDF, DOC, DOCX)</p>\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\n Upload Document\n </button>\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\n <p class=\"file-name\" *ngIf=\"fileName\">\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\n {{ fileName }}\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\n </p>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\n </button>\n <div class=\"right-actions\">\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\n class=\"secondary\" (click)=\"nextStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\n (click)=\"saveFile()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<!-- Success Toast -->\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\n <div class=\"step-toast-icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"step-toast-body\">\n <div class=\"step-toast-title\">Saved Successfully</div>\n <div class=\"step-toast-msg\">Work experience has been saved.</div>\n </div>\n <div class=\"step-toast-progress\"></div>\n</div>\n\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\n <div class=\"preview-header\">\n <div class=\"preview-header-icon\">\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"20\" height=\"20\" />\n </div>\n <div>\n <h3 class=\"preview-header-title\">Work Experience</h3>\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\n </div>\n </div>\n\n <div class=\"preview-timeline\">\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\n class=\"timeline-entry\" [class.last]=\"last\">\n <div class=\"timeline-track\">\n <div class=\"timeline-dot\"></div>\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\n </div>\n <div class=\"timeline-card\">\n <div class=\"tc-head\">\n <div class=\"tc-avatar\">{{ (exp.companyName || exp.jobTitle || '?').charAt(0).toUpperCase() }}</div>\n <div class=\"tc-title-block\">\n <span class=\"tc-title\">{{ exp.jobTitle }}</span>\n <span class=\"tc-subtitle\">{{ exp.companyName }}</span>\n </div>\n <div class=\"tc-actions\">\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n </button>\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-item\" *ngIf=\"exp.fromDate || exp.toDate\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{ exp.fromDate | date:'MMM yyyy' }}{{ exp.toDate ? ' \u2013 ' + (exp.toDate | date:'MMM yyyy') : ' \u2013 Present' }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\n <span class=\"detail-label\">Location</span>\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.country\">\n <span class=\"detail-label\">Country</span>\n <span class=\"detail-value\">{{ exp.country }}</span>\n </div>\n </div>\n <p class=\"tc-description\" *ngIf=\"exp.jobDescription\">{{ exp.jobDescription }}</p>\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\n {{ exp.fileName }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\n Add More\n </button>\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input,select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input.is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 0 20px}.action{display:flex;justify-content:space-between;margin:24px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.job-title{color:#69707d;font-weight:400;font-size:14px}.edit-icon{cursor:pointer}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.form-check-input{width:auto!important;height:auto!important}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.detail-grid{grid-template-columns:1fr}.actions,.action{flex-direction:column-reverse;gap:8px}.action{margin:48px 0 20px}.right-actions{justify-content:space-between;gap:8px;display:flex;flex-direction:column-reverse}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.form-row{gap:14px;flex-direction:column}.pointer{display:none}.add-btn{width:unset}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i12.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i12.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i11$1.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i11$1.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: Ng2LoadingSpinnerDirective, selector: "[ng2-loading]", inputs: ["ng2-loading", "config", "template"] }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: StateNamePipe, name: "stateName" }] });
36123
36123
  }
36124
36124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WorkexperienceComponent, decorators: [{
36125
36125
  type: Component,
36126
- args: [{ selector: 'app-workexperience', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!showpreview()\">\r\n <div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Add Work Experience</h3>\r\n <p class=\"step-card-subtitle\">Add your prior and current work history below</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n <form [formGroup]=\"workexperienceForm\">\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Basic Information</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Company Name <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your company name here\" formControlName=\"companyName\" />\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('companyName')?.touched &&\r\n workexperienceForm.get('companyName')?.hasError('required')\">\r\n Company name is required\r\n </small>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">Job Title <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter your job title here\" formControlName=\"jobTitle\" />\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('jobTitle')?.touched &&\r\n workexperienceForm.get('jobTitle')?.hasError('required')\">\r\n Job title is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Location &amp; Timeline</div>\r\n <div class=\"row\">\r\n <div class=\"field\">\r\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\r\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\r\n &nbsp;{{ item.country }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"field\">\r\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\r\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\r\n placeholder=\"Select State\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\r\n &nbsp;{{ item.stateName }}\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\r\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\r\n </span>\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"row form-row\">\r\n <div class=\"field\">\r\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\r\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('city')?.touched &&\r\n workexperienceForm.get('city')?.hasError('required')\">\r\n City is required\r\n </small>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" bsDatepicker [maxDate]=\"maxDate\"\r\n [bsConfig]=\"{ adaptivePosition: true, isAnimated: true, showWeekNumbers: false,\r\n customTodayClass: !workexperienceForm.get('fromDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"fromDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('fromDate')?.touched &&\r\n workexperienceForm.get('fromDate')?.hasError('required')\">\r\n Start Date is required\r\n </small>\r\n </div>\r\n </div>\r\n <div class=\"field date\">\r\n <div class=\"mb-3 head\">\r\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\r\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\r\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\r\n customTodayClass: !workexperienceForm.get('toDate')?.value ? 'today-highlight' : '' }\"\r\n formControlName=\"toDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\r\n <small class=\"error\" *ngIf=\"workexperienceForm.get('toDate')?.touched &&\r\n workexperienceForm.get('toDate')?.hasError('required')\">\r\n To Date is required\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-section\">\r\n <div class=\"field-section-title\">Job Description</div>\r\n <div class=\"row\">\r\n <div class=\"field full-width\">\r\n <textarea placeholder=\"Describe your role and responsibilities\" formControlName=\"jobDescription\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n <div class=\"upload-wrapper\">\r\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\r\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\r\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your employment contract, offer letter, or reference letter (PDF, DOC, DOCX)</p>\r\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\r\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\r\n Upload Document\r\n </button>\r\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\r\n <p class=\"file-name\" *ngIf=\"fileName\">\r\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\r\n {{ fileName }}\r\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\r\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\r\n </button>\r\n <div class=\"right-actions\">\r\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\r\n class=\"secondary\" (click)=\"nextStep()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\r\n (click)=\"saveFile()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Success Toast -->\r\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\r\n <div class=\"step-toast-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"step-toast-body\">\r\n <div class=\"step-toast-title\">Saved Successfully</div>\r\n <div class=\"step-toast-msg\">Work experience has been saved.</div>\r\n </div>\r\n <div class=\"step-toast-progress\"></div>\r\n</div>\r\n\r\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\r\n <div class=\"preview-header\">\r\n <div class=\"preview-header-icon\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"20\" height=\"20\" />\r\n </div>\r\n <div>\r\n <h3 class=\"preview-header-title\">Work Experience</h3>\r\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"preview-timeline\">\r\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\r\n class=\"timeline-entry\" [class.last]=\"last\">\r\n <div class=\"timeline-track\">\r\n <div class=\"timeline-dot\"></div>\r\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\r\n </div>\r\n <div class=\"timeline-card\">\r\n <div class=\"tc-head\">\r\n <div class=\"tc-avatar\">{{ (exp.companyName || exp.jobTitle || '?').charAt(0).toUpperCase() }}</div>\r\n <div class=\"tc-title-block\">\r\n <span class=\"tc-title\">{{ exp.jobTitle }}</span>\r\n <span class=\"tc-subtitle\">{{ exp.companyName }}</span>\r\n </div>\r\n <div class=\"tc-actions\">\r\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\r\n </button>\r\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\r\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"detail-row\">\r\n <div class=\"detail-item\" *ngIf=\"exp.fromDate || exp.toDate\">\r\n <span class=\"detail-label\">Duration</span>\r\n <span class=\"detail-value\">{{ exp.fromDate | date:'MMM yyyy' }}{{ exp.toDate ? ' \u2013 ' + (exp.toDate | date:'MMM yyyy') : ' \u2013 Present' }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\r\n <span class=\"detail-label\">Location</span>\r\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\r\n </div>\r\n <div class=\"detail-item\" *ngIf=\"exp.country\">\r\n <span class=\"detail-label\">Country</span>\r\n <span class=\"detail-value\">{{ exp.country }}</span>\r\n </div>\r\n </div>\r\n <p class=\"tc-description\" *ngIf=\"exp.jobDescription\">{{ exp.jobDescription }}</p>\r\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\r\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\r\n {{ exp.fileName }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\r\n Add More\r\n </button>\r\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\r\n Continue\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input,select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input.is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 0 20px}.action{display:flex;justify-content:space-between;margin:24px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.job-title{color:#69707d;font-weight:400;font-size:14px}.edit-icon{cursor:pointer}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.form-check-input{width:auto!important;height:auto!important}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.detail-grid{grid-template-columns:1fr}.actions,.action{flex-direction:column-reverse;gap:8px}.action{margin:48px 0 20px}.right-actions{justify-content:space-between;gap:8px;display:flex;flex-direction:column-reverse}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.form-row{gap:14px;flex-direction:column}.pointer{display:none}.add-btn{width:unset}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"] }]
36126
+ args: [{ selector: 'app-workexperience', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!showpreview()\">\n <div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Add Work Experience</h3>\n <p class=\"step-card-subtitle\">Add your prior and current work history below</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n <form [formGroup]=\"workexperienceForm\">\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Basic Information</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Company Name <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your company name here\" formControlName=\"companyName\" />\n <small class=\"error\" *ngIf=\"workexperienceForm.get('companyName')?.touched &&\n workexperienceForm.get('companyName')?.hasError('required')\">\n Company name is required\n </small>\n </div>\n <div class=\"field\">\n <div class=\"head\">Job Title <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter your job title here\" formControlName=\"jobTitle\" />\n <small class=\"error\" *ngIf=\"workexperienceForm.get('jobTitle')?.touched &&\n workexperienceForm.get('jobTitle')?.hasError('required')\">\n Job title is required\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Location &amp; Timeline</div>\n <div class=\"row\">\n <div class=\"field\">\n <div class=\"head\">Country <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"country\" [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode2\"\n [clearable]=\"false\" placeholder=\"Select Country\" (change)=\"onCountryChange($event)\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" readonly />\n &nbsp;{{ item.country }}\n </ng-template>\n </ng-select>\n </div>\n <div class=\"field\">\n <div class=\"head\">State <span class=\"text-danger\">*</span></div>\n <ng-select formControlName=\"state\" [items]=\"states\" bindLabel=\"stateName\" bindValue=\"stateCode\"\n placeholder=\"Select State\">\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"item$.selected\" />\n &nbsp;{{ item.stateName }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\n <span class=\"ng-value-label\">{{ item.stateName }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\">\n <img src=\"/assets/images/icons/close-sm-circle.svg\" class=\"close-btn-select\" />\n </span>\n </ng-template>\n </ng-select>\n </div>\n </div>\n <div class=\"row form-row\">\n <div class=\"field\">\n <div class=\"head\">City <span class=\"text-danger\">*</span></div>\n <input type=\"text\" placeholder=\"Enter City here\" formControlName=\"city\" />\n <small class=\"error\" *ngIf=\"workexperienceForm.get('city')?.touched &&\n workexperienceForm.get('city')?.hasError('required')\">\n City is required\n </small>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">Start Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"Start date\" bsDatepicker [maxDate]=\"maxDate\"\n [bsConfig]=\"{ adaptivePosition: true, isAnimated: true, showWeekNumbers: false,\n customTodayClass: !workexperienceForm.get('fromDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"fromDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"workexperienceForm.get('fromDate')?.touched &&\n workexperienceForm.get('fromDate')?.hasError('required')\">\n Start Date is required\n </small>\n </div>\n </div>\n <div class=\"field date\">\n <div class=\"mb-3 head\">\n <div class=\"head\">To Date <span class=\"text-danger\">*</span></div>\n <input class=\"form-control date-time-filter\" placeholder=\"To date\" bsDatepicker\n [bsConfig]=\"{ adaptivePosition: true,showWeekNumbers: false, isAnimated: true,\n customTodayClass: !workexperienceForm.get('toDate')?.value ? 'today-highlight' : '' }\"\n formControlName=\"toDate\" (bsValueChange)=\"onPreferredDateChange($event)\">\n <small class=\"error\" *ngIf=\"workexperienceForm.get('toDate')?.touched &&\n workexperienceForm.get('toDate')?.hasError('required')\">\n To Date is required\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"field-section\">\n <div class=\"field-section-title\">Job Description</div>\n <div class=\"row\">\n <div class=\"field full-width\">\n <textarea placeholder=\"Describe your role and responsibilities\" formControlName=\"jobDescription\"></textarea>\n </div>\n </div>\n </div>\n\n </form>\n\n <div class=\"upload-wrapper\">\n <p *ngIf=\"!fileName\" class=\"upload-title\">Supporting Documents</p>\n <p *ngIf=\"fileName\" class=\"upload-title\">Uploaded File</p>\n <p *ngIf=\"!fileName\" class=\"upload-subtitle\">Upload your employment contract, offer letter, or reference letter (PDF, DOC, DOCX)</p>\n <small *ngIf=\"!fileName\" class=\"text-muted d-block mb-2\" style=\"font-size: 12px;\">Allowed formats: PDF, DOC, DOCX</small>\n <button *ngIf=\"!fileName\" type=\"button\" class=\"upload-btn\" (click)=\"fileInput.click()\">\n Upload Document\n </button>\n <input #fileInput type=\"file\" accept=\".pdf,.doc,.docx\" (change)=\"selectFile($event)\" hidden />\n <p class=\"file-name\" *ngIf=\"fileName\">\n <img src=\"/assets/images/icons/file.png\" class=\"file-icon\" alt=\"file\" />\n {{ fileName }}\n <span class=\"remove-file\" (click)=\"removeFile()\">\u2716</span>\n </p>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"handleLeftButton()\">\n <svg *ngIf=\"showedit || isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\n <svg *ngIf=\"!showedit && !isAdding()\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n {{ showedit || isAdding() ? 'Cancel' : 'Back' }}\n </button>\n <div class=\"right-actions\">\n <button *ngIf=\"!showedit && !isAdding() && workStore.experiences().length === 0\" type=\"button\"\n class=\"secondary\" (click)=\"nextStep()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" [disabled]=\"proposalLoader\" [ng2-loading]=\"proposalLoader\"\n (click)=\"saveFile()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n {{ showedit && !isAdding() ? 'Update' : 'Save & Continue' }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<!-- Success Toast -->\n<div class=\"step-toast\" *ngIf=\"showSuccess()\">\n <div class=\"step-toast-icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M20 6L9 17l-5-5\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"step-toast-body\">\n <div class=\"step-toast-title\">Saved Successfully</div>\n <div class=\"step-toast-msg\">Work experience has been saved.</div>\n </div>\n <div class=\"step-toast-progress\"></div>\n</div>\n\n<div class=\"work-preview\" *ngIf=\"showpreview()\">\n <div class=\"preview-header\">\n <div class=\"preview-header-icon\">\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"work experience\" width=\"20\" height=\"20\" />\n </div>\n <div>\n <h3 class=\"preview-header-title\">Work Experience</h3>\n <p class=\"preview-subtitle\">{{ workStore.experiences().length }} record{{ workStore.experiences().length !== 1 ? 's' : '' }} added</p>\n </div>\n </div>\n\n <div class=\"preview-timeline\">\n <div *ngFor=\"let exp of workStore.experiences(); let i = index; let last = last\"\n class=\"timeline-entry\" [class.last]=\"last\">\n <div class=\"timeline-track\">\n <div class=\"timeline-dot\"></div>\n <div class=\"timeline-line\" *ngIf=\"!last\"></div>\n </div>\n <div class=\"timeline-card\">\n <div class=\"tc-head\">\n <div class=\"tc-avatar\">{{ (exp.companyName || exp.jobTitle || '?').charAt(0).toUpperCase() }}</div>\n <div class=\"tc-title-block\">\n <span class=\"tc-title\">{{ exp.jobTitle }}</span>\n <span class=\"tc-subtitle\">{{ exp.companyName }}</span>\n </div>\n <div class=\"tc-actions\">\n <button class=\"icon-btn edit-btn\" (click)=\"edit(i)\" title=\"Edit\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n </button>\n <button class=\"icon-btn delete-btn\" (click)=\"delete(i)\" [disabled]=\"deletingIndex() === i\" title=\"Delete\">\n <span *ngIf=\"deletingIndex() === i\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingIndex() !== i\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-item\" *ngIf=\"exp.fromDate || exp.toDate\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{ exp.fromDate | date:'MMM yyyy' }}{{ exp.toDate ? ' \u2013 ' + (exp.toDate | date:'MMM yyyy') : ' \u2013 Present' }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.city || exp.state\">\n <span class=\"detail-label\">Location</span>\n <span class=\"detail-value\">{{ exp.city }}{{ exp.city && (exp.state | stateName) ? ', ' : '' }}{{ exp.state | stateName }}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"exp.country\">\n <span class=\"detail-label\">Country</span>\n <span class=\"detail-value\">{{ exp.country }}</span>\n </div>\n </div>\n <p class=\"tc-description\" *ngIf=\"exp.jobDescription\">{{ exp.jobDescription }}</p>\n <div class=\"tc-attachment\" *ngIf=\"exp.fileUrl\">\n <a [href]=\"cloudfrontUrl + exp.fileUrl\" target=\"_blank\" class=\"attachment-link\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>\n {{ exp.fileName }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"add()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>\n Add More\n </button>\n <button type=\"button\" class=\"primary\" (click)=\"nextStep()\">\n Continue\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".icon-color{cursor:pointer;width:20px;height:20px;background:transparent;transition:transform .3s ease;filter:brightness(0) saturate(100%) invert(48%) sepia(8%) saturate(350%) hue-rotate(170deg) brightness(92%) contrast(88%)}.icon-color.edit{width:18px;height:18px}.education-container{max-width:1000px;margin:0 auto;padding:28px 24px;min-height:300px;background:#fff}h3{font-size:18px;font-weight:700;color:#1e293b;margin-bottom:4px}.hint{font-size:14px;color:#69707d;margin-bottom:24px}.row{display:flex;margin-bottom:16px;gap:16px}.field{flex:1;display:flex;flex-direction:column}.field.full-width{flex:1 1 100%}.field.city{flex:0 0 50%}.field.date{flex:0 0 25%}.form-row{display:flex;gap:16px}.head{font-size:12px;font-weight:700;color:#69707d;letter-spacing:.05em;margin-bottom:6px}input,select,textarea{height:42px;padding:10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}input:focus,select:focus,textarea:focus{border-color:#4077ad;background:#fff;box-shadow:0 0 0 3px #4077ad1f;outline:none}input::placeholder,select::placeholder,textarea::placeholder{color:#69707d;font-size:14px}input.is-invalid,select.is-invalid,textarea.is-invalid{border-color:#ef4444}textarea{height:auto;min-height:96px;padding-top:12px;resize:vertical}::ng-deep .ng-select.ng-select-single .ng-select-container{min-height:42px;height:auto;border:1.5px solid #e2e8f0;border-radius:8px;background:#f9fafb;font-size:14px;color:#1e293b;transition:all .2s ease}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-left:14px}::ng-deep .ng-select.ng-select-single .ng-select-container .ng-value-container .ng-placeholder{top:10px;color:#69707d}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#69707d;font-size:14px}::ng-deep .ng-select.ng-select-focused .ng-select-container,::ng-deep .ng-select.ng-select-opened>.ng-select-container{border-color:#4077ad!important;box-shadow:0 0 0 3px #4077ad1f;background:#fff}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{font-size:14px}::ng-deep .ng-value-label{font-size:14px}.error{margin-top:4px;font-size:12px;color:#ef4444}.actions{display:flex;justify-content:space-between;margin:48px 0 20px}.action{display:flex;justify-content:space-between;margin:24px 0 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none}.upload-wrapper{margin-top:28px;padding:20px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.upload-title{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:4px}.upload-subtitle{font-size:12px;color:#69707d;margin-bottom:12px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:#fff;color:#69707d;border:1.5px dashed #e2e8f0;padding:10px 18px;border-radius:5px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.upload-btn:hover{border-color:#4077ad;border-style:solid;color:#4077ad;background:#ebf2f9}.file-name{margin-top:8px;font-size:12px;color:#69707d}.remove-file{margin-left:10px;cursor:pointer;color:#ef4444;font-weight:700;transition:all .2s ease}.remove-file:hover{opacity:.75}.file-icon{width:23px;height:23px}.date-time-filter{height:42px;padding:10px 40px 10px 14px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:14px;color:#1e293b;background:#f9fafb;background-image:url(/assets/images/icons/calendar.svg);background-repeat:no-repeat;background-position:right 12px center;background-size:18px 18px;cursor:pointer;transition:all .2s ease;width:100%;box-sizing:border-box;outline:none}.date-time-filter:focus{border-color:#4077ad;background-color:#fff;box-shadow:0 0 0 3px #4077ad1f}.work-preview{max-width:860px;padding:24px 0;margin:0 auto;background:#fff}.preview-header{display:flex;align-items:center;gap:14px;margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid #e2e8f0}.preview-header-icon{width:42px;height:42px;background:#ebf2f9;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.preview-header-title{font-size:18px;font-weight:700;color:#1e293b;margin:0 0 2px}.preview-subtitle{font-size:12px;color:#69707d;margin:0}.preview-timeline{display:flex;flex-direction:column;margin-bottom:28px}.timeline-entry{display:flex}.timeline-entry.last .timeline-line{display:none}.timeline-track{display:none;flex-direction:column;align-items:center;width:28px;flex-shrink:0;padding-top:22px}.timeline-dot{width:11px;height:11px;border-radius:50%;background:#4077ad;box-shadow:0 0 0 3px #ebf2f9;flex-shrink:0;z-index:1}.timeline-line{width:2px;flex:1;min-height:20px;background:linear-gradient(to bottom,#4077ad,#e2e8f0);margin-top:5px}.timeline-card{flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 18px;margin:0 0 14px 14px;box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a;transition:box-shadow .18s ease,transform .18s ease}.timeline-card:hover{box-shadow:0 4px 6px -1px #00000012,0 2px 4px -1px #0000000a;transform:translateY(-1px)}.tc-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.tc-avatar{width:36px;height:36px;border-radius:9px;background:linear-gradient(135deg,#4077ad,#2d5a8a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.tc-title-block{flex:1;min-width:0}.tc-title{display:block;font-size:16px;font-weight:700;color:#4077ad;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.tc-subtitle{display:block;font-size:12px;color:#69707d;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-actions{display:flex;gap:2px;flex-shrink:0;margin-top:-2px}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;padding:0}.icon-btn.edit-btn{color:#4077ad}.icon-btn.edit-btn:hover{background:#ebf2f9}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.tc-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:500;line-height:1.6;white-space:nowrap}.chip.chip-date{background:#ebf2f9;color:#4077ad}.chip.chip-location{background:#f0fdf4;color:#15803d}.chip.chip-type{background:#faf5ff;color:#7c3aed}.chip.chip-country{background:#f8fafc;color:#69707d;border:1px solid #e2e8f0}.chip.chip-number{background:#fff7ed;color:#c2410c;font-family:monospace;font-size:11px}.chip.chip-expiry{background:#fffbeb;color:#b45309}.tc-description{font-size:12px;color:#69707d;line-height:1.55;margin:6px 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tc-attachment{padding-top:8px;border-top:1px solid #e2e8f0;margin-top:8px}.attachment-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:#4077ad;text-decoration:none}.attachment-link:hover{text-decoration:underline}.job-title{color:#69707d;font-weight:400;font-size:14px}.edit-icon{cursor:pointer}.add-btn{width:200px;background:#4077ad;color:#fff;border:none;border-radius:5px;height:42px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.add-btn:hover{background:#2d5a8a;transform:translateY(-1px);box-shadow:0 1px 3px #00000014,0 1px 2px #0000000a}.add-btn:active{transform:translateY(0)}.close-btn-select{width:16px;height:16px;color:#4077ad;display:inline-block}::ng-deep .today-highlight{color:#fff!important;background:#4077ad!important}::ng-deep .bs-datepicker-head{background-color:#4077ad!important}::ng-deep .theme-green .bs-datepicker-body table td span.selected,.theme-green .bs-datepicker-body table td.selected span,.theme-green .bs-datepicker-body table td span[class*=select-]:after,.theme-green .bs-datepicker-body table td[class*=select-] span:after{background-color:#4077ad!important}::ng-deep ng-dropdown-panel input[type=checkbox]{margin-right:0!important;padding:9px;margin-top:0;accent-color:#4077AD}.form-check-input:checked{color:#fff!important;border-color:#4077ad!important;background-color:#4077ad!important}.form-check-input{width:auto!important;height:auto!important}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}@media (max-width: 600px){.preview-card{padding:15px}.edit-btn{top:10px;right:10px;width:18px;height:18px}.card-meta{flex-direction:column;gap:3px}}@media screen and (max-width: 767px){.education-container{padding:16px}h3{font-size:18px}input,select,textarea{font-size:16px}.detail-grid{grid-template-columns:1fr}.actions,.action{flex-direction:column-reverse;gap:8px}.action{margin:48px 0 20px}.right-actions{justify-content:space-between;gap:8px;display:flex;flex-direction:column-reverse}.row{flex-direction:column}.field.date,.field.city{flex:1 1 100%}.form-row{gap:14px;flex-direction:column}.pointer{display:none}.add-btn{width:unset}button{width:100%}}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.confirm-modal-card .btn{border-radius:5px!important;box-shadow:none!important;font-size:14px}.confirm-modal-card .btn.btn-outline-secondary{background-color:#d4dae6!important;border-color:#d4dae6!important;color:#69707d!important}.confirm-modal-card .btn.btn-outline-secondary:hover:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:focus:not(:disabled),.confirm-modal-card .btn.btn-outline-secondary:active:not(:disabled){background-color:#c2cbde!important;border-color:#c2cbde!important;color:#69707d!important}.confirm-modal-card .btn.btn-danger{background-color:#b43026!important;border-color:#b43026!important;color:#fff!important}.confirm-modal-card .btn.btn-danger:hover:not(:disabled),.confirm-modal-card .btn.btn-danger:focus:not(:disabled),.confirm-modal-card .btn.btn-danger:active:not(:disabled){background-color:#96271f!important;border-color:#96271f!important;color:#fff!important}\n"] }]
36127
36127
  }], ctorParameters: () => [{ type: UserExperienceService }, { type: UserService }, { type: WorkExperienceStore }, { type: CredentialingStore }, { type: CountryServices }, { type: PostalCodeServices }, { type: i1$3.TokenService }, { type: i1$3.RoleContextService }, { type: i7.FormBuilder }, { type: FileService }, { type: i1.HttpClient }], propDecorators: { providerId: [{
36128
36128
  type: Input
36129
36129
  }], providerName: [{
@@ -36815,11 +36815,11 @@ class ProfessionComponent {
36815
36815
  this.store.nextStep();
36816
36816
  }
36817
36817
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ProfessionComponent, deps: [{ token: CredentialingStore }], target: i0.ɵɵFactoryTarget.Component });
36818
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: ProfessionComponent, isStandalone: false, selector: "app-profession", inputs: { providerId: "providerId", providerName: "providerName", roleData: "roleData" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"profession\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Profession</h3>\r\n <p class=\"step-card-subtitle\">Pick the professions that apply to you, or add your own</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n <div class=\"field-section\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\r\n {{ selectedProfessionCount }} selected\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\r\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\r\n (keydown.enter)=\"createManualProfessionRow()\" />\r\n </div>\r\n\r\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\r\n <div class=\"profession-acc-columns\">\r\n <span></span>\r\n <span>Profession Name</span>\r\n <span>Group</span>\r\n <span>Type</span>\r\n <span></span>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\r\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\r\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\r\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\r\n (change)=\"onProfessionRowCheck(p, $event)\" />\r\n </div>\r\n <div class=\"profession-acc-name\">\r\n {{ p.professionName }}\r\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\r\n <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"icon-btn delete-btn\"\r\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionId() === p.id\" title=\"Delete\">\r\n <span *ngIf=\"deletingProfessionId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingProfessionId() !== p.id\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n <div class=\"profession-acc-group\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else groupText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\r\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\r\n placeholder=\"Select group\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\r\n </div>\r\n <div class=\"profession-acc-type\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else typeText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\r\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\r\n placeholder=\"Select type\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\r\n </div>\r\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\r\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\r\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\r\n <div class=\"profession-acc-panel\">\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\r\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\r\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\r\n (click)=\"copyToAllProfessions(p.id)\" />\r\n Copy to all\r\n </label>\r\n </div>\r\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\r\n Select a Group and Type above to enable saving this profession.\r\n </div>\r\n <div class=\"profession-acc-fields\">\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\r\n <div class=\"profession-acc-stars\">\r\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\r\n (click)=\"setProfessionRowStars(p, s)\"\r\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\r\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\r\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\r\n <span class=\"small text-muted\">Yrs</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--visibility\">\r\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\r\n [name]=\"'profVis-' + p.id\" />\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--notes\">\r\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\r\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\r\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\r\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\r\n Add \"{{ professionSearchQry?.trim() }}\"\r\n </button>\r\n </div>\r\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\r\n class=\"text-center text-muted small py-3\">\r\n No professions found.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" *ngIf=\"selectedProfessionCount === 0\" (click)=\"skip()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" *ngIf=\"selectedProfessionCount > 0\"\r\n [disabled]=\"isSavingProfessionsTable\" (click)=\"saveAndContinue()\">\r\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n <ng-container *ngIf=\"!isSavingProfessionsTable\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n Save &amp; Continue\r\n </ng-container>\r\n <ng-container *ngIf=\"isSavingProfessionsTable\">Saving...</ng-container>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:inline-flex;align-items:center;justify-content:center}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1.4fr 1fr 1fr 32px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical}.section-flag{font-weight:600}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i7.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }] });
36818
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: ProfessionComponent, isStandalone: false, selector: "app-profession", inputs: { providerId: "providerId", providerName: "providerName", roleData: "roleData" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"profession\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Profession</h3>\n <p class=\"step-card-subtitle\">Pick the professions that apply to you, or add your own</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n <div class=\"field-section\">\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\n {{ selectedProfessionCount }} selected\n </span>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\n (keydown.enter)=\"createManualProfessionRow()\" />\n </div>\n\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\n <div class=\"profession-acc-columns\">\n <span></span>\n <span>Profession Name</span>\n <span>Group</span>\n <span>Type</span>\n <span></span>\n </div>\n\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\n (change)=\"onProfessionRowCheck(p, $event)\" />\n </div>\n <div class=\"profession-acc-name\">\n {{ p.professionName }}\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\n <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"icon-btn delete-btn\"\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionId() === p.id\" title=\"Delete\">\n <span *ngIf=\"deletingProfessionId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingProfessionId() !== p.id\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n <div class=\"profession-acc-group\"\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\n <ng-container *ngIf=\"p.isManual; else groupText\">\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\n placeholder=\"Select group\" [clearable]=\"false\">\n </ng-select>\n </ng-container>\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\n </div>\n <div class=\"profession-acc-type\"\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\n <ng-container *ngIf=\"p.isManual; else typeText\">\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\n placeholder=\"Select type\" [clearable]=\"false\">\n </ng-select>\n </ng-container>\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\n </div>\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\n <div class=\"profession-acc-panel\">\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\n (click)=\"copyToAllProfessions(p.id)\" />\n Copy to all\n </label>\n </div>\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\n Select a Group and Type above to enable saving this profession.\n </div>\n <div class=\"profession-acc-fields\">\n <div class=\"profession-acc-field\">\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\n <div class=\"profession-acc-stars\">\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\n (click)=\"setProfessionRowStars(p, s)\"\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\n </div>\n </div>\n <div class=\"profession-acc-field\">\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\n <div class=\"d-flex align-items-center gap-2\">\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\n <span class=\"small text-muted\">Yrs</span>\n </div>\n </div>\n <div class=\"profession-acc-field profession-acc-field--visibility\">\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\n [name]=\"'profVis-' + p.id\" />\n </div>\n <div class=\"profession-acc-field profession-acc-field--notes\">\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\n Add \"{{ professionSearchQry?.trim() }}\"\n </button>\n </div>\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\n class=\"text-center text-muted small py-3\">\n No professions found.\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" *ngIf=\"selectedProfessionCount === 0\" (click)=\"skip()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" *ngIf=\"selectedProfessionCount > 0\"\n [disabled]=\"isSavingProfessionsTable\" (click)=\"saveAndContinue()\">\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\n <ng-container *ngIf=\"!isSavingProfessionsTable\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n Save &amp; Continue\n </ng-container>\n <ng-container *ngIf=\"isSavingProfessionsTable\">Saving...</ng-container>\n </button>\n </div>\n</div>\n", styles: [".profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:inline-flex;align-items:center;justify-content:center}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1.4fr 1fr 1fr 32px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical}.section-flag{font-weight:600}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i7.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i12.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }] });
36819
36819
  }
36820
36820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ProfessionComponent, decorators: [{
36821
36821
  type: Component,
36822
- args: [{ selector: 'app-profession', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\r\n <div class=\"confirm-modal-card\">\r\n <h4 class=\"mb-2\">Confirm Delete</h4>\r\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"step-card\">\r\n <div class=\"step-card-header\">\r\n <div class=\"step-card-header-icon\">\r\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"profession\" width=\"22\" height=\"22\" />\r\n </div>\r\n <div>\r\n <h3 class=\"step-card-title\">Profession</h3>\r\n <p class=\"step-card-subtitle\">Pick the professions that apply to you, or add your own</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-card-body\">\r\n <div class=\"field-section\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\r\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\r\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\r\n {{ selectedProfessionCount }} selected\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\r\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\r\n (keydown.enter)=\"createManualProfessionRow()\" />\r\n </div>\r\n\r\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\r\n <div class=\"profession-acc-columns\">\r\n <span></span>\r\n <span>Profession Name</span>\r\n <span>Group</span>\r\n <span>Type</span>\r\n <span></span>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\r\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\r\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\r\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\r\n (change)=\"onProfessionRowCheck(p, $event)\" />\r\n </div>\r\n <div class=\"profession-acc-name\">\r\n {{ p.professionName }}\r\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\r\n <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"icon-btn delete-btn\"\r\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionId() === p.id\" title=\"Delete\">\r\n <span *ngIf=\"deletingProfessionId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\r\n <svg *ngIf=\"deletingProfessionId() !== p.id\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\r\n </button>\r\n </div>\r\n <div class=\"profession-acc-group\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else groupText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\r\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\r\n placeholder=\"Select group\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\r\n </div>\r\n <div class=\"profession-acc-type\"\r\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\r\n <ng-container *ngIf=\"p.isManual; else typeText\">\r\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\r\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\r\n placeholder=\"Select type\" [clearable]=\"false\">\r\n </ng-select>\r\n </ng-container>\r\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\r\n </div>\r\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\r\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\r\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\r\n <div class=\"profession-acc-panel\">\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\r\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\r\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\r\n (click)=\"copyToAllProfessions(p.id)\" />\r\n Copy to all\r\n </label>\r\n </div>\r\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\r\n Select a Group and Type above to enable saving this profession.\r\n </div>\r\n <div class=\"profession-acc-fields\">\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\r\n <div class=\"profession-acc-stars\">\r\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\r\n (click)=\"setProfessionRowStars(p, s)\"\r\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\r\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field\">\r\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\r\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\r\n <span class=\"small text-muted\">Yrs</span>\r\n </div>\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--visibility\">\r\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\r\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\r\n [name]=\"'profVis-' + p.id\" />\r\n </div>\r\n <div class=\"profession-acc-field profession-acc-field--notes\">\r\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\r\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\r\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\r\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\r\n Add \"{{ professionSearchQry?.trim() }}\"\r\n </button>\r\n </div>\r\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\r\n class=\"text-center text-muted small py-3\">\r\n No professions found.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"actions\">\r\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\r\n Back\r\n </button>\r\n <div class=\"right-actions\">\r\n <button type=\"button\" class=\"secondary\" *ngIf=\"selectedProfessionCount === 0\" (click)=\"skip()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\r\n Skip\r\n </button>\r\n <button type=\"button\" class=\"primary\" *ngIf=\"selectedProfessionCount > 0\"\r\n [disabled]=\"isSavingProfessionsTable\" (click)=\"saveAndContinue()\">\r\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\r\n <ng-container *ngIf=\"!isSavingProfessionsTable\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n Save &amp; Continue\r\n </ng-container>\r\n <ng-container *ngIf=\"isSavingProfessionsTable\">Saving...</ng-container>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:inline-flex;align-items:center;justify-content:center}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1.4fr 1fr 1fr 32px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical}.section-flag{font-weight:600}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}\n"] }]
36822
+ args: [{ selector: 'app-profession', standalone: false, template: "<div class=\"modal-overlay\" *ngIf=\"deleteConfirmMessage\" style=\"z-index: 9999999;\">\n <div class=\"confirm-modal-card\">\n <h4 class=\"mb-2\">Confirm Delete</h4>\n <p class=\"text-muted mb-4\">{{ deleteConfirmMessage }}</p>\n <div class=\"d-flex justify-content-end gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary h-auto\" (click)=\"onDeleteConfirmCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger h-auto\" (click)=\"onDeleteConfirmProceed()\">Delete</button>\n </div>\n </div>\n</div>\n\n<div class=\"step-card\">\n <div class=\"step-card-header\">\n <div class=\"step-card-header-icon\">\n <img src=\"/assets/images/icons/briefcase-fill.svg\" alt=\"profession\" width=\"22\" height=\"22\" />\n </div>\n <div>\n <h3 class=\"step-card-title\">Profession</h3>\n <p class=\"step-card-subtitle\">Pick the professions that apply to you, or add your own</p>\n </div>\n </div>\n\n <div class=\"step-card-body\">\n <div class=\"field-section\">\n <div class=\"d-flex justify-content-between align-items-center mb-3 section-header-row\">\n <div class=\"d-flex align-items-center gap-2 section-header-title\">\n <span *ngIf=\"selectedProfessionCount > 0\" class=\"badge border section-flag bg-warning-subtle text-warning\">\n {{ selectedProfessionCount }} selected\n </span>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <input type=\"text\" class=\"form-control profession-search-input\" placeholder=\"Search or Add Profession\"\n [(ngModel)]=\"professionSearchQry\" name=\"professionSearchQry\"\n (keydown.enter)=\"createManualProfessionRow()\" />\n </div>\n\n <div class=\"bg-white border rounded shadow-sm profession-accordion\">\n <div class=\"profession-acc-columns\">\n <span></span>\n <span>Profession Name</span>\n <span>Group</span>\n <span>Type</span>\n <span></span>\n </div>\n\n <ng-container *ngFor=\"let p of filteredProfessionTypes; trackBy: trackByProfessionId\">\n <div class=\"profession-acc-item\" [class.profession-row-selected]=\"getProfessionSelection(p.id).selected\">\n <div class=\"profession-acc-header\" (click)=\"toggleProfessionRow(p, $event)\">\n <div class=\"text-center profession-acc-checkbox\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"getProfessionSelection(p.id).selected\"\n (change)=\"onProfessionRowCheck(p, $event)\" />\n </div>\n <div class=\"profession-acc-name\">\n {{ p.professionName }}\n <span *ngIf=\"isProfessionSaved(p.id)\" class=\"badge border bg-success-subtle text-success ms-1\">Saved</span>\n <button *ngIf=\"isProfessionSaved(p.id)\" type=\"button\" class=\"icon-btn delete-btn\"\n (click)=\"deleteSavedProfession(p, $event)\" [disabled]=\"deletingProfessionId() === p.id\" title=\"Delete\">\n <span *ngIf=\"deletingProfessionId() === p.id\" class=\"spinner-border spinner-border-sm\"></span>\n <svg *ngIf=\"deletingProfessionId() !== p.id\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6\"/><path d=\"M10 11v6M14 11v6\"/><path d=\"M9 6V4a1 1 0 011-1h4a1 1 0 011 1v2\"/></svg>\n </button>\n </div>\n <div class=\"profession-acc-group\"\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\n <ng-container *ngIf=\"p.isManual; else groupText\">\n <ng-select class=\"profession-inline-select\" [items]=\"professionGroupOptions\" [ngModel]=\"p.professionGroup\"\n (ngModelChange)=\"setManualProfessionGroup(p, $event)\" [name]=\"'manualGroup-' + p.id\"\n placeholder=\"Select group\" [clearable]=\"false\">\n </ng-select>\n </ng-container>\n <ng-template #groupText>{{ p.professionGroup || '\u2013' }}</ng-template>\n </div>\n <div class=\"profession-acc-type\"\n (mousedown)=\"p.isManual && $event.stopPropagation()\" (click)=\"p.isManual && $event.stopPropagation()\">\n <ng-container *ngIf=\"p.isManual; else typeText\">\n <ng-select class=\"profession-inline-select\" [items]=\"professionTypeOptions\" [ngModel]=\"p.residentialCommercial\"\n (ngModelChange)=\"setManualProfessionType(p, $event)\" [name]=\"'manualType-' + p.id\"\n placeholder=\"Select type\" [clearable]=\"false\">\n </ng-select>\n </ng-container>\n <ng-template #typeText>{{ p.residentialCommercial || '\u2013' }}</ng-template>\n </div>\n <button type=\"button\" class=\"profession-acc-chevron-btn\"\n [attr.aria-label]=\"isProfessionExpanded(p.id) ? 'Collapse' : 'Expand'\">\n <svg class=\"profession-acc-chevron\" [class.profession-acc-chevron--open]=\"isProfessionExpanded(p.id)\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n\n <div class=\"profession-acc-body\" *ngIf=\"isProfessionExpanded(p.id)\">\n <div class=\"profession-acc-panel\">\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"selectedProfessionCount > 1\">\n <label class=\"profession-copy-toggle\" title=\"Copy Rating, Years, Visibility &amp; Details to all selected professions\">\n <input type=\"checkbox\" class=\"profession-plain-checkbox\"\n (click)=\"copyToAllProfessions(p.id)\" />\n Copy to all\n </label>\n </div>\n <div *ngIf=\"p.isManual && !isManualRowReady(p.id)\" class=\"small text-danger mb-3 text-end\">\n Select a Group and Type above to enable saving this profession.\n </div>\n <div class=\"profession-acc-fields\">\n <div class=\"profession-acc-field\">\n <label class=\"small text-muted d-block mb-1\">Self Ability Rating</label>\n <div class=\"profession-acc-stars\">\n <span *ngFor=\"let s of [1,2,3,4,5]\" class=\"fs-5\" style=\"cursor: pointer;\"\n (click)=\"setProfessionRowStars(p, s)\"\n [class.text-warning]=\"(getProfessionSelection(p.id).starRating || 0) / 2 >= s\"\n [class.text-muted]=\"(getProfessionSelection(p.id).starRating || 0) / 2 < s\">\u2605</span>\n </div>\n </div>\n <div class=\"profession-acc-field\">\n <label class=\"small text-muted d-block mb-1\">Years of Experience</label>\n <div class=\"d-flex align-items-center gap-2\">\n <input type=\"number\" class=\"form-control form-control-sm profession-acc-year-input\" min=\"0\" max=\"30\"\n [(ngModel)]=\"getProfessionSelection(p.id).year\" [name]=\"'profYear-' + p.id\" />\n <span class=\"small text-muted\">Yrs</span>\n </div>\n </div>\n <div class=\"profession-acc-field profession-acc-field--visibility\">\n <label class=\"small text-muted d-block mb-1\">Visibility</label>\n <input type=\"checkbox\" class=\"profession-visibility-checkbox\" [(ngModel)]=\"getProfessionSelection(p.id).profileVisibility\"\n [name]=\"'profVis-' + p.id\" />\n </div>\n <div class=\"profession-acc-field profession-acc-field--notes\">\n <label class=\"small text-muted d-block mb-1\">Additional Details</label>\n <textarea rows=\"3\" class=\"form-control form-control-sm profession-notes-input\" [(ngModel)]=\"getProfessionSelection(p.id).notes\"\n [name]=\"'profNotes-' + p.id\" placeholder=\"Add details here\"></textarea>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"hasNoProfessionMatches\" class=\"text-center small py-3\">\n <span class=\"text-muted\">No professions found for \"{{ professionSearchQry?.trim() }}\".</span>\n <button type=\"button\" class=\"btn btn-sm btn-primary ms-2\" (click)=\"createManualProfessionRow()\">\n Add \"{{ professionSearchQry?.trim() }}\"\n </button>\n </div>\n <div *ngIf=\"!professionSearchQry?.trim() && filteredProfessionTypes.length === 0\"\n class=\"text-center text-muted small py-3\">\n No professions found.\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"actions\">\n <button type=\"button\" class=\"secondary\" (click)=\"back()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n Back\n </button>\n <div class=\"right-actions\">\n <button type=\"button\" class=\"secondary\" *ngIf=\"selectedProfessionCount === 0\" (click)=\"skip()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n Skip\n </button>\n <button type=\"button\" class=\"primary\" *ngIf=\"selectedProfessionCount > 0\"\n [disabled]=\"isSavingProfessionsTable\" (click)=\"saveAndContinue()\">\n <span *ngIf=\"isSavingProfessionsTable\" class=\"spinner-border spinner-border-sm me-1\"></span>\n <ng-container *ngIf=\"!isSavingProfessionsTable\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n Save &amp; Continue\n </ng-container>\n <ng-container *ngIf=\"isSavingProfessionsTable\">Saving...</ng-container>\n </button>\n </div>\n</div>\n", styles: [".profession-search-input{font-size:12px}.profession-search-input::placeholder{font-size:12px}.profession-row-selected{background-color:#f2f4fa}.profession-row-selected .profession-acc-header:hover{background-color:#eceffa}.icon-btn{width:28px;height:28px;border:none;min-width:unset!important;border-radius:5px;background:transparent;display:inline-flex;align-items:center;justify-content:center}.icon-btn.delete-btn{color:#ef4444}.icon-btn.delete-btn:hover{background:#fef2f2}.modal-overlay{position:fixed;inset:0;background:#11182773;display:flex;align-items:center;justify-content:center;z-index:2500;padding:20px}.confirm-modal-card{width:min(520px,96vw);max-height:85vh;overflow-y:auto;background:#fff;border-radius:5px;border:1px solid #e5e7eb;padding:24px}.confirm-modal-card h4{font-size:20px}.profession-copy-toggle{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:#69707d;cursor:pointer;-webkit-user-select:none;user-select:none}.profession-copy-toggle .profession-plain-checkbox{margin:0;vertical-align:middle}.profession-visibility-checkbox{all:revert;width:16px!important;height:16px!important;min-width:16px!important;max-width:16px!important;margin:4px auto 0!important;padding:0!important;position:static!important;float:none!important;vertical-align:middle!important;background-image:none!important;transform:none!important}.profession-accordion{font-size:12px;color:#69707d;max-height:480px;overflow-y:auto;margin-right:6px;position:relative;isolation:isolate;contain:paint}.profession-accordion label.small{font-size:12px;color:#69707d}.profession-acc-columns,.profession-acc-header{display:grid;grid-template-columns:36px 1.4fr 1fr 1fr 32px;align-items:center;gap:12px}.profession-acc-columns>*,.profession-acc-header>*{min-width:0}.profession-acc-columns{padding:12px 16px;border-bottom:1px solid #e9ecef;font-size:13px;font-weight:600;color:#69707d;text-transform:uppercase;position:sticky;top:0;z-index:2;background:#fff}@media (max-width: 767.98px){.profession-acc-columns{display:none}}.profession-acc-item{border-bottom:1px solid #f1f3f5}.profession-acc-item:last-child{border-bottom:none}.profession-acc-header{padding:12px 16px;cursor:pointer;transition:background-color .15s ease}.profession-acc-header .profession-acc-checkbox{display:flex;align-items:center;justify-content:center}.profession-acc-header .profession-acc-checkbox input[type=checkbox]{margin:0}.profession-acc-header:hover{background-color:#f8f9fb}.profession-acc-name{color:#69707d;display:flex;align-items:center;flex-wrap:wrap;gap:4px;overflow:hidden}.profession-acc-chevron-btn{background:transparent;border:none;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:#69707d}.profession-acc-chevron{transition:transform .2s ease}.profession-acc-chevron--open{transform:rotate(180deg)}.profession-acc-body{padding:0 16px 16px}.profession-acc-panel{background-color:#fff;border:1px solid #e9ecef;border-radius:8px;padding:16px 20px}.profession-acc-fields{display:flex;flex-wrap:wrap;align-items:flex-start;gap:32px}.profession-acc-field{min-width:100px}.profession-acc-field--visibility{display:flex;flex-direction:column;align-items:center;width:90px;flex-shrink:0}.profession-acc-field--visibility label{text-align:center;width:100%}.profession-acc-field--notes{flex:1 1 220px;margin:0}.profession-acc-stars{font-size:1.05rem;letter-spacing:2px}.profession-acc-year-input{width:72px}.profession-inline-select{min-width:160px;font-size:12px}.profession-inline-select ::ng-deep .ng-select-container{min-height:32px!important;height:32px!important}::ng-deep .profession-inline-select .ng-option,::ng-deep .profession-inline-select .ng-placeholder{font-size:12px}.profession-notes-input{min-height:76px;resize:vertical}.section-flag{font-weight:600}.actions{display:flex;justify-content:space-between;margin:48px 100px 20px}.right-actions{display:flex;gap:12px}button{height:42px;min-width:120px;border-radius:5px;border:none;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}button.primary{background:#4077ad;color:#fff;padding:10px 22px}button.primary:hover{background:#2d5a8a;transform:translateY(-1px)}button.primary:active{transform:translateY(0)}button.secondary{background:#69707d;color:#fff;border:1.5px solid #69707D;padding:10px 22px}button.secondary:hover{border-color:#565c66;color:#fff;background:#565c66}.right-actions button.secondary{background:#f2f4fa;color:#69707d;border:1.5px solid #F2F4FA}.right-actions button.secondary:hover{border-color:#e4e8f2;color:#69707d;background:#e4e8f2}button:disabled{background:#69707d;cursor:not-allowed;transform:none;box-shadow:none}@media (max-width: 767.98px){.profession-acc-header{grid-template-columns:24px 1fr 24px;grid-template-areas:\"checkbox name chevron\" \"checkbox group chevron\" \"checkbox type chevron\";row-gap:4px}.profession-acc-checkbox{grid-area:checkbox}.profession-acc-name{grid-area:name}.profession-acc-group,.profession-acc-type{font-size:12px;color:#69707d}.profession-acc-group{grid-area:group}.profession-acc-group:before{content:\"Group: \";font-weight:600}.profession-acc-type{grid-area:type}.profession-acc-type:before{content:\"Type: \";font-weight:600}.profession-acc-chevron-btn{grid-area:chevron}.profession-acc-fields{gap:16px}}.step-card{max-width:1000px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 1px 3px #0000000f,0 4px 16px #4077ad14}.step-card-header{display:flex;align-items:center;gap:16px;padding:20px 28px;background:linear-gradient(135deg,#ebf2f9,#f0f6ff);border-bottom:1px solid #d5e8f5;border-radius:12px 12px 0 0}.step-card-header-icon{width:46px;height:46px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px #4077ad2e;flex-shrink:0}.step-card-header-icon img{filter:brightness(0) saturate(100%) invert(37%) sepia(55%) saturate(500%) hue-rotate(190deg) brightness(95%) contrast(85%);width:22px;height:22px}.step-card-title{font-size:16px;font-weight:700;color:#1e293b;margin:0 0 3px;letter-spacing:-.01em}.step-card-subtitle{font-size:14px;color:#69707d;margin:0;line-height:1.4}.step-card-body{padding:24px 28px 8px}.field-section{margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 18px 6px}.field-section-title{font-size:12px;font-weight:700;color:#4077ad;text-transform:uppercase;letter-spacing:.07em;margin-bottom:14px;display:flex;align-items:center;gap:7px}.field-section-title:before{content:\"\";display:inline-block;width:5px;height:5px;background:#4077ad;border-radius:50%;flex-shrink:0}.doc-type-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0 12px}.doc-type-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:5px;border:1.5px solid #e2e8f0;background:#fff;color:#69707d;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none;line-height:1.4}.doc-type-chip input[type=checkbox]{display:none}.doc-type-chip:hover{border-color:#4077ad;color:#4077ad;background:#ebf2f9}.doc-type-chip.selected{background:#4077ad;border-color:#4077ad;color:#fff;font-weight:600;box-shadow:0 2px 6px #4077ad4d}.detail-row{display:flex;flex-wrap:wrap;column-gap:22px;row-gap:6px;margin-bottom:8px}.detail-item{display:flex;align-items:baseline;gap:6px;white-space:nowrap}.detail-label{font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:#4077ad}.detail-value{font-size:12.5px;font-weight:600;color:#1e293b}button.primary,button.secondary,button.back-btn,button.continue-btn,button.save-btn,button.add-btn,button.upload-btn,.actions button,.action button,.navigation-buttons button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:5px;box-shadow:none}button.primary svg,button.secondary svg,button.back-btn svg,button.continue-btn svg,button.save-btn svg,button.add-btn svg,button.upload-btn svg,.actions button svg,.action button svg,.navigation-buttons button svg{flex-shrink:0;width:14px;height:14px}.step-toast{position:fixed;bottom:28px;right:28px;display:flex;align-items:flex-start;gap:14px;background:#fff;border-radius:12px;padding:16px 20px 20px;box-shadow:0 8px 32px #00000024;z-index:9999;min-width:290px;max-width:360px;animation:toastSlideIn .32s cubic-bezier(.34,1.56,.64,1);overflow:hidden}@keyframes toastSlideIn{0%{transform:translate(110%);opacity:0}to{transform:translate(0);opacity:1}}.step-toast-icon{width:34px;height:34px;background:#dcfce7;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;color:#16a34a}.step-toast-body{flex:1}.step-toast-title{font-size:14px;font-weight:700;color:#1e293b;margin-bottom:2px}.step-toast-msg{font-size:12px;color:#69707d;line-height:1.4}.step-toast-progress{position:absolute;bottom:0;left:0;height:3px;background:#22c55e;border-radius:0 2px 2px 0;animation:toastProgress 3.5s linear forwards}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media screen and (max-width: 767px){.step-card-header{padding:14px 16px}.step-card-body{padding:16px 16px 8px}.step-toast{right:12px;bottom:16px;min-width:calc(100vw - 24px);max-width:calc(100vw - 24px)}}\n"] }]
36823
36823
  }], ctorParameters: () => [{ type: CredentialingStore }], propDecorators: { providerId: [{
36824
36824
  type: Input
36825
36825
  }], providerName: [{