1import { 2 FormsModule 3} from "./chunk-O6KR7N3B.js"; 4import { 5 TranslatePipe 6} from "./chunk-7BJ5A7YX.js"; 7import { 8 AuthService 9} from "./chunk-RONQE5UT.js"; 10import { 11 ToastService 12} from "./chunk-IKJIVOCQ.js"; 13import { 14 ApiService 15} from "./chunk-J3VFWUMD.js"; 16import "./chunk-ASZL34XZ.js"; 17import { 18 CommonModule, 19 TranslationService 20} from "./chunk-VQ4JJ6J4.js"; 21import "./chunk-JIRI2W7L.js"; 22import { 23 Component, 24 Injectable, 25 computed, 26 inject, 27 map, 28 setClassMetadata, 29 signal, 30 ɵsetClassDebugInfo, 31 ɵɵadvance, 32 ɵɵclassProp, 33 ɵɵconditional, 34 ɵɵconditionalCreate, 35 ɵɵdefineComponent, 36 ɵɵdefineInjectable, 37 ɵɵdomElement, 38 ɵɵdomElementEnd, 39 ɵɵdomElementStart, 40 ɵɵdomListener, 41 ɵɵdomProperty, 42 ɵɵgetCurrentView, 43 ɵɵnextContext, 44 ɵɵpipe, 45 ɵɵpipeBind1, 46 ɵɵrepeater, 47 ɵɵrepeaterCreate, 48 ɵɵrepeaterTrackByIdentity, 49 ɵɵresetView, 50 ɵɵrestoreView, 51 ɵɵtext, 52 ɵɵtextInterpolate, 53 ɵɵtextInterpolate1 54} from "./chunk-SD5VU54W.js"; 55import { 56 __spreadProps, 57 __spreadValues 58} from "./chunk-CX3I3NQG.js"; 59
60// src/app/features/dashboard/services/settings.service.ts 61var SettingsService = class _SettingsService { 62 api = inject(ApiService); 63 // Helper to extract array from API response { data: { items: [...] } } 64 extractArray(response) { 65 if (Array.isArray(response)) { 66 return response; 67 } 68 if (response.data?.items) { 69 return response.data.items; 70 } 71 if (response.items) { 72 return response.items; 73 } 74 return []; 75 } 76 // ============================================ 77 // TAGS 78 // ============================================ 79 getTags() { 80 return this.api.get("/tag").pipe(map((response) => this.extractArray(response))); 81 } 82 getActiveTags() { 83 return this.api.get("/tag/active").pipe(map((response) => this.extractArray(response))); 84 } 85 getTag(id) { 86 return this.api.get(`/tag/${id}`); 87 } 88 createTag(data) { 89 return this.api.post("/tag", data); 90 } 91 updateTag(id, data) { 92 return this.api.patch(`/tag/${id}`, data); 93 } 94 deleteTag(id) { 95 return this.api.delete(`/tag/${id}`); 96 } 97 // ============================================ 98 // CUISINES 99 // ============================================ 100 getCuisines() { 101 return this.api.get("/cuisine").pipe(map((response) => this.extractArray(response))); 102 } 103 getActiveCuisines() { 104 return this.api.get("/cuisine/active").pipe(map((response) => this.extractArray(response))); 105 } 106 getCuisine(id) { 107 return this.api.get(`/cuisine/${id}`); 108 } 109 createCuisine(data) { 110 return this.api.post("/cuisine", data); 111 } 112 updateCuisine(id, data) { 113 return this.api.patch(`/cuisine/${id}`, data); 114 } 115 deleteCuisine(id) { 116 return this.api.delete(`/cuisine/${id}`); 117 } 118 static \u0275fac = function SettingsService_Factory(__ngFactoryType__) { 119 return new (__ngFactoryType__ || _SettingsService)(); 120 }; 121 static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ token: _SettingsService, factory: _SettingsService.\u0275fac, providedIn: "root" }); 122}; 123(() => { 124 (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SettingsService, [{ 125 type: Injectable, 126 args: [{ 127 providedIn: "root" 128 }] 129 }], null, null); 130})(); 131
132// src/app/models/settings.model.ts 133function getSettingsName(item, lang) { 134 if (!item) 135 return ""; 136 if (item.name) 137 return item.name; 138 if (item.translations?.length) { 139 const translation = item.translations.find((t) => t.lang === lang); 140 return translation?.name || item.translations[0]?.name || ""; 141 } 142 return ""; 143} 144
145// src/app/features/dashboard/pages/settings/settings.component.ts 146var _forTrack0 = ($index, $item) => $item._id; 147function SettingsComponent_Conditional_30_Template(rf, ctx) { 148 if (rf & 1) { 149 \u0275\u0275domElementStart(0, "div", 10); 150 \u0275\u0275domElement(1, "div", 14); 151 \u0275\u0275domElementStart(2, "p"); 152 \u0275\u0275text(3); 153 \u0275\u0275pipe(4, "translate"); 154 \u0275\u0275domElementEnd()(); 155 } 156 if (rf & 2) { 157 \u0275\u0275advance(3); 158 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(4, 1, "common.loading")); 159 } 160} 161function SettingsComponent_Conditional_31_Conditional_1_Conditional_0_Template(rf, ctx) { 162 if (rf & 1) { 163 \u0275\u0275domElementStart(0, "div", 15)(1, "span", 6); 164 \u0275\u0275text(2, "label_off"); 165 \u0275\u0275domElementEnd(); 166 \u0275\u0275domElementStart(3, "p"); 167 \u0275\u0275text(4); 168 \u0275\u0275pipe(5, "translate"); 169 \u0275\u0275domElementEnd()(); 170 } 171 if (rf & 2) { 172 \u0275\u0275advance(4); 173 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 1, "settings.tags.empty")); 174 } 175} 176function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_4_Template(rf, ctx) { 177 if (rf & 1) { 178 \u0275\u0275domElementStart(0, "span", 21); 179 \u0275\u0275pipe(1, "translate"); 180 \u0275\u0275text(2); 181 \u0275\u0275pipe(3, "translate"); 182 \u0275\u0275domElementEnd(); 183 } 184 if (rf & 2) { 185 const tag_r1 = \u0275\u0275nextContext().$implicit; 186 const ctx_r1 = \u0275\u0275nextContext(4); 187 \u0275\u0275domProperty("title", \u0275\u0275pipeBind1(1, 2, "settings.deletedAt") + ": " + ctx_r1.formatDeletedDate(tag_r1.deletedAt)); 188 \u0275\u0275advance(2); 189 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(3, 4, "common.deleted"), " "); 190 } 191} 192function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_5_Template(rf, ctx) { 193 if (rf & 1) { 194 \u0275\u0275domElementStart(0, "span", 22); 195 \u0275\u0275text(1); 196 \u0275\u0275pipe(2, "translate"); 197 \u0275\u0275domElementEnd(); 198 } 199 if (rf & 2) { 200 \u0275\u0275advance(); 201 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(2, 1, "common.inactive")); 202 } 203} 204function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_7_Template(rf, ctx) { 205 if (rf & 1) { 206 const _r3 = \u0275\u0275getCurrentView(); 207 \u0275\u0275domElementStart(0, "div", 24)(1, "span", 25); 208 \u0275\u0275text(2); 209 \u0275\u0275pipe(3, "translate"); 210 \u0275\u0275domElementEnd(); 211 \u0275\u0275domElementStart(4, "button", 26); 212 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_7_Template_button_click_4_listener() { 213 \u0275\u0275restoreView(_r3); 214 const tag_r1 = \u0275\u0275nextContext().$implicit; 215 const ctx_r1 = \u0275\u0275nextContext(4); 216 return \u0275\u0275resetView(ctx_r1.deleteItem(tag_r1._id)); 217 }); 218 \u0275\u0275text(5); 219 \u0275\u0275pipe(6, "translate"); 220 \u0275\u0275domElementEnd(); 221 \u0275\u0275domElementStart(7, "button", 27); 222 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_7_Template_button_click_7_listener() { 223 \u0275\u0275restoreView(_r3); 224 const ctx_r1 = \u0275\u0275nextContext(5); 225 return \u0275\u0275resetView(ctx_r1.cancelDelete()); 226 }); 227 \u0275\u0275text(8); 228 \u0275\u0275pipe(9, "translate"); 229 \u0275\u0275domElementEnd()(); 230 } 231 if (rf & 2) { 232 const ctx_r1 = \u0275\u0275nextContext(5); 233 \u0275\u0275advance(2); 234 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 5, "common.deleteConfirm")); 235 \u0275\u0275advance(2); 236 \u0275\u0275domProperty("disabled", ctx_r1.isSubmitting()); 237 \u0275\u0275advance(); 238 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(6, 7, "common.yes"), " "); 239 \u0275\u0275advance(2); 240 \u0275\u0275domProperty("disabled", ctx_r1.isSubmitting()); 241 \u0275\u0275advance(); 242 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(9, 9, "common.no"), " "); 243 } 244} 245function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_8_Template(rf, ctx) { 246 if (rf & 1) { 247 const _r4 = \u0275\u0275getCurrentView(); 248 \u0275\u0275domElementStart(0, "button", 28); 249 \u0275\u0275pipe(1, "translate"); 250 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_8_Template_button_click_0_listener() { 251 \u0275\u0275restoreView(_r4); 252 const tag_r1 = \u0275\u0275nextContext().$implicit; 253 const ctx_r1 = \u0275\u0275nextContext(4);
254 return \u0275\u0275resetView(ctx_r1.openEditDialog(tag_r1)); 255 }); 256 \u0275\u0275domElementStart(2, "span", 6); 257 \u0275\u0275text(3, "edit"); 258 \u0275\u0275domElementEnd()(); 259 \u0275\u0275domElementStart(4, "button", 29); 260 \u0275\u0275pipe(5, "translate"); 261 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_8_Template_button_click_4_listener() { 262 \u0275\u0275restoreView(_r4); 263 const tag_r1 = \u0275\u0275nextContext().$implicit; 264 const ctx_r1 = \u0275\u0275nextContext(4); 265 return \u0275\u0275resetView(ctx_r1.confirmDelete(tag_r1._id)); 266 }); 267 \u0275\u0275domElementStart(6, "span", 6); 268 \u0275\u0275text(7, "delete"); 269 \u0275\u0275domElementEnd()(); 270 } 271 if (rf & 2) { 272 \u0275\u0275domProperty("title", \u0275\u0275pipeBind1(1, 2, "common.edit")); 273 \u0275\u0275advance(4); 274 \u0275\u0275domProperty("title", \u0275\u0275pipeBind1(5, 4, "common.delete")); 275 } 276} 277function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Template(rf, ctx) { 278 if (rf & 1) { 279 \u0275\u0275domElementStart(0, "div", 18)(1, "div", 19)(2, "span", 20); 280 \u0275\u0275text(3); 281 \u0275\u0275domElementEnd(); 282 \u0275\u0275conditionalCreate(4, SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_4_Template, 4, 6, "span", 21)(5, SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_5_Template, 3, 3, "span", 22); 283 \u0275\u0275domElementEnd(); 284 \u0275\u0275domElementStart(6, "div", 23); 285 \u0275\u0275conditionalCreate(7, SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_7_Template, 10, 11, "div", 24)(8, SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Conditional_8_Template, 8, 6); 286 \u0275\u0275domElementEnd()(); 287 } 288 if (rf & 2) { 289 const tag_r1 = ctx.$implicit; 290 const ctx_r1 = \u0275\u0275nextContext(4); 291 \u0275\u0275classProp("inactive", !tag_r1.active)("deleted", ctx_r1.isDeleted(tag_r1)); 292 \u0275\u0275advance(3); 293 \u0275\u0275textInterpolate(ctx_r1.getName(tag_r1)); 294 \u0275\u0275advance(); 295 \u0275\u0275conditional(ctx_r1.isDeleted(tag_r1) ? 4 : !tag_r1.active ? 5 : -1); 296 \u0275\u0275advance(3); 297 \u0275\u0275conditional(ctx_r1.deletingId() === tag_r1._id ? 7 : 8); 298 } 299} 300function SettingsComponent_Conditional_31_Conditional_1_Conditional_1_Template(rf, ctx) { 301 if (rf & 1) { 302 \u0275\u0275domElementStart(0, "div", 16); 303 \u0275\u0275repeaterCreate(1, SettingsComponent_Conditional_31_Conditional_1_Conditional_1_For_2_Template, 9, 7, "div", 17, _forTrack0); 304 \u0275\u0275domElementEnd(); 305 } 306 if (rf & 2) { 307 const ctx_r1 = \u0275\u0275nextContext(3); 308 \u0275\u0275advance(); 309 \u0275\u0275repeater(ctx_r1.tags()); 310 } 311} 312function SettingsComponent_Conditional_31_Conditional_1_Template(rf, ctx) { 313 if (rf & 1) { 314 \u0275\u0275conditionalCreate(0, SettingsComponent_Conditional_31_Conditional_1_Conditional_0_Template, 6, 3, "div", 15)(1, SettingsComponent_Conditional_31_Conditional_1_Conditional_1_Template, 3, 0, "div", 16); 315 } 316 if (rf & 2) { 317 const ctx_r1 = \u0275\u0275nextContext(2); 318 \u0275\u0275conditional(ctx_r1.tags().length === 0 ? 0 : 1); 319 } 320} 321function SettingsComponent_Conditional_31_Conditional_2_Conditional_0_Template(rf, ctx) { 322 if (rf & 1) { 323 \u0275\u0275domElementStart(0, "div", 15)(1, "span", 6); 324 \u0275\u0275text(2, "no_meals"); 325 \u0275\u0275domElementEnd(); 326 \u0275\u0275domElementStart(3, "p"); 327 \u0275\u0275text(4); 328 \u0275\u0275pipe(5, "translate"); 329 \u0275\u0275domElementEnd()(); 330 } 331 if (rf & 2) { 332 \u0275\u0275advance(4); 333 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 1, "settings.cuisines.empty")); 334 } 335} 336function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_7_Template(rf, ctx) { 337 if (rf & 1) { 338 \u0275\u0275domElementStart(0, "span", 21); 339 \u0275\u0275pipe(1, "translate"); 340 \u0275\u0275text(2); 341 \u0275\u0275pipe(3, "translate"); 342 \u0275\u0275domElementEnd(); 343 } 344 if (rf & 2) { 345 const cuisine_r5 = \u0275\u0275nextContext().$implicit; 346 const ctx_r1 = \u0275\u0275nextContext(4); 347 \u0275\u0275domProperty("title", \u0275\u0275pipeBind1(1, 2, "settings.deletedAt") + ": " + ctx_r1.formatDeletedDate(cuisine_r5.deletedAt)); 348 \u0275\u0275advance(2); 349 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(3, 4, "common.deleted"), " "); 350 } 351} 352function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_8_Template(rf, ctx) { 353 if (rf & 1) { 354 \u0275\u0275domElementStart(0, "span", 22); 355 \u0275\u0275text(1); 356 \u0275\u0275pipe(2, "translate"); 357 \u0275\u0275domElementEnd(); 358 } 359 if (rf & 2) { 360 \u0275\u0275advance(); 361 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(2, 1, "common.inactive")); 362 } 363} 364function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_10_Template(rf, ctx) { 365 if (rf & 1) { 366 const _r6 = \u0275\u0275getCurrentView(); 367 \u0275\u0275domElementStart(0, "div", 24)(1, "span", 25); 368 \u0275\u0275text(2); 369 \u0275\u0275pipe(3, "translate"); 370 \u0275\u0275domElementEnd(); 371 \u0275\u0275domElementStart(4, "button", 26); 372 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_10_Template_button_click_4_listener() { 373 \u0275\u0275restoreView(_r6); 374 const cuisine_r5 = \u0275\u0275nextContext().$implicit; 375 const ctx_r1 = \u0275\u0275nextContext(4);
376 return \u0275\u0275resetView(ctx_r1.deleteItem(cuisine_r5._id)); 377 }); 378 \u0275\u0275text(5); 379 \u0275\u0275pipe(6, "translate"); 380 \u0275\u0275domElementEnd(); 381 \u0275\u0275domElementStart(7, "button", 27); 382 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_10_Template_button_click_7_listener() { 383 \u0275\u0275restoreView(_r6); 384 const ctx_r1 = \u0275\u0275nextContext(5); 385 return \u0275\u0275resetView(ctx_r1.cancelDelete()); 386 }); 387 \u0275\u0275text(8); 388 \u0275\u0275pipe(9, "translate"); 389 \u0275\u0275domElementEnd()(); 390 } 391 if (rf & 2) { 392 const ctx_r1 = \u0275\u0275nextContext(5); 393 \u0275\u0275advance(2); 394 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 5, "common.deleteConfirm")); 395 \u0275\u0275advance(2); 396 \u0275\u0275domProperty("disabled", ctx_r1.isSubmitting()); 397 \u0275\u0275advance(); 398 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(6, 7, "common.yes"), " "); 399 \u0275\u0275advance(2); 400 \u0275\u0275domProperty("disabled", ctx_r1.isSubmitting()); 401 \u0275\u0275advance(); 402 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(9, 9, "common.no"), " "); 403 } 404} 405function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_11_Template(rf, ctx) { 406 if (rf & 1) { 407 const _r7 = \u0275\u0275getCurrentView(); 408 \u0275\u0275domElementStart(0, "button", 28); 409 \u0275\u0275pipe(1, "translate"); 410 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_11_Template_button_click_0_listener() { 411 \u0275\u0275restoreView(_r7); 412 const cuisine_r5 = \u0275\u0275nextContext().$implicit; 413 const ctx_r1 = \u0275\u0275nextContext(4); 414 return \u0275\u0275resetView(ctx_r1.openEditDialog(cuisine_r5)); 415 }); 416 \u0275\u0275domElementStart(2, "span", 6); 417 \u0275\u0275text(3, "edit"); 418 \u0275\u0275domElementEnd()(); 419 \u0275\u0275domElementStart(4, "button", 29); 420 \u0275\u0275pipe(5, "translate"); 421 \u0275\u0275domListener("click", function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_11_Template_button_click_4_listener() { 422 \u0275\u0275restoreView(_r7); 423 const cuisine_r5 = \u0275\u0275nextContext().$implicit; 424 const ctx_r1 = \u0275\u0275nextContext(4); 425 return \u0275\u0275resetView(ctx_r1.confirmDelete(cuisine_r5._id)); 426 }); 427 \u0275\u0275domElementStart(6, "span", 6); 428 \u0275\u0275text(7, "delete"); 429 \u0275\u0275domElementEnd()(); 430 } 431 if (rf & 2) { 432 \u0275\u0275domProperty("title", \u0275\u0275pipeBind1(1, 2, "common.edit")); 433 \u0275\u0275advance(4); 434 \u0275\u0275domProperty("title", \u0275\u0275pipeBind1(5, 4, "common.delete")); 435 } 436} 437function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Template(rf, ctx) { 438 if (rf & 1) { 439 \u0275\u0275domElementStart(0, "div", 18)(1, "div", 19)(2, "span", 20); 440 \u0275\u0275text(3); 441 \u0275\u0275domElementEnd(); 442 \u0275\u0275domElementStart(4, "span", 30); 443 \u0275\u0275text(5); 444 \u0275\u0275pipe(6, "translate"); 445 \u0275\u0275domElementEnd(); 446 \u0275\u0275conditionalCreate(7, SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_7_Template, 4, 6, "span", 21)(8, SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_8_Template, 3, 3, "span", 22); 447 \u0275\u0275domElementEnd(); 448 \u0275\u0275domElementStart(9, "div", 23); 449 \u0275\u0275conditionalCreate(10, SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_10_Template, 10, 11, "div", 24)(11, SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Conditional_11_Template, 8, 6); 450 \u0275\u0275domElementEnd()(); 451 } 452 if (rf & 2) { 453 const cuisine_r5 = ctx.$implicit; 454 const ctx_r1 = \u0275\u0275nextContext(4); 455 \u0275\u0275classProp("inactive", !cuisine_r5.active)("deleted", ctx_r1.isDeleted(cuisine_r5)); 456 \u0275\u0275advance(3); 457 \u0275\u0275textInterpolate(ctx_r1.getName(cuisine_r5)); 458 \u0275\u0275advance(2); 459 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(6, 8, "settings.cuisines.types." + cuisine_r5.type)); 460 \u0275\u0275advance(2); 461 \u0275\u0275conditional(ctx_r1.isDeleted(cuisine_r5) ? 7 : !cuisine_r5.active ? 8 : -1); 462 \u0275\u0275advance(3); 463 \u0275\u0275conditional(ctx_r1.deletingId() === cuisine_r5._id ? 10 : 11); 464 } 465} 466function SettingsComponent_Conditional_31_Conditional_2_Conditional_1_Template(rf, ctx) { 467 if (rf & 1) { 468 \u0275\u0275domElementStart(0, "div", 16); 469 \u0275\u0275repeaterCreate(1, SettingsComponent_Conditional_31_Conditional_2_Conditional_1_For_2_Template, 12, 10, "div", 17, _forTrack0); 470 \u0275\u0275domElementEnd(); 471 } 472 if (rf & 2) { 473 const ctx_r1 = \u0275\u0275nextContext(3); 474 \u0275\u0275advance(); 475 \u0275\u0275repeater(ctx_r1.cuisines()); 476 } 477} 478function SettingsComponent_Conditional_31_Conditional_2_Template(rf, ctx) { 479 if (rf & 1) { 480 \u0275\u0275conditionalCreate(0, SettingsComponent_Conditional_31_Conditional_2_Conditional_0_Template, 6, 3, "div", 15)(1, SettingsComponent_Conditional_31_Conditional_2_Conditional_1_Template, 3, 0, "div", 16); 481 } 482 if (rf & 2) { 483 const ctx_r1 = \u0275\u0275nextContext(2); 484 \u0275\u0275conditional(ctx_r1.cuisines().length === 0 ? 0 : 1); 485 } 486} 487function SettingsComponent_Conditional_31_Template(rf, ctx) { 488 if (rf & 1) { 489 \u0275\u0275domElementStart(0, "div", 11); 490 \u0275\u0275conditionalCreate(1, SettingsComponent_Conditional_31_Conditional_1_Template, 2, 1); 491 \u0275\u0275conditionalCreate(2, SettingsComponent_Conditional_31_Conditional_2_Template, 2, 1); 492 \u0275\u0275domElementEnd(); 493 } 494 if (rf & 2) { 495 const ctx_r1 = \u0275\u0275nextContext(); 496 \u0275\u0275advance(); 497 \u0275\u0275conditional(ctx_r1.activeTab() === "tags" ? 1 : -1); 498 \u0275\u0275advance(); 499 \u0275\u0275conditional(ctx_r1.activeTab() === "cuisines" ? 2 : -1); 500 } 501} 502function SettingsComponent_Conditional_32_Template(rf, ctx) { 503 if (rf & 1) { 504 const _r8 = \u0275\u0275getCurrentView(); 505 \u0275\u0275domElementStart(0, "div", 31); 506 \u0275\u0275domListener("click", function SettingsComponent_Conditional_32_Template_div_click_0_listener() { 507 \u0275\u0275restoreView(_r8); 508 const ctx_r1 = \u0275\u0275nextContext();
509 return \u0275\u0275resetView(ctx_r1.closeDialog()); 510 }); 511 \u0275\u0275domElementEnd(); 512 } 513} 514function SettingsComponent_Conditional_33_Conditional_3_Template(rf, ctx) { 515 if (rf & 1) { 516 \u0275\u0275text(0); 517 \u0275\u0275pipe(1, "translate"); 518 \u0275\u0275pipe(2, "translate"); 519 } 520 if (rf & 2) { 521 const ctx_r1 = \u0275\u0275nextContext(2); 522 \u0275\u0275textInterpolate1(" ", ctx_r1.activeTab() === "tags" ? \u0275\u0275pipeBind1(1, 1, "settings.tags.add") : \u0275\u0275pipeBind1(2, 3, "settings.cuisines.add"), " "); 523 } 524} 525function SettingsComponent_Conditional_33_Conditional_4_Template(rf, ctx) { 526 if (rf & 1) { 527 \u0275\u0275text(0); 528 \u0275\u0275pipe(1, "translate"); 529 \u0275\u0275pipe(2, "translate"); 530 } 531 if (rf & 2) { 532 const ctx_r1 = \u0275\u0275nextContext(2); 533 \u0275\u0275textInterpolate1(" ", ctx_r1.activeTab() === "tags" ? \u0275\u0275pipeBind1(1, 1, "settings.tags.edit") : \u0275\u0275pipeBind1(2, 3, "settings.cuisines.edit"), " "); 534 } 535} 536function SettingsComponent_Conditional_33_Conditional_29_For_6_Template(rf, ctx) { 537 if (rf & 1) { 538 const _r10 = \u0275\u0275getCurrentView(); 539 \u0275\u0275domElementStart(0, "button", 52); 540 \u0275\u0275domListener("click", function SettingsComponent_Conditional_33_Conditional_29_For_6_Template_button_click_0_listener() { 541 const type_r11 = \u0275\u0275restoreView(_r10).$implicit; 542 const ctx_r1 = \u0275\u0275nextContext(3); 543 return \u0275\u0275resetView(ctx_r1.setCuisineType(type_r11)); 544 }); 545 \u0275\u0275text(1); 546 \u0275\u0275pipe(2, "translate"); 547 \u0275\u0275domElementEnd(); 548 } 549 if (rf & 2) { 550 const type_r11 = ctx.$implicit; 551 const ctx_r1 = \u0275\u0275nextContext(3); 552 \u0275\u0275classProp("active", ctx_r1.formCuisineType() === type_r11); 553 \u0275\u0275advance(); 554 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(2, 3, "settings.cuisines.types." + type_r11), " "); 555 } 556} 557function SettingsComponent_Conditional_33_Conditional_29_Template(rf, ctx) { 558 if (rf & 1) { 559 \u0275\u0275domElementStart(0, "div", 36)(1, "label", 37); 560 \u0275\u0275text(2); 561 \u0275\u0275pipe(3, "translate"); 562 \u0275\u0275domElementEnd(); 563 \u0275\u0275domElementStart(4, "div", 50); 564 \u0275\u0275repeaterCreate(5, SettingsComponent_Conditional_33_Conditional_29_For_6_Template, 3, 5, "button", 51, \u0275\u0275repeaterTrackByIdentity); 565 \u0275\u0275domElementEnd()(); 566 } 567 if (rf & 2) { 568 const ctx_r1 = \u0275\u0275nextContext(2); 569 \u0275\u0275advance(2); 570 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 1, "settings.form.type")); 571 \u0275\u0275advance(3); 572 \u0275\u0275repeater(ctx_r1.cuisineTypes); 573 } 574} 575function SettingsComponent_Conditional_33_Conditional_42_Template(rf, ctx) { 576 if (rf & 1) { 577 \u0275\u0275domElement(0, "span", 49); 578 } 579} 580function SettingsComponent_Conditional_33_Template(rf, ctx) { 581 if (rf & 1) { 582 const _r9 = \u0275\u0275getCurrentView(); 583 \u0275\u0275domElementStart(0, "div", 13)(1, "div", 32)(2, "h2", 33); 584 \u0275\u0275conditionalCreate(3, SettingsComponent_Conditional_33_Conditional_3_Template, 3, 5)(4, SettingsComponent_Conditional_33_Conditional_4_Template, 3, 5); 585 \u0275\u0275domElementEnd(); 586 \u0275\u0275domElementStart(5, "button", 34); 587 \u0275\u0275domListener("click", function SettingsComponent_Conditional_33_Template_button_click_5_listener() { 588 \u0275\u0275restoreView(_r9); 589 const ctx_r1 = \u0275\u0275nextContext(); 590 return \u0275\u0275resetView(ctx_r1.closeDialog()); 591 }); 592 \u0275\u0275domElementStart(6, "span", 6); 593 \u0275\u0275text(7, "close"); 594 \u0275\u0275domElementEnd()()(); 595 \u0275\u0275domElementStart(8, "div", 35)(9, "div", 36)(10, "label", 37); 596 \u0275\u0275text(11); 597 \u0275\u0275pipe(12, "translate"); 598 \u0275\u0275domElementEnd(); 599 \u0275\u0275domElementStart(13, "div", 38)(14, "div", 39)(15, "span", 40); 600 \u0275\u0275text(16, "RO"); 601 \u0275\u0275domElementEnd(); 602 \u0275\u0275domElementStart(17, "input", 41); 603 \u0275\u0275pipe(18, "translate"); 604 \u0275\u0275domListener("input", function SettingsComponent_Conditional_33_Template_input_input_17_listener($event) { 605 \u0275\u0275restoreView(_r9); 606 const ctx_r1 = \u0275\u0275nextContext();
607 return \u0275\u0275resetView(ctx_r1.updateTranslation("ro", $event)); 608 }); 609 \u0275\u0275domElementEnd()(); 610 \u0275\u0275domElementStart(19, "div", 39)(20, "span", 40); 611 \u0275\u0275text(21, "EN"); 612 \u0275\u0275domElementEnd(); 613 \u0275\u0275domElementStart(22, "input", 41); 614 \u0275\u0275pipe(23, "translate"); 615 \u0275\u0275domListener("input", function SettingsComponent_Conditional_33_Template_input_input_22_listener($event) { 616 \u0275\u0275restoreView(_r9); 617 const ctx_r1 = \u0275\u0275nextContext(); 618 return \u0275\u0275resetView(ctx_r1.updateTranslation("en", $event)); 619 }); 620 \u0275\u0275domElementEnd()(); 621 \u0275\u0275domElementStart(24, "div", 39)(25, "span", 40); 622 \u0275\u0275text(26, "RU"); 623 \u0275\u0275domElementEnd(); 624 \u0275\u0275domElementStart(27, "input", 41); 625 \u0275\u0275pipe(28, "translate"); 626 \u0275\u0275domListener("input", function SettingsComponent_Conditional_33_Template_input_input_27_listener($event) { 627 \u0275\u0275restoreView(_r9); 628 const ctx_r1 = \u0275\u0275nextContext(); 629 return \u0275\u0275resetView(ctx_r1.updateTranslation("ru", $event)); 630 }); 631 \u0275\u0275domElementEnd()()()(); 632 \u0275\u0275conditionalCreate(29, SettingsComponent_Conditional_33_Conditional_29_Template, 7, 3, "div", 36); 633 \u0275\u0275domElementStart(30, "div", 36)(31, "label", 42); 634 \u0275\u0275domListener("click", function SettingsComponent_Conditional_33_Template_label_click_31_listener() { 635 \u0275\u0275restoreView(_r9); 636 const ctx_r1 = \u0275\u0275nextContext(); 637 return \u0275\u0275resetView(ctx_r1.toggleActive()); 638 }); 639 \u0275\u0275domElementStart(32, "span", 43); 640 \u0275\u0275text(33); 641 \u0275\u0275pipe(34, "translate"); 642 \u0275\u0275domElementEnd(); 643 \u0275\u0275domElementStart(35, "span", 44); 644 \u0275\u0275domElement(36, "span", 45); 645 \u0275\u0275domElementEnd()()()(); 646 \u0275\u0275domElementStart(37, "div", 46)(38, "button", 47); 647 \u0275\u0275domListener("click", function SettingsComponent_Conditional_33_Template_button_click_38_listener() { 648 \u0275\u0275restoreView(_r9); 649 const ctx_r1 = \u0275\u0275nextContext(); 650 return \u0275\u0275resetView(ctx_r1.closeDialog()); 651 }); 652 \u0275\u0275text(39); 653 \u0275\u0275pipe(40, "translate"); 654 \u0275\u0275domElementEnd(); 655 \u0275\u0275domElementStart(41, "button", 48); 656 \u0275\u0275domListener("click", function SettingsComponent_Conditional_33_Template_button_click_41_listener() { 657 \u0275\u0275restoreView(_r9); 658 const ctx_r1 = \u0275\u0275nextContext(); 659 return \u0275\u0275resetView(ctx_r1.saveItem()); 660 }); 661 \u0275\u0275conditionalCreate(42, SettingsComponent_Conditional_33_Conditional_42_Template, 1, 0, "span", 49); 662 \u0275\u0275text(43); 663 \u0275\u0275pipe(44, "translate"); 664 \u0275\u0275domElementEnd()()(); 665 } 666 if (rf & 2) { 667 const ctx_r1 = \u0275\u0275nextContext(); 668 \u0275\u0275advance(3); 669 \u0275\u0275conditional(ctx_r1.isNewItem() ? 3 : 4); 670 \u0275\u0275advance(8); 671 \u0275\u0275textInterpolate1("", \u0275\u0275pipeBind1(12, 17, "settings.form.name"), " *"); 672 \u0275\u0275advance(6); 673 \u0275\u0275domProperty("value", ctx_r1.formTranslations().ro)("placeholder", \u0275\u0275pipeBind1(18, 19, "settings.form.namePlaceholder")); 674 \u0275\u0275advance(5); 675 \u0275\u0275domProperty("value", ctx_r1.formTranslations().en)("placeholder", \u0275\u0275pipeBind1(23, 21, "settings.form.namePlaceholder")); 676 \u0275\u0275advance(5); 677 \u0275\u0275domProperty("value", ctx_r1.formTranslations().ru)("placeholder", \u0275\u0275pipeBind1(28, 23, "settings.form.namePlaceholder")); 678 \u0275\u0275advance(2); 679 \u0275\u0275conditional(ctx_r1.activeTab() === "cuisines" ? 29 : -1); 680 \u0275\u0275advance(4); 681 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(34, 25, "settings.form.active")); 682 \u0275\u0275advance(2); 683 \u0275\u0275classProp("active", ctx_r1.formActive()); 684 \u0275\u0275advance(3); 685 \u0275\u0275domProperty("disabled", ctx_r1.isSubmitting()); 686 \u0275\u0275advance(); 687 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(40, 27, "common.cancel"), " "); 688 \u0275\u0275advance(2); 689 \u0275\u0275domProperty("disabled", ctx_r1.isSubmitting()); 690 \u0275\u0275advance(); 691 \u0275\u0275conditional(ctx_r1.isSubmitting() ? 42 : -1); 692 \u0275\u0275advance(); 693 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(44, 29, "common.save"), " "); 694 } 695} 696var SettingsComponent = class _SettingsComponent { 697 settingsService = inject(SettingsService); 698 translationService = inject(TranslationService); 699 toastService = inject(ToastService); 700 authService = inject(AuthService); 701 // Check if user is admin 702 isAdmin = this.authService.isAdmin; 703 // Current tab 704 activeTab = signal("tags", ...ngDevMode ? [{ debugName: "activeTab" }] : []); 705 // Data 706 tags = signal([], ...ngDevMode ? [{ debugName: "tags" }] : []); 707 cuisines = signal([], ...ngDevMode ? [{ debugName: "cuisines" }] : []); 708 // Loading states 709 isLoading = signal(false, ...ngDevMode ? [{ debugName: "isLoading" }] : []); 710 isSubmitting = signal(false, ...ngDevMode ? [{ debugName: "isSubmitting" }] : []); 711 // Dialog state 712 isDialogOpen = signal(false, ...ngDevMode ? [{ debugName: "isDialogOpen" }] : []); 713 editingItem = signal(null, ...ngDevMode ? [{ debugName: "editingItem" }] : []); 714 isNewItem = signal(false, ...ngDevMode ? [{ debugName: "isNewItem" }] : []); 715 // Form data 716 formTranslations = signal({ ro: "", en: "", ru: "" }, ...ngDevMode ? [{ debugName: "formTranslations" }] : []); 717 formActive = signal(true, ...ngDevMode ? [{ debugName: "formActive" }] : []); 718 formCuisineType = signal("regional", ...ngDevMode ? [{ debugName: "formCuisineType" }] : []); 719 // Delete confirmation 720 deletingId = signal(null, ...ngDevMode ? [{ debugName: "deletingId" }] : []); 721 // Computed 722 currentLang = computed(() => this.translationService.currentLanguage(), ...ngDevMode ? [{ debugName: "currentLang" }] : []); 723 cuisineTypes = ["regional", "international"]; 724 ngOnInit() { 725 this.loadData(); 726 } 727 loadData() { 728 this.isLoading.set(true); 729 const tagsRequest = this.isAdmin() ? this.settingsService.getTags() : this.settingsService.getActiveTags(); 730 tagsRequest.subscribe({ 731 next: (tags) => { 732 this.tags.set(this.sortDeletedLast(tags)); 733 this.loadCuisines(); 734 }, 735 error: (err) => { 736 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 737 this.isLoading.set(false); 738 } 739 }); 740 } 741 loadCuisines() { 742 const cuisinesRequest = this.isAdmin() ? this.settingsService.getCuisines() : this.settingsService.getActiveCuisines(); 743 cuisinesRequest.subscribe({ 744 next: (cuisines) => { 745 this.cuisines.set(this.sortDeletedLast(cuisines)); 746 this.isLoading.set(false); 747 }, 748 error: (err) => { 749 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 750 this.isLoading.set(false); 751 } 752 }); 753 } 754 // Sort items: non-deleted first, deleted at the end 755 sortDeletedLast(items) { 756 return [...items].sort((a, b) => { 757 if (a.deletedAt && !b.deletedAt) 758 return 1; 759 if (!a.deletedAt && b.deletedAt) 760 return -1; 761 return 0; 762 }); 763 } 764 // Helper to check if item is deleted 765 isDeleted(item) { 766 return !!item.deletedAt; 767 } 768 // Format deleted date for tooltip 769 formatDeletedDate(dateStr) { 770 const date = new Date(dateStr); 771 return date.toLocaleDateString(this.translationService.currentLanguage(), { 772 day: "2-digit", 773 month: "2-digit", 774 year: "numeric", 775 hour: "2-digit", 776 minute: "2-digit" 777 }); 778 } 779 setActiveTab(tab) { 780 this.activeTab.set(tab); 781 } 782 getName(item) { 783 return getSettingsName(item, this.currentLang()); 784 } 785 // ============================================ 786 // DIALOG METHODS 787 // ============================================ 788 openAddDialog() { 789 this.editingItem.set(null); 790 this.isNewItem.set(true); 791 this.formTranslations.set({ ro: "", en: "", ru: "" }); 792 this.formActive.set(true); 793 this.formCuisineType.set("regional"); 794 this.isDialogOpen.set(true); 795 } 796 openEditDialog(item) { 797 this.editingItem.set(item); 798 this.isNewItem.set(false); 799 const trans = { ro: "", en: "", ru: "" }; 800 if (item.name) { 801 trans.ro = item.name; 802 trans.en = item.name; 803 trans.ru = item.name; 804 } else if (item.translations) { 805 item.translations.forEach((t) => { 806 if (t.lang === "ro") 807 trans.ro = t.name; 808 if (t.lang === "en") 809 trans.en = t.name; 810 if (t.lang === "ru") 811 trans.ru = t.name; 812 }); 813 } 814 this.formTranslations.set(trans); 815 this.formActive.set(item.active); 816 if ("type" in item) { 817 this.formCuisineType.set(item.type); 818 } 819 this.isDialogOpen.set(true); 820 } 821 closeDialog() { 822 this.isDialogOpen.set(false); 823 this.editingItem.set(null); 824 this.isNewItem.set(false); 825 } 826 updateTranslation(lang, event) { 827 const value = event.target.value; 828 const current = this.formTranslations(); 829 this.formTranslations.set(__spreadProps(__spreadValues({}, current), { [lang]: value })); 830 } 831 toggleActive() { 832 this.formActive.update((v) => !v); 833 } 834 setCuisineType(type) { 835 this.formCuisineType.set(type); 836 } 837 // ============================================ 838 // SAVE METHODS 839 // ============================================ 840 saveItem() { 841 const trans = this.formTranslations(); 842 if (!trans.ro.trim() && !trans.en.trim() && !trans.ru.trim()) { 843 this.toastService.error(this.translationService.translate("settings.val
843idation.nameRequired")); 844 return; 845 } 846 const translations = []; 847 if (trans.ro.trim()) 848 translations.push({ lang: "ro", name: trans.ro.trim() }); 849 if (trans.en.trim()) 850 translations.push({ lang: "en", name: trans.en.trim() }); 851 if (trans.ru.trim()) 852 translations.push({ lang: "ru", name: trans.ru.trim() }); 853 this.isSubmitting.set(true); 854 if (this.activeTab() === "tags") { 855 this.saveTag(translations); 856 } else { 857 this.saveCuisine(translations); 858 } 859 } 860 saveTag(translations) { 861 const editing = this.editingItem(); 862 if (editing && !this.isNewItem()) { 863 this.settingsService.updateTag(editing._id, { 864 active: this.formActive(), 865 translations 866 }).subscribe({ 867 next: () => { 868 this.toastService.success(this.translationService.translate("settings.tags.updateSuccess")); 869 this.closeDialog(); 870 this.loadData(); 871 this.isSubmitting.set(false); 872 }, 873 error: (err) => { 874 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 875 this.isSubmitting.set(false); 876 } 877 }); 878 } else { 879 this.settingsService.createTag({ 880 active: this.formActive(), 881 translations 882 }).subscribe({ 883 next: () => { 884 this.toastService.success(this.translationService.translate("settings.tags.createSuccess")); 885 this.closeDialog(); 886 this.loadData(); 887 this.isSubmitting.set(false); 888 }, 889 error: (err) => { 890 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 891 this.isSubmitting.set(false); 892 } 893 }); 894 } 895 } 896 saveCuisine(translations) { 897 const editing = this.editingItem(); 898 if (editing && !this.isNewItem()) { 899 this.settingsService.updateCuisine(editing._id, { 900 active: this.formActive(), 901 type: this.formCuisineType(), 902 translations 903 }).subscribe({ 904 next: () => { 905 this.toastService.success(this.translationService.translate("settings.cuisines.updateSuccess")); 906 this.closeDialog(); 907 this.loadData(); 908 this.isSubmitting.set(false); 909 }, 910 error: (err) => { 911 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 912 this.isSubmitting.set(false); 913 } 914 }); 915 } else { 916 this.settingsService.createCuisine({ 917 active: this.formActive(), 918 type: this.formCuisineType(), 919 translations 920 }).subscribe({ 921 next: () => { 922 this.toastService.success(this.translationService.translate("settings.cuisines.createSuccess")); 923 this.closeDialog(); 924 this.loadData(); 925 this.isSubmitting.set(false); 926 }, 927 error: (err) => { 928 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 929 this.isSubmitting.set(false); 930 } 931 }); 932 } 933 } 934 // ============================================ 935 // DELETE METHODS 936 // ============================================ 937 confirmDelete(id) { 938 this.deletingId.set(id); 939 } 940 cancelDelete() { 941 this.deletingId.set(null); 942 } 943 deleteItem(id) { 944 this.isSubmitting.set(true); 945 if (this.activeTab() === "tags") { 946 this.settingsService.deleteTag(id).subscribe({ 947 next: () => { 948 this.toastService.success(this.translationService.translate("settings.tags.deleteSuccess")); 949 this.deletingId.set(null); 950 this.loadData(); 951 this.isSubmitting.set(false); 952 }, 953 error: (err) => { 954 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 955 this.isSubmitting.set(false); 956 } 957 }); 958 } else { 959 this.settingsService.deleteCuisine(id).subscribe({ 960 next: () => { 961 this.toastService.success(this.translationService.translate("settings.cuisines.deleteSuccess")); 962 this.deletingId.set(null); 963 this.loadData(); 964 this.isSubmitting.set(false); 965 }, 966 error: (err) => { 967 this.toastService.error(err.message || this.translationService.translate("errors.generic")); 968 this.isSubmitting.set(false); 969 } 970 }); 971 } 972 } 973 static \u0275fac = function SettingsComponent_Factory(__ngFactoryType__) { 974 return new (__ngFactoryType__ || _SettingsComponent)(); 975 }; 976 static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _SettingsComponent, selectors: [["app-settings"]], decls: 34, vars: 27, consts: [[1, "settings-page"], [1, "page-header"], [1, "header-content"], [1, "page-title"], [1, "page-subtitle"], ["type", "button", 1, "btn", "btn-primary", 3, "click"], [1, "material-symbols-rounded"], [1, "tabs"], ["type", "button", 1, "tab", 3, "click"], [1, "tab-count"], [1, "loading-state"], [1, "content-card"], [1, "dialog-backdrop"], [1, "dialog"], [1, "spinner"], [1, "empty-state"], [1, "items-list"], [1, "item-row", 3, "inactive", "deleted"], [1, "item-row"], [1, "item-info"], [1, "item-name"], [1, "status-badge", "deleted", 3, "title"], [1, "status-badge", "inactive"], [1, "item-actions"], [1, "delete-confirm"], [1, "confirm-text"], ["type", "button", 1, "btn", "btn-sm", "btn-danger", 3, "click", "disabled"], ["type", "button", 1, "btn", "btn-sm", "btn-outline", 3, "click", "disabled"], ["type", "button", 1, "btn-icon", 3, "click", "title"], ["type", "button", 1, "btn-icon", "btn-icon-danger", 3, "click", "title"], [1, "type-badge"], [1, "dialog-backdrop", 3, "click"], [1, "dialog-header"], [1, "dialog-title"], ["type", "button", 1, "dialog-close", 3, "click"], [1, "dialog-body"], [1, "form-section"], [1, "form-label"], [1, "translation-inputs"], [1, "translation-row"], [1, "lang-label"], ["type", "text", 1, "form-input", 3, "input", "value", "placeholder"], [1, "toggle-row", 3, "click"], [1, "toggle-label"], [1, "toggle"], [1, "toggle-thumb"], [1, "dialog-footer"], ["type", "button", 1, "btn", "btn-outline", 3, "click", "disabled"], ["type", "button", 1, "btn", "btn-primary", 3, "click", "disabled"], [1, "spinner-small"], [1, "type-options"], ["type", "button", 1, "type-option", 3, "active"], ["type", "button", 1, "type-option", 3, "click"]], template: function SettingsComponent_Template(rf, ctx) { 977 if (rf & 1) { 978 \u0275\u0275domElementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h1", 3); 979 \u0275\u0275text(4); 980 \u0275\u0275pipe(5, "translate"); 981 \u0275\u0275domElementEnd(); 982 \u0275\u0275domElementStart(6, "p", 4); 983 \u0275\u0275text(7); 984 \u0275\u0275pipe(8, "translate"); 985 \u0275\u0275domElementEnd()(); 986 \u0275\u0275domElementStart(9, "button", 5); 987 \u0275\u0275domListener("click", function SettingsComponent_Template_button_click_9_listener() { 988 return ctx.openAddDialog(); 989 }); 990 \u0275\u0275domElementStart(10, "span", 6); 991 \u0275\u0275text(11, "add"); 992 \u0275\u0275domElementEnd(); 993 \u0275\u0275text(12); 994 \u0275\u0275pipe(13, "translate"); 995 \u0275\u0275pipe(14, "translate"); 996 \u0275\u0275domElementEnd()(); 997 \u0275\u0275domElementStart(15, "div", 7)(16, "button", 8); 998 \u0275\u0275domListener("click", function SettingsComponent_Template_button_click_16_listener() { 999 return ctx.setActiveTab("tags"); 1000 }); 1001 \u0275\u0275domElementStart(17, "span", 6); 1002 \u0275\u0275text(18, "label"); 1003 \u0275\u0275domElementEnd(); 1004 \u0275\u0275text(19); 1005 \u0275\u0275pipe(20, "translate"); 1006 \u0275\u0275domElementStart(21, "span", 9); 1007 \u0275\u0275text(22); 1008 \u0275\u0275domElementEnd()(); 1009 \u0275\u0275domElementStart(23, "button", 8); 1010 \u0275\u0275domListener("click", function SettingsComponent_Template_button_click_23_listener() { 1011 return ctx.setActiveTab("cuisines"); 1012 }); 1013 \u0275\u0275domElementStart(24, "span", 6); 1014 \u0275\u0275text(25, "restaurant_menu"); 1015 \u0275\u0275domElementEnd(); 1016 \u0275\u0275text(26); 1017 \u0275\u0275pipe(27, "translate"); 1018 \u0275\u0275domElementStart(28, "span", 9); 1019 \u0275\u0275text(29); 1020 \u0275\u0275domElementEnd()()(); 1021 \u0275\u0275conditionalCreate(30, SettingsComponent_Conditional_30_Template, 5, 3, "div", 10); 1022 \u0275\u0275conditionalCreate(31, SettingsComponent_Conditional_31_Template, 3, 2, "div", 11); 1023 \u0275\u0275domElementEnd(); 1024 \u0275\u0275conditionalCreate(32, SettingsComponent_Conditional_32_Template, 1, 0, "div", 12); 1025 \u0275\u0275conditionalCreate(33, SettingsComponent_Conditional_33_Template, 45, 31, "div", 13); 1026 } 1027 if (rf & 2) { 1028 \u0275\u0275advance(4); 1029 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 15, "settings.title")); 1030 \u0275\u0275advance(3); 1031 \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(8, 17, "settings.subtitle")); 1032 \u0275\u0275advance(5); 1033 \u0275\u0275textInterpolate1(" ", ctx.activeTab() === "tags" ? \u0275\u0275pipeBind1(13, 19, "settings.tags.add") : \u0275\u0275pipeBind1(14, 21, "settings.cuisines.add"), " "); 1034 \u0275\u0275advance(4); 1035 \u0275\u0275classProp("active", ctx.activeTab() === "tags"); 1036 \u0275\u0275advance(3); 1037 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(20, 23, "settings.tabs.tags"), " "); 1038 \u0275\u0275advance(3); 1039 \u0275\u0275textInterpolate(ctx.tags().length); 1040 \u0275\u0275advance(); 1041 \u0275\u0275classProp("active", ctx.activeTab() === "cuisines"); 1042 \u0275\u0275advance(3); 1043 \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(27, 25, "settings.tabs.cuisines"), " "); 1044 \u0275\u0275advance(3); 1045 \u0275\u0275textInterpolate(ctx.cuisines().length); 1046 \u0275\u0275advance(); 1047 \u0275\u0275conditional(ctx.isLoading() ? 30 : -1); 1048 \u0275\u0275advance(); 1049 \u0275\u0275conditional(!ctx.isLoading() ? 31 : -1); 1050 \u0275\u0275advance(); 1051 \u0275\u0275conditional(ctx.isDialogOpen() ? 32 : -1); 1052 \u0275\u0275advance(); 1053 \u0275\u0275conditional(ctx.isDialogOpen() ? 33 : -1); 1054 } 1055 }, dependencies: [CommonModule, FormsModule, TranslatePipe], styles: ["\n\n.settings-page[_ngcontent-%COMP%] {\n max-width: 900px;\n margin: 0 auto;\n}\n.page-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1.25rem;\n}\n@media (max-width: 576px) {\n .page-header[_ngcontent-%COMP%] {\n flex-direction: column;
1055\n align-items: stretch;\n }\n}\n.header-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n.page-title[_ngcontent-%COMP%] {\n font-size: 1.875rem;\n font-weight: 700;\n color: #25130E;\n margin: 0 0 0.25rem 0;\n}\n.page-subtitle[_ngcontent-%COMP%] {\n font-size: 1rem;\n color: #868686;\n margin: 0;\n}\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n margin-bottom: 1rem;\n background-color: #FFFFFF;\n padding: 0.5rem;\n border-radius: 0.75rem;\n box-shadow: 0 2px 12px rgba(246, 241, 233, 0.8), 0 4px 20px rgba(37, 19, 14, 0.06);\n}\n.tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.tab[_ngcontent-%COMP%]:hover {\n background-color: #F6F1E9;\n color: #25130E;\n}\n.tab.active[_ngcontent-%COMP%] {\n background-color: #0F6E86;\n color: #FFFFFF;\n}\n.tab.active[_ngcontent-%COMP%] .material-symbols-rounded[_ngcontent-%COMP%] {\n color: #FFFFFF;\n}\n.tab.active[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background-color: rgba(255, 255, 255, 0.2);\n color: #FFFFFF;\n}\n.tab[_ngcontent-%COMP%] .material-symbols-rounded[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n.tab-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 0.25rem;\n background-color: #F6F1E9;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 9999px;\n}\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n background-color: #FFFFFF;\n border-radius: 0.75rem;\n box-shadow: 0 2px 12px rgba(246, 241, 233, 0.8), 0 4px 20px rgba(37, 19, 14, 0.06);\n}\n.loading-state[_ngcontent-%COMP%] .spinner[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border: 3px solid #E0E0E0;\n border-top-color: #0F6E86;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 0.8s linear infinite;\n margin-bottom: 1rem;\n}\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: #868686;\n margin: 0;\n}\n@keyframes _ngcontent-%COMP%_spin {\n to {\n transform: rotate(360deg);\n }\n}\n.content-card[_ngcontent-%COMP%] {\n background-color: #FFFFFF;\n border-radius: 0.75rem;\n box-shadow: 0 2px 12px rgba(246, 241, 233, 0.8), 0 4px 20px rgba(37, 19, 14, 0.06);\n overflow: hidden;\n}\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem;\n text-align: center;\n}\n.empty-state[_ngcontent-%COMP%] .material-symbols-rounded[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #868686;\n opacity: 0.5;\n margin-bottom: 0.75rem;\n}\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: #868686;\n margin: 0;\n}\n.items-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n.item-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #F0F0F0;\n transition: background-color 150ms ease;\n}\n.item-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n.item-row[_ngcontent-%COMP%]:hover {\n background-color: #F6F1E9;\n}\n.item-row.inactive[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n.item-row.deleted[_ngcontent-%COMP%] {\n opacity: 0.5;\n background-color: rgba(232, 90, 79, 0.03);\n}\n.item-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n.item-name[_ngcontent-%COMP%] {\n font-size: 1rem;\n font-weight: 500;\n color: #25130E;\n}\n.type-badge[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n background-color: rgba(15, 110, 134, 0.1);\n color: #0F6E86;\n border-radius: 0.5rem;\n font-weight: 500;\n}\n.status-badge[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n border-radius: 0.5rem;\n font-weight: 500;\n cursor: default;\n}\n.status-badge.inactive[_ngcontent-%COMP%] {\n background-color: rgba(134, 134, 134, 0.1);\n color: #868686;\n}\n.status-badge.deleted[_ngcontent-%COMP%] {\n background-color: rgba(232, 90, 79, 0.1);\n color: #E85A4F;\n}\n.item-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n.btn-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.btn-icon[_ngcontent-%COMP%]:hover {\n background-color: rgba(15, 110, 134, 0.1);\n color: #0F6E86;\n}\n.btn-icon.btn-icon-danger[_ngcontent-%COMP%]:hover {\n background-color: rgba(232, 90, 79, 0.1);\n color: #E85A4F;\n}\n.btn-icon[_ngcontent-%COMP%] .material-symbols-rounded[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n.delete-confirm[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.confirm-text[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n color: #868686;\n}\n.dialog-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 400;\n}\n.dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: calc(100% - 2rem);\n max-width: 480px;\n max-height: calc(100vh - 2rem);\n background-color: #FFFFFF;\n border-radius: 1rem;\n box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);\n z-index: 500;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid #F0F0F0;\n}\n.dialog-title[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n font-weight: 600;\n color: #25130E;\n margin: 0;\n}\n.dialog-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 9999px;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.dialog-close[_ngcontent-%COMP%]:hover {\n background-color: #F6F1E9;\n color: #25130E;\n}\n.dialog-body[_ngcontent-%COMP%] {\n padding: 1.25rem;\n overflow-y: auto;\n}\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1rem 1.25rem;\n border-top: 1px solid #F0F0F0;\n background-color: #F6F1E9;\n}\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n.form-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #25130E;\n margin-bottom: 0.5rem;\n}\n.translation-inputs[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n.translation-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.lang-label[_ngcontent-%COMP%] {\n width: 32px;\n font-size: 0.75rem;\n font-weight: 600;\n color: #868686;\n text-align: center;\n}\n.form-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.5rem 0.75rem;\n border: 1px solid #E0E0E0;\n border-radius: 0.5rem;\n font-size: 1rem;\n color: #25130E;\n transition: border-color 150ms ease;\n}\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #0F6E86;\n}\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: #868686;\n opacity: 0.6;\n}\n.type-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n}\n.type-option[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.5rem 0.75rem;\n border: 1px solid #E0E0E0;\n background: transparent;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.type-option[_ngcontent-%COMP%]:hover {\n border-color: #0F6E86;\n color: #0F6E86;\n}\n.type-option.active[_ngcontent-%COMP%] {\n background-color: #0F6E86;\n border-color: #0F6E86;\n color: #FFFFFF;\n}\n.toggle-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n}\n.toggle-label[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n font-weight: 500;\n color: #25130E;\n}\n.toggle[_ngcontent-%COMP%] {\n position: relative;\n width: 44px;\n height: 24px;\n background-color: #E0E0E0;\n border-radius: 12px;\n transition: background-color 150ms ease;\n}\n.toggle.active[_ngcontent-%COMP%] {\n background-color: #0F6E86;\n}\n.toggle.active[_ngcontent-%COMP%] .toggle-thumb[_ngcontent-%COMP%] {\n transform: translateX(20px);\n}\n.toggle-thumb[_ngcontent-%COMP%] {\n position: absolute;\n top: 2px;\n left: 2px;
1055\n width: 20px;\n height: 20px;\n background-color: #FFFFFF;\n border-radius: 50%;\n transition: transform 150ms ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n.btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.btn[_ngcontent-%COMP%] .material-symbols-rounded[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n.btn-primary[_ngcontent-%COMP%] {\n background-color: #0F6E86;\n color: #FFFFFF;\n}\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #0a5066;\n}\n.btn-outline[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid #E0E0E0;\n color: #25130E;\n}\n.btn-outline[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #0F6E86;\n color: #0F6E86;\n}\n.btn-sm[_ngcontent-%COMP%] {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n}\n.btn-danger[_ngcontent-%COMP%] {\n background-color: #E85A4F;\n color: #FFFFFF;\n}\n.btn-danger[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #C62828;\n}\n.spinner-small[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: #FFFFFF;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 0.8s linear infinite;\n}\n/*# sourceMappingURL=settings.component-3JI7VWGV.css.map */"] }); 1056}; 1057(() => { 1058 (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SettingsComponent, [{ 1059 type: Component, 1060 args: [{ selector: "app-settings", standalone: true, imports: [CommonModule, FormsModule, TranslatePipe], template: `<div class="settings-page"> 1061 <!-- Page Header --> 1062 <div class="page-header"> 1063 <div class="header-content"> 1064 <h1 class="page-title">{{ 'settings.title' | translate }}</h1> 1065 <p class="page-subtitle">{{ 'settings.subtitle' | translate }}</p> 1066 </div> 1067 <button type="button" class="btn btn-primary" (click)="openAddDialog()"> 1068 <span class="material-symbols-rounded">add</span> 1069 {{ activeTab() === 'tags' ? ('settings.tags.add' | translate) : ('settings.cuisines.add' | translate) }} 1070 </button> 1071 </div> 1072 1073 <!-- Tabs --> 1074 <div class="tabs"> 1075 <button 1076 type="button" 1077 class="tab" 1078 [class.active]="activeTab() === 'tags'" 1079 (click)="setActiveTab('tags')" 1080 > 1081 <span class="material-symbols-rounded">label</span> 1082 {{ 'settings.tabs.tags' | translate }} 1083 <span class="tab-count">{{ tags().length }}</span> 1084 </button> 1085 <button 1086 type="button" 1087 class="tab" 1088 [class.active]="activeTab() === 'cuisines'" 1089 (click)="setActiveTab('cuisines')" 1090 > 1091 <span class="material-symbols-rounded">restaurant_menu</span> 1092 {{ 'settings.tabs.cuisines' | translate }} 1093 <span class="tab-count">{{ cuisines().length }}</span> 1094 </button> 1095 </div> 1096 1097 <!-- Loading State --> 1098 @if (isLoading()) { 1099 <div class="loading-state"> 1100 <div class="spinner"></div> 1101 <p>{{ 'common.loading' | translate }}</p> 1102 </div> 1103 } 1104 1105 <!-- Content --> 1106 @if (!isLoading()) { 1107 <div class="content-card"> 1108 <!-- Tags List --> 1109 @if (activeTab() === 'tags') { 1110 @if (tags().length === 0) { 1111 <div class="empty-state"> 1112 <span class="material-symbols-rounded">label_off</span> 1113 <p>{{ 'settings.tags.empty' | translate }}</p> 1114 </div> 1115 } @else { 1116 <div class="items-list"> 1117 @for (tag of tags(); track tag._id) { 1118 <div class="item-row" [class.inactive]="!tag.active" [class.deleted]="isDeleted(tag)"> 1119 <div class="item-info"> 1120 <span class="item-name">{{ getName(tag) }}</span> 1121 @if (isDeleted(tag)) { 1122 <span 1123 class="status-badge deleted" 1124 [title]="('settings.deletedAt' | translate) + ': ' + formatDeletedDate(tag.deletedAt!)" 1125 > 1126 {{ 'common.deleted' | translate }} 1127 </span> 1128 } @else if (!tag.active) {
1129 <span class="status-badge inactive">{{ 'common.inactive' | translate }}</span> 1130 } 1131 </div> 1132 <div class="item-actions"> 1133 @if (deletingId() === tag._id) { 1134 <div class="delete-confirm"> 1135 <span class="confirm-text">{{ 'common.deleteConfirm' | translate }}</span> 1136 <button 1137 type="button" 1138 class="btn btn-sm btn-danger" 1139 (click)="deleteItem(tag._id)" 1140 [disabled]="isSubmitting()" 1141 > 1142 {{ 'common.yes' | translate }} 1143 </button> 1144 <button 1145 type="button" 1146 class="btn btn-sm btn-outline" 1147 (click)="cancelDelete()" 1148 [disabled]="isSubmitting()" 1149 > 1150 {{ 'common.no' | translate }} 1151 </button> 1152 </div> 1153 } @else { 1154 <button 1155 type="button" 1156 class="btn-icon" 1157 (click)="openEditDialog(tag)" 1158 [title]="'common.edit' | translate" 1159 > 1160 <span class="material-symbols-rounded">edit</span> 1161 </button> 1162 <button 1163 type="button" 1164 class="btn-icon btn-icon-danger" 1165 (click)="confirmDelete(tag._id)" 1166 [title]="'common.delete' | translate" 1167 > 1168 <span class="material-symbols-rounded">delete</span> 1169 </button> 1170 } 1171 </div> 1172 </div> 1173 } 1174 </div> 1175 } 1176 } 1177 1178 <!-- Cuisines List --> 1179 @if (activeTab() === 'cuisines') { 1180 @if (cuisines().length === 0) { 1181 <div class="empty-state"> 1182 <span class="material-symbols-rounded">no_meals</span> 1183 <p>{{ 'settings.cuisines.empty' | translate }}</p> 1184 </div> 1185 } @else { 1186 <div class="items-list"> 1187 @for (cuisine of cuisines(); track cuisine._id) { 1188 <div class="item-row" [class.inactive]="!cuisine.active" [class.deleted]="isDeleted(cuisine)"> 1189 <div class="item-info"> 1190 <span class="item-name">{{ getName(cuisine) }}</span> 1191 <span class="type-badge">{{ 'settings.cuisines.types.' + cuisine.type | translate }}</span> 1192 @if (isDeleted(cuisine)) { 1193 <span 1194 class="status-badge deleted" 1195 [title]="('settings.deletedAt' | translate) + ': ' + formatDeletedDate(cuisine.deletedAt!)" 1196 > 1197 {{ 'common.deleted' | translate }} 1198 </span> 1199 } @else if (!cuisine.active) { 1200 <span class="status-badge inactive">{{ 'common.inactive' | translate }}</span> 1201 } 1202 </div> 1203 <div class="item-actions"> 1204 @if (deletingId() === cuisine._id) { 1205 <div class="delete-confirm"> 1206 <span class="confirm-text">{{ 'common.deleteConfirm' | translate }}</span> 1207 <button 1208 type="button" 1209 class="btn btn-sm btn-danger" 1210 (click)="deleteItem(cuisine._id)" 1211 [disabled]="isSubmitting()" 1212 > 1213 {{ 'common.yes' | translate }} 1214 </button> 1215 <button 1216 type="button" 1217 class="btn btn-sm btn-outline" 1218 (click)="cancelDelete()" 1219 [disabled]="isSubmitting()" 1220 > 1221 {{ 'common.no' | translate }} 1222 </button> 1223 </div> 1224 } @else { 1225 <button 1226 type="button" 1227 class="btn-icon" 1228 (click)="openEditDialog(cuisine)" 1229 [title]="'common.edit' | translate" 1230 >
1231 <span class="material-symbols-rounded">edit</span> 1232 </button> 1233 <button 1234 type="button" 1235 class="btn-icon btn-icon-danger" 1236 (click)="confirmDelete(cuisine._id)" 1237 [title]="'common.delete' | translate" 1238 > 1239 <span class="material-symbols-rounded">delete</span> 1240 </button> 1241 } 1242 </div> 1243 </div> 1244 } 1245 </div> 1246 } 1247 } 1248 </div> 1249 } 1250</div> 1251 1252<!-- Dialog Backdrop --> 1253@if (isDialogOpen()) { 1254 <div class="dialog-backdrop" (click)="closeDialog()"></div> 1255} 1256 1257<!-- Add/Edit Dialog --> 1258@if (isDialogOpen()) { 1259 <div class="dialog"> 1260 <div class="dialog-header"> 1261 <h2 class="dialog-title"> 1262 @if (isNewItem()) { 1263 {{ activeTab() === 'tags' ? ('settings.tags.add' | translate) : ('settings.cuisines.add' | translate) }} 1264 } @else { 1265 {{ activeTab() === 'tags' ? ('settings.tags.edit' | translate) : ('settings.cuisines.edit' | translate) }} 1266 } 1267 </h2> 1268 <button type="button" class="dialog-close" (click)="closeDialog()"> 1269 <span class="material-symbols-rounded">close</span> 1270 </button> 1271 </div> 1272 1273 <div class="dialog-body"> 1274 <!-- Translations --> 1275 <div class="form-section"> 1276 <label class="form-label">{{ 'settings.form.name' | translate }} *</label> 1277 <div class="translation-inputs"> 1278 <div class="translation-row"> 1279 <span class="lang-label">RO</span> 1280 <input 1281 type="text" 1282 class="form-input" 1283 [value]="formTranslations().ro" 1284 (input)="updateTranslation('ro', $event)" 1285 [placeholder]="'settings.form.namePlaceholder' | translate" 1286 /> 1287 </div> 1288 <div class="translation-row"> 1289 <span class="lang-label">EN</span> 1290 <input 1291 type="text" 1292 class="form-input" 1293 [value]="formTranslations().en" 1294 (input)="updateTranslation('en', $event)" 1295 [placeholder]="'settings.form.namePlaceholder' | translate" 1296 /> 1297 </div> 1298 <div class="translation-row"> 1299 <span class="lang-label">RU</span> 1300 <input 1301 type="text" 1302 class="form-input" 1303 [value]="formTranslations().ru" 1304 (input)="updateTranslation('ru', $event)" 1305 [placeholder]="'settings.form.namePlaceholder' | translate" 1306 /> 1307 </div> 1308 </div> 1309 </div> 1310 1311 <!-- Cuisine Type (only for cuisines) --> 1312 @if (activeTab() === 'cuisines') { 1313 <div class="form-section"> 1314 <label class="form-label">{{ 'settings.form.type' | translate }}</label> 1315 <div class="type-options"> 1316 @for (type of cuisineTypes; track type) { 1317 <button 1318 type="button" 1319 class="type-option" 1320 [class.active]="formCuisineType() === type" 1321 (click)="setCuisineType(type)" 1322 > 1323 {{ 'settings.cuisines.types.' + type | translate }} 1324 </button> 1325 } 1326 </div> 1327 </div> 1328 } 1329 1330 <!-- Active Toggle --> 1331 <div class="form-section"> 1332 <label class="toggle-row" (click)="toggleActive()"> 1333 <span class="toggle-label">{{ 'settings.form.active' | translate }}</span> 1334 <span class="toggle" [class.active]="formActive()"> 1335 <span class="toggle-thumb"></span> 1336 </span> 1337 </label> 1338 </div> 1339 </div> 1340 1341 <div class="dialog-footer"> 1342 <button 1343 type="button" 1344 class="btn btn-outline" 1345 (click)="closeDialog()" 1346 [disabled]="isSubmitting()" 1347 > 1348 {{ 'common.cancel' | translate }} 1349 </button> 1350 <button 1351 type="button" 1352 class="btn btn-primary" 1353 (click)="saveItem()" 1354 [disabled]="isSubmitting()" 1355 > 1356 @if (isSubmitting()) {
1357 <span class="spinner-small"></span> 1358 } 1359 {{ 'common.save' | translate }} 1360 </button> 1361 </div> 1362 </div> 1363} 1364`, styles: ["/* src/app/features/dashboard/pages/settings/settings.component.scss */\n.settings-page {\n max-width: 900px;\n margin: 0 auto;\n}\n.page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 1.25rem;\n}\n@media (max-width: 576px) {\n .page-header {\n flex-direction: column;\n align-items: stretch;\n }\n}\n.header-content {\n flex: 1;\n}\n.page-title {\n font-size: 1.875rem;\n font-weight: 700;\n color: #25130E;\n margin: 0 0 0.25rem 0;\n}\n.page-subtitle {\n font-size: 1rem;\n color: #868686;\n margin: 0;\n}\n.tabs {\n display: flex;\n gap: 0.5rem;\n margin-bottom: 1rem;\n background-color: #FFFFFF;\n padding: 0.5rem;\n border-radius: 0.75rem;\n box-shadow: 0 2px 12px rgba(246, 241, 233, 0.8), 0 4px 20px rgba(37, 19, 14, 0.06);\n}\n.tab {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.tab:hover {\n background-color: #F6F1E9;\n color: #25130E;\n}\n.tab.active {\n background-color: #0F6E86;\n color: #FFFFFF;\n}\n.tab.active .material-symbols-rounded {\n color: #FFFFFF;\n}\n.tab.active .tab-count {\n background-color: rgba(255, 255, 255, 0.2);\n color: #FFFFFF;\n}\n.tab .material-symbols-rounded {\n font-size: 20px;\n}\n.tab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 0.25rem;\n background-color: #F6F1E9;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 9999px;\n}\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n background-color: #FFFFFF;\n border-radius: 0.75rem;\n box-shadow: 0 2px 12px rgba(246, 241, 233, 0.8), 0 4px 20px rgba(37, 19, 14, 0.06);\n}\n.loading-state .spinner {\n width: 40px;\n height: 40px;\n border: 3px solid #E0E0E0;\n border-top-color: #0F6E86;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-bottom: 1rem;\n}\n.loading-state p {\n color: #868686;\n margin: 0;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.content-card {\n background-color: #FFFFFF;\n border-radius: 0.75rem;\n box-shadow: 0 2px 12px rgba(246, 241, 233, 0.8), 0 4px 20px rgba(37, 19, 14, 0.06);\n overflow: hidden;\n}\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem;\n text-align: center;\n}\n.empty-state .material-symbols-rounded {\n font-size: 48px;\n color: #868686;\n opacity: 0.5;\n margin-bottom: 0.75rem;\n}\n.empty-state p {\n color: #868686;\n margin: 0;\n}\n.items-list {\n display: flex;\n flex-direction: column;\n}\n.item-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #F0F0F0;\n transition: background-color 150ms ease;\n}\n.item-row:last-child {\n border-bottom: none;\n}\n.item-row:hover {\n background-color: #F6F1E9;\n}\n.item-row.inactive {\n opacity: 0.6;\n}\n.item-row.deleted {\n opacity: 0.5;\n background-color: rgba(232, 90, 79, 0.03);\n}\n.item-info {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n.item-name {\n font-size: 1rem;\n font-weight: 500;\n color: #25130E;\n}\n.type-badge {\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n background-color: rgba(15, 110, 134, 0.1);\n color: #0F6E86;\n border-radius: 0.5rem;\n font-weight: 500;\n}\n.status-badge {\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n border-radius: 0.5rem;\n font-weight: 500;\n cursor: default;\n}\n.status-badge.inactive {\n background-color: rgba(134, 134, 134, 0.1);\n color: #868686;\n}\n.status-badge.deleted {\n background-color: rgba(232, 90, 79, 0.1);\n color: #E85A4F;\n}\n.item-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n.btn-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.btn-icon:hover {\n background-color: rgba(15, 110, 134, 0.1);\n color: #0F6E86;\n}\n.btn-icon.btn-icon-danger:hover {\n background-color: rgba(232, 90, 79, 0.1);\n color: #E85A4F;\n}\n.btn-icon .material-symbols-rounded {\n font-size: 20px;\n}\n.delete-confirm {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.confirm-text {\n font-size: 0.875rem;\n color: #868686;\n}\n.dialog-backdrop {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 400;\n}\n.dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: calc(100% - 2rem);\n max-width: 480px;\n max-height: calc(100vh - 2rem);\n background-color: #FFFFFF;\n border-radius: 1rem;\n box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);\n z-index: 500;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid #F0F0F0;\n}\n.dialog-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #25130E;\n margin: 0;\n}\n.dialog-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 9999px;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.dialog-close:hover {\n background-color: #F6F1E9;\n color: #25130E;\n}\n.dialog-body {\n padding: 1.25rem;\n overflow-y: auto;\n}\n.dialog-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1rem 1.25rem;\n border-top: 1px solid #F0F0F0;\n background-color: #F6F1E9;\n}\n.form-section {\n margin-bottom: 1rem;\n}\n.form-section:last-child {\n margin-bottom: 0;\n}\n.form-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #25130E;\n margin-bottom: 0.5rem;\n}\n.translation-inputs {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n.translation-row {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.lang-label {\n width: 32px;\n font-size: 0.75rem;\n font-weight: 600;\n color: #868686;\n text-align: center;\n}\n.form-input {\n flex: 1;\n padding: 0.5rem 0.75rem;\n border: 1px solid #E0E0E0;\n border-radius: 0.5rem;\n font-size: 1rem;\n color: #25130E;\n transition: border-color 150ms ease;\n}\n.form-input:focus {\n outline: none;\n border-color: #0F6E86;\n}\n.form-input::placeholder {\n color: #868686;\n opacity: 0.6;\n}\n.type-options {\n display: flex;\n gap: 0.5rem;\n}\n.type-option {\n flex: 1;\n padding: 0.5rem 0.75rem;\n border: 1px solid #E0E0E0;\n background: transparent;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: #868686;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.type-option:hover {\n border-color: #0F6E86;\n color: #0F6E86;\n}\n.type-option.active {\n background-color: #0F6E86;\n border-color: #0F6E86;\n color: #FFFFFF;\n}\n.toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n}\n.toggle-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: #25130E;\n}\n.toggle {\n position: relative;\n width: 44px;\n height: 24px;\n background-color: #E0E0E0;\n border-radius: 12px;\n transition: background-color 150ms ease;\n}\n.toggle.active {\n background-color: #0F6E86;\n}\n.toggle.active .toggle-thumb {\n transform: translateX(20px);\n}\n.toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;
1364\n width: 20px;\n height: 20px;\n background-color: #FFFFFF;\n border-radius: 50%;\n transition: transform 150ms ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n.btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.btn .material-symbols-rounded {\n font-size: 18px;\n}\n.btn-primary {\n background-color: #0F6E86;\n color: #FFFFFF;\n}\n.btn-primary:hover:not(:disabled) {\n background-color: #0a5066;\n}\n.btn-outline {\n background: transparent;\n border: 1px solid #E0E0E0;\n color: #25130E;\n}\n.btn-outline:hover:not(:disabled) {\n border-color: #0F6E86;\n color: #0F6E86;\n}\n.btn-sm {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n}\n.btn-danger {\n background-color: #E85A4F;\n color: #FFFFFF;\n}\n.btn-danger:hover:not(:disabled) {\n background-color: #C62828;\n}\n.spinner-small {\n width: 16px;\n height: 16px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: #FFFFFF;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n}\n/*# sourceMappingURL=settings.component-3JI7VWGV.css.map */\n"] }] 1365 }], null, null); 1366})(); 1367(() => { 1368 (typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/app/features/dashboard/pages/settings/settings.component.ts", lineNumber: 32 }); 1369})(); 1370export { 1371 SettingsComponent 1372}; 1373//# sourceMappingURL=chunk-7DCNZT2O.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.