osl-base-extended 3.9.0 → 5.0.0

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.
@@ -20,10 +20,10 @@ import * as i6 from '@angular/material/tooltip';
20
20
  import { MatTooltipModule } from '@angular/material/tooltip';
21
21
  import * as i5 from '@angular/material/datepicker';
22
22
  import { MatDatepickerModule } from '@angular/material/datepicker';
23
- import { MatInputModule } from '@angular/material/input';
24
23
  import { MAT_DATE_FORMATS } from '@angular/material/core';
25
24
  import * as i4 from '@ngxmc/datetime-picker';
26
25
  import { NgxMatDatetimepicker, NgxMatDatepickerInput } from '@ngxmc/datetime-picker';
26
+ import { MatInputModule } from '@angular/material/input';
27
27
  import { debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, switchMap, tap } from 'rxjs/operators';
28
28
  import { MatMenuModule } from '@angular/material/menu';
29
29
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -2246,43 +2246,481 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2246
2246
  type: Output
2247
2247
  }] } });
2248
2248
 
2249
- class OslCheckbox {
2250
- checkboxEl;
2251
- label = '';
2252
- disabled = false;
2253
- required = false;
2254
- model = false;
2255
- indeterminate = false;
2256
- skeletonLoading = false;
2257
- skeletonTheme = 'light';
2258
- modelChange = new EventEmitter();
2259
- changeEv = new EventEmitter();
2260
- touched = false;
2261
- get isInvalid() {
2262
- return this.touched && this.required && !this.model;
2263
- }
2264
- ngOnChanges(changes) {
2265
- if (changes['indeterminate'] && this.checkboxEl) {
2266
- this.checkboxEl.nativeElement.indeterminate = this.indeterminate;
2267
- }
2268
- }
2269
- ngAfterViewInit() {
2270
- if (this.checkboxEl) {
2271
- this.checkboxEl.nativeElement.indeterminate = this.indeterminate;
2249
+ // ─── Date Utilities ───────────────────────────────────────────────────────────
2250
+ const MONTH_NAMES_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
2251
+ const MONTH_NAMES_FULL = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
2252
+ const DAY_NAMES_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
2253
+ const DAY_NAMES_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
2254
+ function pad(n) {
2255
+ return String(n).padStart(2, '0');
2256
+ }
2257
+ /** Returns the current date and time. */
2258
+ function now() {
2259
+ return new Date();
2260
+ }
2261
+ /** Returns today's date with time set to midnight. */
2262
+ function today() {
2263
+ return startOfDay(new Date());
2264
+ }
2265
+ /** Returns true if the value is a valid Date object. */
2266
+ function isValidDate$1(value) {
2267
+ return value instanceof Date && !isNaN(value.getTime());
2268
+ }
2269
+ /**
2270
+ * Formats a Date using a pattern string.
2271
+ * Tokens: YYYY, YY, MM, M, DD, D, HH, H, mm, m, ss, s,
2272
+ * MMM (short month), MMMM (full month),
2273
+ * ddd (short day), dddd (full day).
2274
+ */
2275
+ function formatDate(date, pattern) {
2276
+ const d = new Date(date);
2277
+ if (!isValidDate$1(d))
2278
+ return '';
2279
+ const year = d.getFullYear();
2280
+ const month = d.getMonth();
2281
+ const day = d.getDate();
2282
+ const hours = d.getHours();
2283
+ const mins = d.getMinutes();
2284
+ const secs = d.getSeconds();
2285
+ const dayOfWeek = d.getDay();
2286
+ return pattern
2287
+ .replace('YYYY', String(year))
2288
+ .replace('YY', String(year).slice(-2))
2289
+ .replace('MMMM', MONTH_NAMES_FULL[month])
2290
+ .replace('MMM', MONTH_NAMES_SHORT[month])
2291
+ .replace('MM', pad(month + 1))
2292
+ .replace('M', String(month + 1))
2293
+ .replace('dddd', DAY_NAMES_FULL[dayOfWeek])
2294
+ .replace('ddd', DAY_NAMES_SHORT[dayOfWeek])
2295
+ .replace('DD', pad(day))
2296
+ .replace('D', String(day))
2297
+ .replace('HH', pad(hours))
2298
+ .replace('H', String(hours))
2299
+ .replace('mm', pad(mins))
2300
+ .replace('m', String(mins))
2301
+ .replace('ss', pad(secs))
2302
+ .replace('s', String(secs));
2303
+ }
2304
+ /** Returns date as `YYYY-MM-DD`. */
2305
+ function toDateOnly(date) {
2306
+ return formatDate(date, 'YYYY-MM-DD');
2307
+ }
2308
+ /** Returns the ISO 8601 string for a date. */
2309
+ function toISOString(date) {
2310
+ return date.toISOString();
2311
+ }
2312
+ /** Returns a new date with `days` added. */
2313
+ function addDays(date, days) {
2314
+ const result = new Date(date);
2315
+ result.setDate(result.getDate() + days);
2316
+ return result;
2317
+ }
2318
+ /** Returns a new date with `months` added. */
2319
+ function addMonths(date, months) {
2320
+ const result = new Date(date);
2321
+ result.setMonth(result.getMonth() + months);
2322
+ return result;
2323
+ }
2324
+ /** Returns a new date with `years` added. */
2325
+ function addYears(date, years) {
2326
+ const result = new Date(date);
2327
+ result.setFullYear(result.getFullYear() + years);
2328
+ return result;
2329
+ }
2330
+ /** Returns a new date with `hours` added. */
2331
+ function addHours(date, hours) {
2332
+ return new Date(date.getTime() + hours * 3_600_000);
2333
+ }
2334
+ /** Returns a new date with `minutes` added. */
2335
+ function addMinutes(date, minutes) {
2336
+ return new Date(date.getTime() + minutes * 60_000);
2337
+ }
2338
+ /** Returns a new date with `days` subtracted. */
2339
+ function subtractDays(date, days) {
2340
+ return addDays(date, -days);
2341
+ }
2342
+ /** Returns a new date with `months` subtracted. */
2343
+ function subtractMonths(date, months) {
2344
+ return addMonths(date, -months);
2345
+ }
2346
+ /** Returns a new date with `years` subtracted. */
2347
+ function subtractYears(date, years) {
2348
+ return addYears(date, -years);
2349
+ }
2350
+ /** Returns the absolute difference in whole days between two dates. */
2351
+ function diffInDays(date1, date2) {
2352
+ return Math.abs(Math.floor((date1.getTime() - date2.getTime()) / 86_400_000));
2353
+ }
2354
+ /** Returns the absolute difference in whole months between two dates. */
2355
+ function diffInMonths(date1, date2) {
2356
+ return Math.abs((date1.getFullYear() - date2.getFullYear()) * 12 +
2357
+ (date1.getMonth() - date2.getMonth()));
2358
+ }
2359
+ /** Returns the absolute difference in whole years between two dates. */
2360
+ function diffInYears(date1, date2) {
2361
+ return Math.abs(date1.getFullYear() - date2.getFullYear());
2362
+ }
2363
+ /** Returns the difference in minutes between two dates (date1 - date2). */
2364
+ function diffInMinutes(date1, date2) {
2365
+ return Math.floor((date1.getTime() - date2.getTime()) / 60_000);
2366
+ }
2367
+ /** Returns true if date1 is strictly before date2. */
2368
+ function isBefore(date1, date2) {
2369
+ return date1.getTime() < date2.getTime();
2370
+ }
2371
+ /** Returns true if date1 is strictly after date2. */
2372
+ function isAfter(date1, date2) {
2373
+ return date1.getTime() > date2.getTime();
2374
+ }
2375
+ /** Returns true if both dates fall on the same calendar day. */
2376
+ function isSameDay(date1, date2) {
2377
+ return (date1.getFullYear() === date2.getFullYear() &&
2378
+ date1.getMonth() === date2.getMonth() &&
2379
+ date1.getDate() === date2.getDate());
2380
+ }
2381
+ /** Returns true if the date falls on a Saturday or Sunday. */
2382
+ function isWeekend(date) {
2383
+ return date.getDay() === 0 || date.getDay() === 6;
2384
+ }
2385
+ /** Returns true if the date is today. */
2386
+ function isToday(date) {
2387
+ return isSameDay(date, new Date());
2388
+ }
2389
+ /** Returns true if the date falls in the past (before now). */
2390
+ function isPast(date) {
2391
+ return date.getTime() < Date.now();
2392
+ }
2393
+ /** Returns true if the date falls in the future (after now). */
2394
+ function isFuture(date) {
2395
+ return date.getTime() > Date.now();
2396
+ }
2397
+ /** Returns the date with time set to 00:00:00.000. */
2398
+ function startOfDay(date) {
2399
+ const result = new Date(date);
2400
+ result.setHours(0, 0, 0, 0);
2401
+ return result;
2402
+ }
2403
+ /** Returns the date with time set to 23:59:59.999. */
2404
+ function endOfDay(date) {
2405
+ const result = new Date(date);
2406
+ result.setHours(23, 59, 59, 999);
2407
+ return result;
2408
+ }
2409
+ /** Returns the first day of the month (time 00:00:00.000). */
2410
+ function startOfMonth(date) {
2411
+ return new Date(date.getFullYear(), date.getMonth(), 1);
2412
+ }
2413
+ /** Returns the last day of the month (time 23:59:59.999). */
2414
+ function endOfMonth(date) {
2415
+ const result = new Date(date.getFullYear(), date.getMonth() + 1, 0);
2416
+ result.setHours(23, 59, 59, 999);
2417
+ return result;
2418
+ }
2419
+ /** Returns the first day of the year (Jan 1, 00:00:00.000). */
2420
+ function startOfYear(date) {
2421
+ return new Date(date.getFullYear(), 0, 1);
2422
+ }
2423
+ /** Returns the last day of the year (Dec 31, 23:59:59.999). */
2424
+ function endOfYear(date) {
2425
+ const result = new Date(date.getFullYear(), 11, 31);
2426
+ result.setHours(23, 59, 59, 999);
2427
+ return result;
2428
+ }
2429
+ /** Calculates the age in years from a birth date. */
2430
+ function getAge(birthDate) {
2431
+ const n = new Date();
2432
+ let age = n.getFullYear() - birthDate.getFullYear();
2433
+ const monthDiff = n.getMonth() - birthDate.getMonth();
2434
+ if (monthDiff < 0 || (monthDiff === 0 && n.getDate() < birthDate.getDate()))
2435
+ age--;
2436
+ return age;
2437
+ }
2438
+ /** Returns the number of days in a given month (0-based month). */
2439
+ function daysInMonth(year, month) {
2440
+ return new Date(year, month + 1, 0).getDate();
2441
+ }
2442
+ /** Returns true if the given year is a leap year. */
2443
+ function isLeapYear(year) {
2444
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
2445
+ }
2446
+ /**
2447
+ * Returns a human-friendly relative time string.
2448
+ * @example timeAgo(new Date(Date.now() - 3600_000)) → '1 hour ago'
2449
+ */
2450
+ function timeAgo(date) {
2451
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
2452
+ const abs = Math.abs(seconds);
2453
+ const future = seconds < 0;
2454
+ const intervals = [
2455
+ [31_536_000, 'year'],
2456
+ [2_592_000, 'month'],
2457
+ [604_800, 'week'],
2458
+ [86_400, 'day'],
2459
+ [3_600, 'hour'],
2460
+ [60, 'minute'],
2461
+ [1, 'second'],
2462
+ ];
2463
+ for (const [secs, label] of intervals) {
2464
+ const count = Math.floor(abs / secs);
2465
+ if (count >= 1) {
2466
+ const unit = count === 1 ? label : `${label}s`;
2467
+ return future ? `in ${count} ${unit}` : `${count} ${unit} ago`;
2272
2468
  }
2273
2469
  }
2274
- onModelChange(event) {
2275
- this.touched = true;
2276
- this.model = event;
2277
- this.modelChange.emit(this.model);
2278
- this.changeEv.emit(this.model);
2279
- }
2280
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
2281
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: OslCheckbox, isStandalone: false, selector: "osl-checkbox", inputs: { label: "label", disabled: "disabled", required: "required", model: "model", indeterminate: "indeterminate", skeletonLoading: "skeletonLoading", skeletonTheme: "skeletonTheme" }, outputs: { modelChange: "modelChange", changeEv: "changeEv" }, viewQueries: [{ propertyName: "checkboxEl", first: true, predicate: ["checkboxEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex flex-column\">\r\n\r\n <label class=\"checkbox-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.checkbox-disabled]=\"disabled\" [class.checkbox-invalid]=\"isInvalid\">\r\n <input\r\n #checkboxEl\r\n type=\"checkbox\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span class=\"checkbox-label\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <span class=\"label-text\" [title]=\"label\">{{label}}</span><span class=\"txt-clr-red label-required\">{{required?'*':''}}</span>\r\n </span>\r\n </label>\r\n @if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n", styles: [".checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:var(--osl-label-font-size);width:fit-content;max-width:100%}.checkbox-wrapper input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:#333;flex-shrink:0}.checkbox-wrapper .checkbox-label{-webkit-user-select:none;user-select:none;display:flex;align-items:center;overflow:hidden;min-width:0}.checkbox-wrapper.checkbox-disabled{opacity:.6;cursor:not-allowed}.checkbox-wrapper.checkbox-disabled input[type=checkbox]{cursor:not-allowed}.checkbox-wrapper.checkbox-invalid{color:var(--osl-error-color)}.label-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.label-required{flex-shrink:0}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.txt-clr-red{color:var(--osl-error-color)}\n"], dependencies: [{ kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: OslSkeletonDirective, selector: "[oslSkeleton]", inputs: ["oslSkeleton", "oslSkeletonType", "oslSkeletonAnimation", "oslSkeletonTheme", "oslSkeletonColor", "oslSkeletonHighlight", "oslSkeletonRadius", "oslSkeletonRows", "oslSkeletonRowGap", "oslSkeletonZIndex", "oslSkeletonDelay", "oslSkeletonDuration", "oslSkeletonMinHeight", "oslSkeletonForceReread", "oslSkeletonCircleSize", "oslSkeletonListItems", "oslSkeletonTableRows", "oslSkeletonTableCols", "oslSkeletonCardLines", "oslSkeletonBgColor"] }] });
2470
+ return 'just now';
2282
2471
  }
2283
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslCheckbox, decorators: [{
2284
- type: Component,
2285
- args: [{ selector: 'osl-checkbox', standalone: false, template: "<div class=\"d-flex flex-column\">\r\n\r\n <label class=\"checkbox-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.checkbox-disabled]=\"disabled\" [class.checkbox-invalid]=\"isInvalid\">\r\n <input\r\n #checkboxEl\r\n type=\"checkbox\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span class=\"checkbox-label\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <span class=\"label-text\" [title]=\"label\">{{label}}</span><span class=\"txt-clr-red label-required\">{{required?'*':''}}</span>\r\n </span>\r\n </label>\r\n @if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n", styles: [".checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:var(--osl-label-font-size);width:fit-content;max-width:100%}.checkbox-wrapper input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:#333;flex-shrink:0}.checkbox-wrapper .checkbox-label{-webkit-user-select:none;user-select:none;display:flex;align-items:center;overflow:hidden;min-width:0}.checkbox-wrapper.checkbox-disabled{opacity:.6;cursor:not-allowed}.checkbox-wrapper.checkbox-disabled input[type=checkbox]{cursor:not-allowed}.checkbox-wrapper.checkbox-invalid{color:var(--osl-error-color)}.label-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.label-required{flex-shrink:0}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.txt-clr-red{color:var(--osl-error-color)}\n"] }]
2472
+ /** Returns the ISO week number (1–53) for the given date. */
2473
+ function getWeekNumber(date) {
2474
+ const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
2475
+ d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
2476
+ const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
2477
+ return Math.ceil((((d.getTime() - yearStart.getTime()) / 86_400_000) + 1) / 7);
2478
+ }
2479
+ /** Returns the next weekday (Mon–Fri) after the given date. */
2480
+ function nextWorkday(date) {
2481
+ const result = addDays(date, 1);
2482
+ while (isWeekend(result)) {
2483
+ result.setDate(result.getDate() + 1);
2484
+ }
2485
+ return result;
2486
+ }
2487
+ /** Returns true if a date falls within the range [start, end] (inclusive). */
2488
+ function inRange$2(date, start, end) {
2489
+ return date >= start && date <= end;
2490
+ }
2491
+ /** Parses a `YYYY-MM-DD` string and returns a local-midnight Date or null. */
2492
+ function parseDate(dateStr) {
2493
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateStr);
2494
+ if (!match)
2495
+ return null;
2496
+ const [, y, mo, d] = match.map(Number);
2497
+ const result = new Date(y, mo - 1, d);
2498
+ return isValidDate$1(result) ? result : null;
2499
+ }
2500
+ function localeDate(dateStr) {
2501
+ const date = new Date(dateStr);
2502
+ date.toLocaleString('en-US');
2503
+ }
2504
+
2505
+ var date_util = /*#__PURE__*/Object.freeze({
2506
+ __proto__: null,
2507
+ addDays: addDays,
2508
+ addHours: addHours,
2509
+ addMinutes: addMinutes,
2510
+ addMonths: addMonths,
2511
+ addYears: addYears,
2512
+ daysInMonth: daysInMonth,
2513
+ diffInDays: diffInDays,
2514
+ diffInMinutes: diffInMinutes,
2515
+ diffInMonths: diffInMonths,
2516
+ diffInYears: diffInYears,
2517
+ endOfDay: endOfDay,
2518
+ endOfMonth: endOfMonth,
2519
+ endOfYear: endOfYear,
2520
+ formatDate: formatDate,
2521
+ getAge: getAge,
2522
+ getWeekNumber: getWeekNumber,
2523
+ inRange: inRange$2,
2524
+ isAfter: isAfter,
2525
+ isBefore: isBefore,
2526
+ isFuture: isFuture,
2527
+ isLeapYear: isLeapYear,
2528
+ isPast: isPast,
2529
+ isSameDay: isSameDay,
2530
+ isToday: isToday,
2531
+ isValidDate: isValidDate$1,
2532
+ isWeekend: isWeekend,
2533
+ localeDate: localeDate,
2534
+ nextWorkday: nextWorkday,
2535
+ now: now,
2536
+ parseDate: parseDate,
2537
+ startOfDay: startOfDay,
2538
+ startOfMonth: startOfMonth,
2539
+ startOfYear: startOfYear,
2540
+ subtractDays: subtractDays,
2541
+ subtractMonths: subtractMonths,
2542
+ subtractYears: subtractYears,
2543
+ timeAgo: timeAgo,
2544
+ toDateOnly: toDateOnly,
2545
+ toISOString: toISOString,
2546
+ today: today
2547
+ });
2548
+
2549
+ class OslDatetimepicker {
2550
+ dtNativeInput;
2551
+ label = '';
2552
+ required = false;
2553
+ disabled = false;
2554
+ dateModel = null;
2555
+ set model(val) {
2556
+ this.dateModel = this._parseToDate(val);
2557
+ this._scheduleDisplayUpdate();
2558
+ }
2559
+ placeholder = '';
2560
+ minDate = null;
2561
+ maxDate = null;
2562
+ set minDatetime(val) {
2563
+ this.minDate = this._parseToDate(val);
2564
+ }
2565
+ set maxDatetime(val) {
2566
+ this.maxDate = this._parseToDate(val);
2567
+ }
2568
+ /** Emitted string format. Tokens: YYYY MM DD HH mm ss ddd dddd etc. Default: 'YYYY-MM-DDTHH:mm' */
2569
+ format = 'YYYY-MM-DDTHH:mm';
2570
+ /** Display format shown inside the input field. Default: 'ddd DD/MM/YYYY HH:mm' → Sun 18/01/2026 19:18 */
2571
+ set displayFormatInput(val) {
2572
+ this._displayFormat = val || 'ddd DD/MM/YYYY HH:mm';
2573
+ this._scheduleDisplayUpdate();
2574
+ }
2575
+ _displayFormat = 'ddd DD/MM/YYYY HH:mm';
2576
+ showSeconds = false;
2577
+ enableMeridian = false;
2578
+ skeletonLoading = false;
2579
+ skeletonTheme = 'light';
2580
+ modelChange = new EventEmitter();
2581
+ changeEv = new EventEmitter();
2582
+ ngAfterViewInit() {
2583
+ this._updateDisplay();
2584
+ }
2585
+ onDateChange(date) {
2586
+ this.dateModel = date;
2587
+ this._updateDisplay();
2588
+ const str = date ? formatDate(date, this.format) : '';
2589
+ this.modelChange.emit(str);
2590
+ this.changeEv.emit(str);
2591
+ }
2592
+ _updateDisplay() {
2593
+ if (!this.dtNativeInput)
2594
+ return;
2595
+ this.dtNativeInput.nativeElement.value =
2596
+ this.dateModel ? formatDate(this.dateModel, this._displayFormat) : '';
2597
+ }
2598
+ _scheduleDisplayUpdate() {
2599
+ setTimeout(() => this._updateDisplay());
2600
+ }
2601
+ _parseToDate(val) {
2602
+ if (!val)
2603
+ return null;
2604
+ const d = new Date(val);
2605
+ return isNaN(d.getTime()) ? null : d;
2606
+ }
2607
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslDatetimepicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
2608
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: OslDatetimepicker, isStandalone: false, selector: "osl-datetimepicker", inputs: { label: "label", required: "required", disabled: "disabled", model: "model", placeholder: "placeholder", minDatetime: "minDatetime", maxDatetime: "maxDatetime", format: "format", displayFormatInput: ["displayFormat", "displayFormatInput"], showSeconds: "showSeconds", enableMeridian: "enableMeridian", skeletonLoading: "skeletonLoading", skeletonTheme: "skeletonTheme" }, outputs: { modelChange: "modelChange", changeEv: "changeEv" }, providers: [
2609
+ {
2610
+ provide: MAT_DATE_FORMATS,
2611
+ useValue: {
2612
+ parse: {
2613
+ dateInput: 'DD-MMM-YYYY hh:mm a',
2614
+ },
2615
+ display: {
2616
+ dateInput: 'DD-MMM-YYYY hh:mm a',
2617
+ monthYearLabel: 'MMM YYYY', dateA11yLabel: 'LL', monthYearA11yLabel: 'MMMM YYYY',
2618
+ }
2619
+ }
2620
+ }
2621
+ ], viewQueries: [{ propertyName: "dtNativeInput", first: true, predicate: ["dtNativeInput"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex flex-column\">\n @if (label) {\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <label class=\"label\" [class.txt-clr-red]=\"dtField.touched && dtField.invalid\">\n {{label}} <span class=\"txt-clr-red\">{{required ? '*' : ''}}</span>\n </label>\n </div>\n }\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <input\n class=\"dt-input\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngModel]=\"dateModel\"\n (ngModelChange)=\"onDateChange($event)\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [min]=\"minDate\"\n [max]=\"maxDate\"\n [placeholder]=\"placeholder\"\n [class.error]=\"dtField.touched && dtField.invalid\"\n #dtField=\"ngModel\"\n readonly\n />\n <button\n type=\"button\"\n class=\"dt-icon-btn\"\n (click)=\"picker.open()\"\n [disabled]=\"disabled\"\n tabindex=\"-1\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"14\" height=\"14\" rx=\"2\"/>\n <line x1=\"3\" y1=\"8\" x2=\"17\" y2=\"8\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"6\"/>\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"6\"/>\n </svg>\n </button>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"showSeconds\"\n [enableMeridian]=\"enableMeridian\">\n </ngx-mat-datetime-picker>\n </div>\n @if (dtField.touched && dtField.invalid && required) {\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\n }\n</div>\n", styles: [".label{font-size:var(--osl-label-font-size);margin-bottom:5px}.txt-clr-red{color:var(--osl-error-color)}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.input-wrapper{position:relative;display:flex;align-items:center}.dt-icon-btn{position:absolute;right:7px;top:50%;transform:translateY(-50%);width:22px;height:22px;padding:0;border:none;background:transparent;cursor:pointer;color:#9ca3af;display:flex;align-items:center;justify-content:center;transition:color .15s;border-radius:4px}.dt-icon-btn svg{width:16px;height:16px;display:block}.dt-icon-btn:hover:not(:disabled){color:var(--osl-focus-border-color)}.dt-icon-btn:disabled{opacity:.35;cursor:not-allowed}.dt-input{height:var(--osl-control-height);width:100%;border-radius:var(--osl-border-radius);outline:none;border:1px solid var(--osl-border-color);padding:0 38px 0 10px;font-size:var(--osl-text-font-size);font-family:inherit;color:#333;background-color:#fff;transition:border-color .2s,box-shadow .2s;letter-spacing:.01em;box-sizing:border-box}.dt-input::placeholder{color:#bbb}.dt-input:hover:not(:disabled){border-color:var(--osl-focus-border-color)}.dt-input:focus{border-color:var(--osl-focus-border-color);box-shadow:0 0 0 3px var(--osl-focus-shadow, rgba(99, 102, 241, .14))}.dt-input:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.7}.dt-input.error{border-color:var(--osl-error-color)}.dt-input.error:focus{box-shadow:0 0 0 3px var(--osl-error-shadow, rgba(220, 38, 38, .14))}\n"], dependencies: [{ kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: OslSkeletonDirective, selector: "[oslSkeleton]", inputs: ["oslSkeleton", "oslSkeletonType", "oslSkeletonAnimation", "oslSkeletonTheme", "oslSkeletonColor", "oslSkeletonHighlight", "oslSkeletonRadius", "oslSkeletonRows", "oslSkeletonRowGap", "oslSkeletonZIndex", "oslSkeletonDelay", "oslSkeletonDuration", "oslSkeletonMinHeight", "oslSkeletonForceReread", "oslSkeletonCircleSize", "oslSkeletonListItems", "oslSkeletonTableRows", "oslSkeletonTableCols", "oslSkeletonCardLines", "oslSkeletonBgColor"] }, { kind: "component", type: i4.NgxMatDatetimepicker, selector: "ngx-mat-datetime-picker", exportAs: ["ngxMatDatetimePicker"] }, { kind: "directive", type: i4.NgxMatDatepickerInput, selector: "input[ngxMatDatetimePicker]", inputs: ["ngxMatDatetimePicker", "min", "max", "matDatepickerFilter"], exportAs: ["ngxMatDatepickerInput"] }] });
2622
+ }
2623
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslDatetimepicker, decorators: [{
2624
+ type: Component,
2625
+ args: [{ selector: 'osl-datetimepicker', standalone: false, providers: [
2626
+ {
2627
+ provide: MAT_DATE_FORMATS,
2628
+ useValue: {
2629
+ parse: {
2630
+ dateInput: 'DD-MMM-YYYY hh:mm a',
2631
+ },
2632
+ display: {
2633
+ dateInput: 'DD-MMM-YYYY hh:mm a',
2634
+ monthYearLabel: 'MMM YYYY', dateA11yLabel: 'LL', monthYearA11yLabel: 'MMMM YYYY',
2635
+ }
2636
+ }
2637
+ }
2638
+ ], template: "<div class=\"d-flex flex-column\">\n @if (label) {\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <label class=\"label\" [class.txt-clr-red]=\"dtField.touched && dtField.invalid\">\n {{label}} <span class=\"txt-clr-red\">{{required ? '*' : ''}}</span>\n </label>\n </div>\n }\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <input\n class=\"dt-input\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngModel]=\"dateModel\"\n (ngModelChange)=\"onDateChange($event)\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [min]=\"minDate\"\n [max]=\"maxDate\"\n [placeholder]=\"placeholder\"\n [class.error]=\"dtField.touched && dtField.invalid\"\n #dtField=\"ngModel\"\n readonly\n />\n <button\n type=\"button\"\n class=\"dt-icon-btn\"\n (click)=\"picker.open()\"\n [disabled]=\"disabled\"\n tabindex=\"-1\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"14\" height=\"14\" rx=\"2\"/>\n <line x1=\"3\" y1=\"8\" x2=\"17\" y2=\"8\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"6\"/>\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"6\"/>\n </svg>\n </button>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"showSeconds\"\n [enableMeridian]=\"enableMeridian\">\n </ngx-mat-datetime-picker>\n </div>\n @if (dtField.touched && dtField.invalid && required) {\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\n }\n</div>\n", styles: [".label{font-size:var(--osl-label-font-size);margin-bottom:5px}.txt-clr-red{color:var(--osl-error-color)}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.input-wrapper{position:relative;display:flex;align-items:center}.dt-icon-btn{position:absolute;right:7px;top:50%;transform:translateY(-50%);width:22px;height:22px;padding:0;border:none;background:transparent;cursor:pointer;color:#9ca3af;display:flex;align-items:center;justify-content:center;transition:color .15s;border-radius:4px}.dt-icon-btn svg{width:16px;height:16px;display:block}.dt-icon-btn:hover:not(:disabled){color:var(--osl-focus-border-color)}.dt-icon-btn:disabled{opacity:.35;cursor:not-allowed}.dt-input{height:var(--osl-control-height);width:100%;border-radius:var(--osl-border-radius);outline:none;border:1px solid var(--osl-border-color);padding:0 38px 0 10px;font-size:var(--osl-text-font-size);font-family:inherit;color:#333;background-color:#fff;transition:border-color .2s,box-shadow .2s;letter-spacing:.01em;box-sizing:border-box}.dt-input::placeholder{color:#bbb}.dt-input:hover:not(:disabled){border-color:var(--osl-focus-border-color)}.dt-input:focus{border-color:var(--osl-focus-border-color);box-shadow:0 0 0 3px var(--osl-focus-shadow, rgba(99, 102, 241, .14))}.dt-input:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.7}.dt-input.error{border-color:var(--osl-error-color)}.dt-input.error:focus{box-shadow:0 0 0 3px var(--osl-error-shadow, rgba(220, 38, 38, .14))}\n"] }]
2639
+ }], propDecorators: { dtNativeInput: [{
2640
+ type: ViewChild,
2641
+ args: ['dtNativeInput']
2642
+ }], label: [{
2643
+ type: Input,
2644
+ args: ['label']
2645
+ }], required: [{
2646
+ type: Input,
2647
+ args: ['required']
2648
+ }], disabled: [{
2649
+ type: Input,
2650
+ args: ['disabled']
2651
+ }], model: [{
2652
+ type: Input,
2653
+ args: ['model']
2654
+ }], placeholder: [{
2655
+ type: Input,
2656
+ args: ['placeholder']
2657
+ }], minDatetime: [{
2658
+ type: Input,
2659
+ args: ['minDatetime']
2660
+ }], maxDatetime: [{
2661
+ type: Input,
2662
+ args: ['maxDatetime']
2663
+ }], format: [{
2664
+ type: Input,
2665
+ args: ['format']
2666
+ }], displayFormatInput: [{
2667
+ type: Input,
2668
+ args: ['displayFormat']
2669
+ }], showSeconds: [{
2670
+ type: Input,
2671
+ args: ['showSeconds']
2672
+ }], enableMeridian: [{
2673
+ type: Input,
2674
+ args: ['enableMeridian']
2675
+ }], skeletonLoading: [{
2676
+ type: Input,
2677
+ args: ['skeletonLoading']
2678
+ }], skeletonTheme: [{
2679
+ type: Input,
2680
+ args: ['skeletonTheme']
2681
+ }], modelChange: [{
2682
+ type: Output
2683
+ }], changeEv: [{
2684
+ type: Output
2685
+ }] } });
2686
+
2687
+ class OslCheckbox {
2688
+ checkboxEl;
2689
+ label = '';
2690
+ disabled = false;
2691
+ required = false;
2692
+ model = false;
2693
+ indeterminate = false;
2694
+ skeletonLoading = false;
2695
+ skeletonTheme = 'light';
2696
+ modelChange = new EventEmitter();
2697
+ changeEv = new EventEmitter();
2698
+ touched = false;
2699
+ get isInvalid() {
2700
+ return this.touched && this.required && !this.model;
2701
+ }
2702
+ ngOnChanges(changes) {
2703
+ if (changes['indeterminate'] && this.checkboxEl) {
2704
+ this.checkboxEl.nativeElement.indeterminate = this.indeterminate;
2705
+ }
2706
+ }
2707
+ ngAfterViewInit() {
2708
+ if (this.checkboxEl) {
2709
+ this.checkboxEl.nativeElement.indeterminate = this.indeterminate;
2710
+ }
2711
+ }
2712
+ onModelChange(event) {
2713
+ this.touched = true;
2714
+ this.model = event;
2715
+ this.modelChange.emit(this.model);
2716
+ this.changeEv.emit(this.model);
2717
+ }
2718
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
2719
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: OslCheckbox, isStandalone: false, selector: "osl-checkbox", inputs: { label: "label", disabled: "disabled", required: "required", model: "model", indeterminate: "indeterminate", skeletonLoading: "skeletonLoading", skeletonTheme: "skeletonTheme" }, outputs: { modelChange: "modelChange", changeEv: "changeEv" }, viewQueries: [{ propertyName: "checkboxEl", first: true, predicate: ["checkboxEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex flex-column\">\r\n\r\n <label class=\"checkbox-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.checkbox-disabled]=\"disabled\" [class.checkbox-invalid]=\"isInvalid\">\r\n <input\r\n #checkboxEl\r\n type=\"checkbox\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span class=\"checkbox-label\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <span class=\"label-text\" [title]=\"label\">{{label}}</span><span class=\"txt-clr-red label-required\">{{required?'*':''}}</span>\r\n </span>\r\n </label>\r\n @if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n", styles: [".checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:var(--osl-label-font-size);width:fit-content;max-width:100%}.checkbox-wrapper input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:#333;flex-shrink:0}.checkbox-wrapper .checkbox-label{-webkit-user-select:none;user-select:none;display:flex;align-items:center;overflow:hidden;min-width:0}.checkbox-wrapper.checkbox-disabled{opacity:.6;cursor:not-allowed}.checkbox-wrapper.checkbox-disabled input[type=checkbox]{cursor:not-allowed}.checkbox-wrapper.checkbox-invalid{color:var(--osl-error-color)}.label-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.label-required{flex-shrink:0}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.txt-clr-red{color:var(--osl-error-color)}\n"], dependencies: [{ kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: OslSkeletonDirective, selector: "[oslSkeleton]", inputs: ["oslSkeleton", "oslSkeletonType", "oslSkeletonAnimation", "oslSkeletonTheme", "oslSkeletonColor", "oslSkeletonHighlight", "oslSkeletonRadius", "oslSkeletonRows", "oslSkeletonRowGap", "oslSkeletonZIndex", "oslSkeletonDelay", "oslSkeletonDuration", "oslSkeletonMinHeight", "oslSkeletonForceReread", "oslSkeletonCircleSize", "oslSkeletonListItems", "oslSkeletonTableRows", "oslSkeletonTableCols", "oslSkeletonCardLines", "oslSkeletonBgColor"] }] });
2720
+ }
2721
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslCheckbox, decorators: [{
2722
+ type: Component,
2723
+ args: [{ selector: 'osl-checkbox', standalone: false, template: "<div class=\"d-flex flex-column\">\r\n\r\n <label class=\"checkbox-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.checkbox-disabled]=\"disabled\" [class.checkbox-invalid]=\"isInvalid\">\r\n <input\r\n #checkboxEl\r\n type=\"checkbox\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span class=\"checkbox-label\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <span class=\"label-text\" [title]=\"label\">{{label}}</span><span class=\"txt-clr-red label-required\">{{required?'*':''}}</span>\r\n </span>\r\n </label>\r\n @if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n", styles: [".checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:var(--osl-label-font-size);width:fit-content;max-width:100%}.checkbox-wrapper input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:#333;flex-shrink:0}.checkbox-wrapper .checkbox-label{-webkit-user-select:none;user-select:none;display:flex;align-items:center;overflow:hidden;min-width:0}.checkbox-wrapper.checkbox-disabled{opacity:.6;cursor:not-allowed}.checkbox-wrapper.checkbox-disabled input[type=checkbox]{cursor:not-allowed}.checkbox-wrapper.checkbox-invalid{color:var(--osl-error-color)}.label-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.label-required{flex-shrink:0}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.txt-clr-red{color:var(--osl-error-color)}\n"] }]
2286
2724
  }], propDecorators: { checkboxEl: [{
2287
2725
  type: ViewChild,
2288
2726
  args: ['checkboxEl']
@@ -2503,11 +2941,11 @@ class DynamicForm {
2503
2941
  return list.flatMap(e => e.rows?.length ? [e, ...this._flatElements(e.rows)] : [e]);
2504
2942
  }
2505
2943
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DynamicForm, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2506
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DynamicForm, isStandalone: false, selector: "osl-dynamic-form", inputs: { elements: "elements", model: "model", skeletonLoading: "skeletonLoading", skeletonTheme: "skeletonTheme" }, outputs: { modelChange: "modelChange" }, usesOnChanges: true, ngImport: i0, template: "@if(elements && elements.length > 0) {\n <div class=\"row align-items-center w-100\">\n @for(elem of elements; track elem) {\n @if(!(elem.hideIf ? elem.hideIf(model) : elem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: elem }\"></ng-container>\n }\n }\n </div>\n}\n\n<ng-template #formField let-elem>\n @if(elem.hideIf ? !elem.hideIf(model) : true) {\n @switch (elem.elementType) {\n\n @case (\"textbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-input\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [type]=\"elem.inputType || 'text'\"\n [placeholder]=\"elem.placeholder || ''\"\n [mask]=\"elem.mask || ''\"\n [min]=\"elem.min ?? ''\"\n [max]=\"elem.max ?? ''\"\n [minLength]=\"elem.minLength ?? null\"\n [maxLength]=\"elem.maxLength ?? null\"\n [prefixIcon]=\"elem.prefixIcon || ''\"\n [suffixIcon]=\"elem.suffixIcon || ''\"\n [onlyChars]=\"!!elem.onlyChars\"\n [decimalPortion]=\"elem.decimalPortion ?? null\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n [isCapitalize]=\"elem.isCapitalize\"\n ></osl-input>\n </div>\n }\n\n @case (\"textarea\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-textarea\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [rows]=\"elem.textareaRows || 3\"\n [placeholder]=\"elem.placeholder || ''\"\n [maxLength]=\"elem.maxLength ?? null\"\n [minLength]=\"elem.minLength ?? null\"\n [characterCounter]=\"!!elem.characterCounter\"\n [resize]=\"elem.resize || 'none'\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-textarea>\n </div>\n }\n\n @case (\"select\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-select\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.selectPlaceholder || 'Select...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n [clearable]=\"!!elem.clearable\"\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-select>\n </div>\n }\n\n @case (\"radio\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-radio\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [inline]=\"!!elem.inline\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-radio>\n </div>\n }\n\n @case (\"slide-toggle\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-slide-toggle\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [labelPosition]=\"elem.labelPosition || 'after'\"\n [trueLabel]=\"elem.trueLabel || ''\"\n [falseLabel]=\"elem.falseLabel || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-slide-toggle>\n </div>\n }\n\n @case (\"autocomplete\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-autocomplete\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.autocompletePlaceholder || 'Type to search...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n (changeEv)=\"onFieldChange(elem, $event)\"\n [(model)]=\"model[elem.key]\"\n [methodName]=\"elem.apiMethod\"\n [service]=\"elem.apiService\"\n [object]=\"model[elem.objectName]\"\n [searchType]=\"elem.searchType\"\n [configMethodName]=\"elem.apiConfigMethod\"\n [isLister]=\"elem.isListerAutocomplete\"\n [apiBody]=\"elem.apiBody\"\n ></osl-autocomplete>\n </div>\n }\n\n @case (\"file-uploader\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-file-upload\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [accept]=\"elem.accept || ''\"\n [multiple]=\"!!elem.multiple\"\n [maxSize]=\"elem.maxFileSize || 0\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-file-upload>\n </div>\n }\n\n @case (\"datepicker\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-datepicker\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [dateType]=\"elem.dateType || 'date'\"\n [placeholder]=\"elem.placeholder || ''\"\n [minDate]=\"elem.minDateIf ? elem.minDateIf(model) : elem.minDate || ''\"\n [maxDate]=\"elem.maxDateIf ? elem.maxDateIf(model) : elem.maxDate || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-datepicker>\n </div>\n }\n\n @case (\"checkbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-checkbox\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [indeterminate]=\"!!elem.indeterminate\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-checkbox>\n </div>\n }\n\n @case (\"button\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-button\n [label]=\"elem.label\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n variant=\"secondary\"\n (clickEv)=\"elem.change ? elem.change(model) : null\"\n ></osl-button>\n </div>\n }\n\n @case (\"fieldset\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <fieldset class=\"osl-fieldset\">\n @if(elem.label) {\n <legend class=\"osl-fieldset-legend\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <span class=\"osl-fieldset-legend__text\">{{ elem.label }}</span>\n </legend>\n }\n <div class=\"row w-100 osl-fieldset-body\">\n @for(innerElem of elem.rows; track innerElem) {\n @if(!(innerElem.hideIf ? innerElem.hideIf(model) : innerElem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: innerElem }\"></ng-container>\n }\n }\n </div>\n </fieldset>\n </div>\n }\n\n @case (\"templateRef\"){\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container>\n </div>\n }\n\n @case (\"spacer\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n </div>\n }\n\n }\n }\n</ng-template>\n", styles: [".osl-fieldset{border:1.5px solid var(--osl-border-color, #e5e7eb);border-radius:10px;padding:0 16px 16px;margin:0;background:linear-gradient(135deg,#f9fafb,#fff);box-shadow:0 1px 4px #0000000d;position:relative;transition:box-shadow .2s}.osl-fieldset:focus-within{box-shadow:0 0 0 3px #6366f114,0 2px 8px #0000000f;border-color:var(--osl-primary, #6366f1)}.osl-fieldset-legend{padding:0 6px;margin-left:8px;line-height:1;float:none;width:auto}.osl-fieldset-legend__text{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;background:#fff;padding:2px 10px;border:1.5px solid var(--osl-border-color, #e5e7eb);box-shadow:0 1px 3px #6366f11a}.osl-fieldset-body{margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: OslSkeletonDirective, selector: "[oslSkeleton]", inputs: ["oslSkeleton", "oslSkeletonType", "oslSkeletonAnimation", "oslSkeletonTheme", "oslSkeletonColor", "oslSkeletonHighlight", "oslSkeletonRadius", "oslSkeletonRows", "oslSkeletonRowGap", "oslSkeletonZIndex", "oslSkeletonDelay", "oslSkeletonDuration", "oslSkeletonMinHeight", "oslSkeletonForceReread", "oslSkeletonCircleSize", "oslSkeletonListItems", "oslSkeletonTableRows", "oslSkeletonTableCols", "oslSkeletonCardLines", "oslSkeletonBgColor"] }, { kind: "component", type: Oslinput, selector: "osl-input", inputs: ["label", "required", "disabled", "model", "type", "placeholder", "mask", "min", "max", "minLength", "maxLength", "prefixIcon", "suffixIcon", "skeletonLoading", "skeletonTheme", "onlyChars", "isCapitalize", "decimalPortion"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: Osltextarea, selector: "osl-textarea", inputs: ["label", "rows", "required", "disabled", "model", "placeholder", "maxLength", "minLength", "characterCounter", "resize", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslSelect, selector: "osl-select", inputs: ["label", "required", "disabled", "model", "datasource", "displayField", "valueField", "placeholder", "loading", "clearable", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslRadio, selector: "osl-radio", inputs: ["label", "required", "disabled", "model", "datasource", "displayField", "valueField", "inline", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslSlideToggle, selector: "osl-slide-toggle", inputs: ["label", "disabled", "model", "labelPosition", "trueLabel", "falseLabel", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslAutocomplete, selector: "osl-autocomplete", inputs: ["label", "required", "disabled", "model", "datasource", "displayField", "valueField", "placeholder", "loading", "searchType", "methodName", "configMethodName", "service", "object", "skeletonLoading", "skeletonTheme", "isLister", "apiBody"], outputs: ["datasourceChange", "modelChange", "changeEv"] }, { kind: "component", type: OslFileUpload, selector: "osl-file-upload", inputs: ["label", "required", "disabled", "model", "accept", "multiple", "maxSize", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslDatepicker, selector: "osl-datepicker", inputs: ["label", "required", "disabled", "model", "dateType", "placeholder", "minDate", "maxDate", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslCheckbox, selector: "osl-checkbox", inputs: ["label", "disabled", "required", "model", "indeterminate", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslButton, selector: "osl-button", inputs: ["label", "icon", "variant", "size", "disabled", "loading", "type", "fullWidth"], outputs: ["clickEv"] }] });
2944
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DynamicForm, isStandalone: false, selector: "osl-dynamic-form", inputs: { elements: "elements", model: "model", skeletonLoading: "skeletonLoading", skeletonTheme: "skeletonTheme" }, outputs: { modelChange: "modelChange" }, usesOnChanges: true, ngImport: i0, template: "@if(elements && elements.length > 0) {\n <div class=\"row align-items-center w-100\">\n @for(elem of elements; track elem) {\n @if(!(elem.hideIf ? elem.hideIf(model) : elem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: elem }\"></ng-container>\n }\n }\n </div>\n}\n\n<ng-template #formField let-elem>\n @if(elem.hideIf ? !elem.hideIf(model) : true) {\n @switch (elem.elementType) {\n\n @case (\"textbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-input\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [type]=\"elem.inputType || 'text'\"\n [placeholder]=\"elem.placeholder || ''\"\n [mask]=\"elem.mask || ''\"\n [min]=\"elem.min ?? ''\"\n [max]=\"elem.max ?? ''\"\n [minLength]=\"elem.minLength ?? null\"\n [maxLength]=\"elem.maxLength ?? null\"\n [prefixIcon]=\"elem.prefixIcon || ''\"\n [suffixIcon]=\"elem.suffixIcon || ''\"\n [onlyChars]=\"!!elem.onlyChars\"\n [decimalPortion]=\"elem.decimalPortion ?? null\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n [isCapitalize]=\"elem.isCapitalize\"\n ></osl-input>\n </div>\n }\n\n @case (\"textarea\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-textarea\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [rows]=\"elem.textareaRows || 3\"\n [placeholder]=\"elem.placeholder || ''\"\n [maxLength]=\"elem.maxLength ?? null\"\n [minLength]=\"elem.minLength ?? null\"\n [characterCounter]=\"!!elem.characterCounter\"\n [resize]=\"elem.resize || 'none'\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-textarea>\n </div>\n }\n\n @case (\"select\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-select\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.selectPlaceholder || 'Select...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n [clearable]=\"!!elem.clearable\"\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-select>\n </div>\n }\n\n @case (\"radio\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-radio\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [inline]=\"!!elem.inline\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-radio>\n </div>\n }\n\n @case (\"slide-toggle\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-slide-toggle\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [labelPosition]=\"elem.labelPosition || 'after'\"\n [trueLabel]=\"elem.trueLabel || ''\"\n [falseLabel]=\"elem.falseLabel || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-slide-toggle>\n </div>\n }\n\n @case (\"autocomplete\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-autocomplete\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.autocompletePlaceholder || 'Type to search...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n (changeEv)=\"onFieldChange(elem, $event)\"\n [(model)]=\"model[elem.key]\"\n [methodName]=\"elem.apiMethod\"\n [service]=\"elem.apiService\"\n [object]=\"model[elem.objectName]\"\n [searchType]=\"elem.searchType\"\n [configMethodName]=\"elem.apiConfigMethod\"\n [isLister]=\"elem.isListerAutocomplete\"\n [apiBody]=\"elem.apiBody\"\n ></osl-autocomplete>\n </div>\n }\n\n @case (\"file-uploader\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-file-upload\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [accept]=\"elem.accept || ''\"\n [multiple]=\"!!elem.multiple\"\n [maxSize]=\"elem.maxFileSize || 0\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-file-upload>\n </div>\n }\n\n @case (\"datepicker\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-datepicker\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [dateType]=\"elem.dateType || 'date'\"\n [placeholder]=\"elem.placeholder || ''\"\n [minDate]=\"elem.minDateIf ? elem.minDateIf(model) : elem.minDate || ''\"\n [maxDate]=\"elem.maxDateIf ? elem.maxDateIf(model) : elem.maxDate || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-datepicker>\n </div>\n }\n\n @case (\"datetimepicker\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-datetimepicker\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [placeholder]=\"elem.placeholder || ''\"\n [minDatetime]=\"elem.minDatetimeIf ? elem.minDatetimeIf(model) : elem.minDatetime || ''\"\n [maxDatetime]=\"elem.maxDatetimeIf ? elem.maxDatetimeIf(model) : elem.maxDatetime || ''\"\n [format]=\"elem.datetimepickerFormat || 'YYYY-MM-DDTHH:mm'\"\n [showSeconds]=\"!!elem.datetimepickerShowSeconds\"\n [enableMeridian]=\"!!elem.datetimepickerEnableMeridian\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-datetimepicker>\n </div>\n }\n\n @case (\"checkbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-checkbox\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [indeterminate]=\"!!elem.indeterminate\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-checkbox>\n </div>\n }\n\n @case (\"button\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-button\n [label]=\"elem.label\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n variant=\"secondary\"\n (clickEv)=\"elem.change ? elem.change(model) : null\"\n ></osl-button>\n </div>\n }\n\n @case (\"fieldset\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <fieldset class=\"osl-fieldset\">\n @if(elem.label) {\n <legend class=\"osl-fieldset-legend\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <span class=\"osl-fieldset-legend__text\">{{ elem.label }}</span>\n </legend>\n }\n <div class=\"row w-100 osl-fieldset-body\">\n @for(innerElem of elem.rows; track innerElem) {\n @if(!(innerElem.hideIf ? innerElem.hideIf(model) : innerElem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: innerElem }\"></ng-container>\n }\n }\n </div>\n </fieldset>\n </div>\n }\n\n @case (\"templateRef\"){\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container>\n </div>\n }\n\n @case (\"spacer\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n </div>\n }\n\n }\n }\n</ng-template>\n", styles: [".osl-fieldset{border:1.5px solid var(--osl-border-color, #e5e7eb);border-radius:10px;padding:0 16px 16px;margin:0;background:linear-gradient(135deg,#f9fafb,#fff);box-shadow:0 1px 4px #0000000d;position:relative;transition:box-shadow .2s}.osl-fieldset:focus-within{box-shadow:0 0 0 3px #6366f114,0 2px 8px #0000000f;border-color:var(--osl-primary, #6366f1)}.osl-fieldset-legend{padding:0 6px;margin-left:8px;line-height:1;float:none;width:auto}.osl-fieldset-legend__text{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;background:#fff;padding:2px 10px;border:1.5px solid var(--osl-border-color, #e5e7eb);box-shadow:0 1px 3px #6366f11a}.osl-fieldset-body{margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: OslSkeletonDirective, selector: "[oslSkeleton]", inputs: ["oslSkeleton", "oslSkeletonType", "oslSkeletonAnimation", "oslSkeletonTheme", "oslSkeletonColor", "oslSkeletonHighlight", "oslSkeletonRadius", "oslSkeletonRows", "oslSkeletonRowGap", "oslSkeletonZIndex", "oslSkeletonDelay", "oslSkeletonDuration", "oslSkeletonMinHeight", "oslSkeletonForceReread", "oslSkeletonCircleSize", "oslSkeletonListItems", "oslSkeletonTableRows", "oslSkeletonTableCols", "oslSkeletonCardLines", "oslSkeletonBgColor"] }, { kind: "component", type: Oslinput, selector: "osl-input", inputs: ["label", "required", "disabled", "model", "type", "placeholder", "mask", "min", "max", "minLength", "maxLength", "prefixIcon", "suffixIcon", "skeletonLoading", "skeletonTheme", "onlyChars", "isCapitalize", "decimalPortion"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: Osltextarea, selector: "osl-textarea", inputs: ["label", "rows", "required", "disabled", "model", "placeholder", "maxLength", "minLength", "characterCounter", "resize", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslSelect, selector: "osl-select", inputs: ["label", "required", "disabled", "model", "datasource", "displayField", "valueField", "placeholder", "loading", "clearable", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslRadio, selector: "osl-radio", inputs: ["label", "required", "disabled", "model", "datasource", "displayField", "valueField", "inline", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslSlideToggle, selector: "osl-slide-toggle", inputs: ["label", "disabled", "model", "labelPosition", "trueLabel", "falseLabel", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslAutocomplete, selector: "osl-autocomplete", inputs: ["label", "required", "disabled", "model", "datasource", "displayField", "valueField", "placeholder", "loading", "searchType", "methodName", "configMethodName", "service", "object", "skeletonLoading", "skeletonTheme", "isLister", "apiBody"], outputs: ["datasourceChange", "modelChange", "changeEv"] }, { kind: "component", type: OslFileUpload, selector: "osl-file-upload", inputs: ["label", "required", "disabled", "model", "accept", "multiple", "maxSize", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslDatepicker, selector: "osl-datepicker", inputs: ["label", "required", "disabled", "model", "dateType", "placeholder", "minDate", "maxDate", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslDatetimepicker, selector: "osl-datetimepicker", inputs: ["label", "required", "disabled", "model", "placeholder", "minDatetime", "maxDatetime", "format", "displayFormat", "showSeconds", "enableMeridian", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslCheckbox, selector: "osl-checkbox", inputs: ["label", "disabled", "required", "model", "indeterminate", "skeletonLoading", "skeletonTheme"], outputs: ["modelChange", "changeEv"] }, { kind: "component", type: OslButton, selector: "osl-button", inputs: ["label", "icon", "variant", "size", "disabled", "loading", "type", "fullWidth"], outputs: ["clickEv"] }] });
2507
2945
  }
2508
2946
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DynamicForm, decorators: [{
2509
2947
  type: Component,
2510
- args: [{ selector: 'osl-dynamic-form', standalone: false, template: "@if(elements && elements.length > 0) {\n <div class=\"row align-items-center w-100\">\n @for(elem of elements; track elem) {\n @if(!(elem.hideIf ? elem.hideIf(model) : elem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: elem }\"></ng-container>\n }\n }\n </div>\n}\n\n<ng-template #formField let-elem>\n @if(elem.hideIf ? !elem.hideIf(model) : true) {\n @switch (elem.elementType) {\n\n @case (\"textbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-input\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [type]=\"elem.inputType || 'text'\"\n [placeholder]=\"elem.placeholder || ''\"\n [mask]=\"elem.mask || ''\"\n [min]=\"elem.min ?? ''\"\n [max]=\"elem.max ?? ''\"\n [minLength]=\"elem.minLength ?? null\"\n [maxLength]=\"elem.maxLength ?? null\"\n [prefixIcon]=\"elem.prefixIcon || ''\"\n [suffixIcon]=\"elem.suffixIcon || ''\"\n [onlyChars]=\"!!elem.onlyChars\"\n [decimalPortion]=\"elem.decimalPortion ?? null\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n [isCapitalize]=\"elem.isCapitalize\"\n ></osl-input>\n </div>\n }\n\n @case (\"textarea\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-textarea\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [rows]=\"elem.textareaRows || 3\"\n [placeholder]=\"elem.placeholder || ''\"\n [maxLength]=\"elem.maxLength ?? null\"\n [minLength]=\"elem.minLength ?? null\"\n [characterCounter]=\"!!elem.characterCounter\"\n [resize]=\"elem.resize || 'none'\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-textarea>\n </div>\n }\n\n @case (\"select\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-select\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.selectPlaceholder || 'Select...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n [clearable]=\"!!elem.clearable\"\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-select>\n </div>\n }\n\n @case (\"radio\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-radio\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [inline]=\"!!elem.inline\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-radio>\n </div>\n }\n\n @case (\"slide-toggle\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-slide-toggle\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [labelPosition]=\"elem.labelPosition || 'after'\"\n [trueLabel]=\"elem.trueLabel || ''\"\n [falseLabel]=\"elem.falseLabel || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-slide-toggle>\n </div>\n }\n\n @case (\"autocomplete\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-autocomplete\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.autocompletePlaceholder || 'Type to search...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n (changeEv)=\"onFieldChange(elem, $event)\"\n [(model)]=\"model[elem.key]\"\n [methodName]=\"elem.apiMethod\"\n [service]=\"elem.apiService\"\n [object]=\"model[elem.objectName]\"\n [searchType]=\"elem.searchType\"\n [configMethodName]=\"elem.apiConfigMethod\"\n [isLister]=\"elem.isListerAutocomplete\"\n [apiBody]=\"elem.apiBody\"\n ></osl-autocomplete>\n </div>\n }\n\n @case (\"file-uploader\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-file-upload\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [accept]=\"elem.accept || ''\"\n [multiple]=\"!!elem.multiple\"\n [maxSize]=\"elem.maxFileSize || 0\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-file-upload>\n </div>\n }\n\n @case (\"datepicker\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-datepicker\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [dateType]=\"elem.dateType || 'date'\"\n [placeholder]=\"elem.placeholder || ''\"\n [minDate]=\"elem.minDateIf ? elem.minDateIf(model) : elem.minDate || ''\"\n [maxDate]=\"elem.maxDateIf ? elem.maxDateIf(model) : elem.maxDate || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-datepicker>\n </div>\n }\n\n @case (\"checkbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-checkbox\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [indeterminate]=\"!!elem.indeterminate\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-checkbox>\n </div>\n }\n\n @case (\"button\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-button\n [label]=\"elem.label\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n variant=\"secondary\"\n (clickEv)=\"elem.change ? elem.change(model) : null\"\n ></osl-button>\n </div>\n }\n\n @case (\"fieldset\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <fieldset class=\"osl-fieldset\">\n @if(elem.label) {\n <legend class=\"osl-fieldset-legend\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <span class=\"osl-fieldset-legend__text\">{{ elem.label }}</span>\n </legend>\n }\n <div class=\"row w-100 osl-fieldset-body\">\n @for(innerElem of elem.rows; track innerElem) {\n @if(!(innerElem.hideIf ? innerElem.hideIf(model) : innerElem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: innerElem }\"></ng-container>\n }\n }\n </div>\n </fieldset>\n </div>\n }\n\n @case (\"templateRef\"){\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container>\n </div>\n }\n\n @case (\"spacer\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n </div>\n }\n\n }\n }\n</ng-template>\n", styles: [".osl-fieldset{border:1.5px solid var(--osl-border-color, #e5e7eb);border-radius:10px;padding:0 16px 16px;margin:0;background:linear-gradient(135deg,#f9fafb,#fff);box-shadow:0 1px 4px #0000000d;position:relative;transition:box-shadow .2s}.osl-fieldset:focus-within{box-shadow:0 0 0 3px #6366f114,0 2px 8px #0000000f;border-color:var(--osl-primary, #6366f1)}.osl-fieldset-legend{padding:0 6px;margin-left:8px;line-height:1;float:none;width:auto}.osl-fieldset-legend__text{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;background:#fff;padding:2px 10px;border:1.5px solid var(--osl-border-color, #e5e7eb);box-shadow:0 1px 3px #6366f11a}.osl-fieldset-body{margin-top:4px}\n"] }]
2948
+ args: [{ selector: 'osl-dynamic-form', standalone: false, template: "@if(elements && elements.length > 0) {\n <div class=\"row align-items-center w-100\">\n @for(elem of elements; track elem) {\n @if(!(elem.hideIf ? elem.hideIf(model) : elem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: elem }\"></ng-container>\n }\n }\n </div>\n}\n\n<ng-template #formField let-elem>\n @if(elem.hideIf ? !elem.hideIf(model) : true) {\n @switch (elem.elementType) {\n\n @case (\"textbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-input\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [type]=\"elem.inputType || 'text'\"\n [placeholder]=\"elem.placeholder || ''\"\n [mask]=\"elem.mask || ''\"\n [min]=\"elem.min ?? ''\"\n [max]=\"elem.max ?? ''\"\n [minLength]=\"elem.minLength ?? null\"\n [maxLength]=\"elem.maxLength ?? null\"\n [prefixIcon]=\"elem.prefixIcon || ''\"\n [suffixIcon]=\"elem.suffixIcon || ''\"\n [onlyChars]=\"!!elem.onlyChars\"\n [decimalPortion]=\"elem.decimalPortion ?? null\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n [isCapitalize]=\"elem.isCapitalize\"\n ></osl-input>\n </div>\n }\n\n @case (\"textarea\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-textarea\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [rows]=\"elem.textareaRows || 3\"\n [placeholder]=\"elem.placeholder || ''\"\n [maxLength]=\"elem.maxLength ?? null\"\n [minLength]=\"elem.minLength ?? null\"\n [characterCounter]=\"!!elem.characterCounter\"\n [resize]=\"elem.resize || 'none'\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-textarea>\n </div>\n }\n\n @case (\"select\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-select\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.selectPlaceholder || 'Select...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n [clearable]=\"!!elem.clearable\"\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-select>\n </div>\n }\n\n @case (\"radio\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-radio\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [inline]=\"!!elem.inline\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-radio>\n </div>\n }\n\n @case (\"slide-toggle\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-slide-toggle\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [labelPosition]=\"elem.labelPosition || 'after'\"\n [trueLabel]=\"elem.trueLabel || ''\"\n [falseLabel]=\"elem.falseLabel || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-slide-toggle>\n </div>\n }\n\n @case (\"autocomplete\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-autocomplete\n [label]=\"elem.label\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [datasource]=\"elem.datasource || []\"\n [displayField]=\"elem.displayField || ''\"\n [valueField]=\"elem.valueField || ''\"\n [placeholder]=\"elem.autocompletePlaceholder || 'Type to search...'\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n (changeEv)=\"onFieldChange(elem, $event)\"\n [(model)]=\"model[elem.key]\"\n [methodName]=\"elem.apiMethod\"\n [service]=\"elem.apiService\"\n [object]=\"model[elem.objectName]\"\n [searchType]=\"elem.searchType\"\n [configMethodName]=\"elem.apiConfigMethod\"\n [isLister]=\"elem.isListerAutocomplete\"\n [apiBody]=\"elem.apiBody\"\n ></osl-autocomplete>\n </div>\n }\n\n @case (\"file-uploader\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-file-upload\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [accept]=\"elem.accept || ''\"\n [multiple]=\"!!elem.multiple\"\n [maxSize]=\"elem.maxFileSize || 0\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-file-upload>\n </div>\n }\n\n @case (\"datepicker\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-datepicker\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [dateType]=\"elem.dateType || 'date'\"\n [placeholder]=\"elem.placeholder || ''\"\n [minDate]=\"elem.minDateIf ? elem.minDateIf(model) : elem.minDate || ''\"\n [maxDate]=\"elem.maxDateIf ? elem.maxDateIf(model) : elem.maxDate || ''\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-datepicker>\n </div>\n }\n\n @case (\"datetimepicker\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-datetimepicker\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [placeholder]=\"elem.placeholder || ''\"\n [minDatetime]=\"elem.minDatetimeIf ? elem.minDatetimeIf(model) : elem.minDatetime || ''\"\n [maxDatetime]=\"elem.maxDatetimeIf ? elem.maxDatetimeIf(model) : elem.maxDatetime || ''\"\n [format]=\"elem.datetimepickerFormat || 'YYYY-MM-DDTHH:mm'\"\n [showSeconds]=\"!!elem.datetimepickerShowSeconds\"\n [enableMeridian]=\"!!elem.datetimepickerEnableMeridian\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-datetimepicker>\n </div>\n }\n\n @case (\"checkbox\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-checkbox\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n [label]=\"elem.label\"\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\n [indeterminate]=\"!!elem.indeterminate\"\n (changeEv)=\"elem.change ? elem.change(model) : null\"\n [model]=\"model[elem.key]\"\n (modelChange)=\"onModelChange($event, elem.key)\"\n ></osl-checkbox>\n </div>\n }\n\n @case (\"button\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n <osl-button\n [label]=\"elem.label\"\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\n variant=\"secondary\"\n (clickEv)=\"elem.change ? elem.change(model) : null\"\n ></osl-button>\n </div>\n }\n\n @case (\"fieldset\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <fieldset class=\"osl-fieldset\">\n @if(elem.label) {\n <legend class=\"osl-fieldset-legend\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <span class=\"osl-fieldset-legend__text\">{{ elem.label }}</span>\n </legend>\n }\n <div class=\"row w-100 osl-fieldset-body\">\n @for(innerElem of elem.rows; track innerElem) {\n @if(!(innerElem.hideIf ? innerElem.hideIf(model) : innerElem.hide)) {\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: innerElem }\"></ng-container>\n }\n }\n </div>\n </fieldset>\n </div>\n }\n\n @case (\"templateRef\"){\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\n <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container>\n </div>\n }\n\n @case (\"spacer\") {\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\" [attr.data-field-key]=\"elem.key\">\n </div>\n }\n\n }\n }\n</ng-template>\n", styles: [".osl-fieldset{border:1.5px solid var(--osl-border-color, #e5e7eb);border-radius:10px;padding:0 16px 16px;margin:0;background:linear-gradient(135deg,#f9fafb,#fff);box-shadow:0 1px 4px #0000000d;position:relative;transition:box-shadow .2s}.osl-fieldset:focus-within{box-shadow:0 0 0 3px #6366f114,0 2px 8px #0000000f;border-color:var(--osl-primary, #6366f1)}.osl-fieldset-legend{padding:0 6px;margin-left:8px;line-height:1;float:none;width:auto}.osl-fieldset-legend__text{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;background:#fff;padding:2px 10px;border:1.5px solid var(--osl-border-color, #e5e7eb);box-shadow:0 1px 3px #6366f11a}.osl-fieldset-body{margin-top:4px}\n"] }]
2511
2949
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { elements: [{
2512
2950
  type: Input,
2513
2951
  args: ['elements']
@@ -2524,444 +2962,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2524
2962
  type: Output
2525
2963
  }] } });
2526
2964
 
2527
- // ─── Date Utilities ───────────────────────────────────────────────────────────
2528
- const MONTH_NAMES_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
2529
- const MONTH_NAMES_FULL = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
2530
- const DAY_NAMES_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
2531
- const DAY_NAMES_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
2532
- function pad(n) {
2533
- return String(n).padStart(2, '0');
2534
- }
2535
- /** Returns the current date and time. */
2536
- function now() {
2537
- return new Date();
2538
- }
2539
- /** Returns today's date with time set to midnight. */
2540
- function today() {
2541
- return startOfDay(new Date());
2542
- }
2543
- /** Returns true if the value is a valid Date object. */
2544
- function isValidDate$1(value) {
2545
- return value instanceof Date && !isNaN(value.getTime());
2546
- }
2547
- /**
2548
- * Formats a Date using a pattern string.
2549
- * Tokens: YYYY, YY, MM, M, DD, D, HH, H, mm, m, ss, s,
2550
- * MMM (short month), MMMM (full month),
2551
- * ddd (short day), dddd (full day).
2552
- */
2553
- function formatDate(date, pattern) {
2554
- const d = new Date(date);
2555
- if (!isValidDate$1(d))
2556
- return '';
2557
- const year = d.getFullYear();
2558
- const month = d.getMonth();
2559
- const day = d.getDate();
2560
- const hours = d.getHours();
2561
- const mins = d.getMinutes();
2562
- const secs = d.getSeconds();
2563
- const dayOfWeek = d.getDay();
2564
- return pattern
2565
- .replace('YYYY', String(year))
2566
- .replace('YY', String(year).slice(-2))
2567
- .replace('MMMM', MONTH_NAMES_FULL[month])
2568
- .replace('MMM', MONTH_NAMES_SHORT[month])
2569
- .replace('MM', pad(month + 1))
2570
- .replace('M', String(month + 1))
2571
- .replace('dddd', DAY_NAMES_FULL[dayOfWeek])
2572
- .replace('ddd', DAY_NAMES_SHORT[dayOfWeek])
2573
- .replace('DD', pad(day))
2574
- .replace('D', String(day))
2575
- .replace('HH', pad(hours))
2576
- .replace('H', String(hours))
2577
- .replace('mm', pad(mins))
2578
- .replace('m', String(mins))
2579
- .replace('ss', pad(secs))
2580
- .replace('s', String(secs));
2581
- }
2582
- /** Returns date as `YYYY-MM-DD`. */
2583
- function toDateOnly(date) {
2584
- return formatDate(date, 'YYYY-MM-DD');
2585
- }
2586
- /** Returns the ISO 8601 string for a date. */
2587
- function toISOString(date) {
2588
- return date.toISOString();
2589
- }
2590
- /** Returns a new date with `days` added. */
2591
- function addDays(date, days) {
2592
- const result = new Date(date);
2593
- result.setDate(result.getDate() + days);
2594
- return result;
2595
- }
2596
- /** Returns a new date with `months` added. */
2597
- function addMonths(date, months) {
2598
- const result = new Date(date);
2599
- result.setMonth(result.getMonth() + months);
2600
- return result;
2601
- }
2602
- /** Returns a new date with `years` added. */
2603
- function addYears(date, years) {
2604
- const result = new Date(date);
2605
- result.setFullYear(result.getFullYear() + years);
2606
- return result;
2607
- }
2608
- /** Returns a new date with `hours` added. */
2609
- function addHours(date, hours) {
2610
- return new Date(date.getTime() + hours * 3_600_000);
2611
- }
2612
- /** Returns a new date with `minutes` added. */
2613
- function addMinutes(date, minutes) {
2614
- return new Date(date.getTime() + minutes * 60_000);
2615
- }
2616
- /** Returns a new date with `days` subtracted. */
2617
- function subtractDays(date, days) {
2618
- return addDays(date, -days);
2619
- }
2620
- /** Returns a new date with `months` subtracted. */
2621
- function subtractMonths(date, months) {
2622
- return addMonths(date, -months);
2623
- }
2624
- /** Returns a new date with `years` subtracted. */
2625
- function subtractYears(date, years) {
2626
- return addYears(date, -years);
2627
- }
2628
- /** Returns the absolute difference in whole days between two dates. */
2629
- function diffInDays(date1, date2) {
2630
- return Math.abs(Math.floor((date1.getTime() - date2.getTime()) / 86_400_000));
2631
- }
2632
- /** Returns the absolute difference in whole months between two dates. */
2633
- function diffInMonths(date1, date2) {
2634
- return Math.abs((date1.getFullYear() - date2.getFullYear()) * 12 +
2635
- (date1.getMonth() - date2.getMonth()));
2636
- }
2637
- /** Returns the absolute difference in whole years between two dates. */
2638
- function diffInYears(date1, date2) {
2639
- return Math.abs(date1.getFullYear() - date2.getFullYear());
2640
- }
2641
- /** Returns the difference in minutes between two dates (date1 - date2). */
2642
- function diffInMinutes(date1, date2) {
2643
- return Math.floor((date1.getTime() - date2.getTime()) / 60_000);
2644
- }
2645
- /** Returns true if date1 is strictly before date2. */
2646
- function isBefore(date1, date2) {
2647
- return date1.getTime() < date2.getTime();
2648
- }
2649
- /** Returns true if date1 is strictly after date2. */
2650
- function isAfter(date1, date2) {
2651
- return date1.getTime() > date2.getTime();
2652
- }
2653
- /** Returns true if both dates fall on the same calendar day. */
2654
- function isSameDay(date1, date2) {
2655
- return (date1.getFullYear() === date2.getFullYear() &&
2656
- date1.getMonth() === date2.getMonth() &&
2657
- date1.getDate() === date2.getDate());
2658
- }
2659
- /** Returns true if the date falls on a Saturday or Sunday. */
2660
- function isWeekend(date) {
2661
- return date.getDay() === 0 || date.getDay() === 6;
2662
- }
2663
- /** Returns true if the date is today. */
2664
- function isToday(date) {
2665
- return isSameDay(date, new Date());
2666
- }
2667
- /** Returns true if the date falls in the past (before now). */
2668
- function isPast(date) {
2669
- return date.getTime() < Date.now();
2670
- }
2671
- /** Returns true if the date falls in the future (after now). */
2672
- function isFuture(date) {
2673
- return date.getTime() > Date.now();
2674
- }
2675
- /** Returns the date with time set to 00:00:00.000. */
2676
- function startOfDay(date) {
2677
- const result = new Date(date);
2678
- result.setHours(0, 0, 0, 0);
2679
- return result;
2680
- }
2681
- /** Returns the date with time set to 23:59:59.999. */
2682
- function endOfDay(date) {
2683
- const result = new Date(date);
2684
- result.setHours(23, 59, 59, 999);
2685
- return result;
2686
- }
2687
- /** Returns the first day of the month (time 00:00:00.000). */
2688
- function startOfMonth(date) {
2689
- return new Date(date.getFullYear(), date.getMonth(), 1);
2690
- }
2691
- /** Returns the last day of the month (time 23:59:59.999). */
2692
- function endOfMonth(date) {
2693
- const result = new Date(date.getFullYear(), date.getMonth() + 1, 0);
2694
- result.setHours(23, 59, 59, 999);
2695
- return result;
2696
- }
2697
- /** Returns the first day of the year (Jan 1, 00:00:00.000). */
2698
- function startOfYear(date) {
2699
- return new Date(date.getFullYear(), 0, 1);
2700
- }
2701
- /** Returns the last day of the year (Dec 31, 23:59:59.999). */
2702
- function endOfYear(date) {
2703
- const result = new Date(date.getFullYear(), 11, 31);
2704
- result.setHours(23, 59, 59, 999);
2705
- return result;
2706
- }
2707
- /** Calculates the age in years from a birth date. */
2708
- function getAge(birthDate) {
2709
- const n = new Date();
2710
- let age = n.getFullYear() - birthDate.getFullYear();
2711
- const monthDiff = n.getMonth() - birthDate.getMonth();
2712
- if (monthDiff < 0 || (monthDiff === 0 && n.getDate() < birthDate.getDate()))
2713
- age--;
2714
- return age;
2715
- }
2716
- /** Returns the number of days in a given month (0-based month). */
2717
- function daysInMonth(year, month) {
2718
- return new Date(year, month + 1, 0).getDate();
2719
- }
2720
- /** Returns true if the given year is a leap year. */
2721
- function isLeapYear(year) {
2722
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
2723
- }
2724
- /**
2725
- * Returns a human-friendly relative time string.
2726
- * @example timeAgo(new Date(Date.now() - 3600_000)) → '1 hour ago'
2727
- */
2728
- function timeAgo(date) {
2729
- const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
2730
- const abs = Math.abs(seconds);
2731
- const future = seconds < 0;
2732
- const intervals = [
2733
- [31_536_000, 'year'],
2734
- [2_592_000, 'month'],
2735
- [604_800, 'week'],
2736
- [86_400, 'day'],
2737
- [3_600, 'hour'],
2738
- [60, 'minute'],
2739
- [1, 'second'],
2740
- ];
2741
- for (const [secs, label] of intervals) {
2742
- const count = Math.floor(abs / secs);
2743
- if (count >= 1) {
2744
- const unit = count === 1 ? label : `${label}s`;
2745
- return future ? `in ${count} ${unit}` : `${count} ${unit} ago`;
2746
- }
2747
- }
2748
- return 'just now';
2749
- }
2750
- /** Returns the ISO week number (1–53) for the given date. */
2751
- function getWeekNumber(date) {
2752
- const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
2753
- d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
2754
- const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
2755
- return Math.ceil((((d.getTime() - yearStart.getTime()) / 86_400_000) + 1) / 7);
2756
- }
2757
- /** Returns the next weekday (Mon–Fri) after the given date. */
2758
- function nextWorkday(date) {
2759
- const result = addDays(date, 1);
2760
- while (isWeekend(result)) {
2761
- result.setDate(result.getDate() + 1);
2762
- }
2763
- return result;
2764
- }
2765
- /** Returns true if a date falls within the range [start, end] (inclusive). */
2766
- function inRange$2(date, start, end) {
2767
- return date >= start && date <= end;
2768
- }
2769
- /** Parses a `YYYY-MM-DD` string and returns a local-midnight Date or null. */
2770
- function parseDate(dateStr) {
2771
- const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateStr);
2772
- if (!match)
2773
- return null;
2774
- const [, y, mo, d] = match.map(Number);
2775
- const result = new Date(y, mo - 1, d);
2776
- return isValidDate$1(result) ? result : null;
2777
- }
2778
- function localeDate(dateStr) {
2779
- const date = new Date(dateStr);
2780
- date.toLocaleString('en-US');
2781
- }
2782
-
2783
- var date_util = /*#__PURE__*/Object.freeze({
2784
- __proto__: null,
2785
- addDays: addDays,
2786
- addHours: addHours,
2787
- addMinutes: addMinutes,
2788
- addMonths: addMonths,
2789
- addYears: addYears,
2790
- daysInMonth: daysInMonth,
2791
- diffInDays: diffInDays,
2792
- diffInMinutes: diffInMinutes,
2793
- diffInMonths: diffInMonths,
2794
- diffInYears: diffInYears,
2795
- endOfDay: endOfDay,
2796
- endOfMonth: endOfMonth,
2797
- endOfYear: endOfYear,
2798
- formatDate: formatDate,
2799
- getAge: getAge,
2800
- getWeekNumber: getWeekNumber,
2801
- inRange: inRange$2,
2802
- isAfter: isAfter,
2803
- isBefore: isBefore,
2804
- isFuture: isFuture,
2805
- isLeapYear: isLeapYear,
2806
- isPast: isPast,
2807
- isSameDay: isSameDay,
2808
- isToday: isToday,
2809
- isValidDate: isValidDate$1,
2810
- isWeekend: isWeekend,
2811
- localeDate: localeDate,
2812
- nextWorkday: nextWorkday,
2813
- now: now,
2814
- parseDate: parseDate,
2815
- startOfDay: startOfDay,
2816
- startOfMonth: startOfMonth,
2817
- startOfYear: startOfYear,
2818
- subtractDays: subtractDays,
2819
- subtractMonths: subtractMonths,
2820
- subtractYears: subtractYears,
2821
- timeAgo: timeAgo,
2822
- toDateOnly: toDateOnly,
2823
- toISOString: toISOString,
2824
- today: today
2825
- });
2826
-
2827
- class OslDatetimepicker {
2828
- dtNativeInput;
2829
- label = '';
2830
- required = false;
2831
- disabled = false;
2832
- dateModel = null;
2833
- set model(val) {
2834
- this.dateModel = this._parseToDate(val);
2835
- this._scheduleDisplayUpdate();
2836
- }
2837
- placeholder = '';
2838
- minDate = null;
2839
- maxDate = null;
2840
- set minDatetime(val) {
2841
- this.minDate = this._parseToDate(val);
2842
- }
2843
- set maxDatetime(val) {
2844
- this.maxDate = this._parseToDate(val);
2845
- }
2846
- /** Emitted string format. Tokens: YYYY MM DD HH mm ss ddd dddd etc. Default: 'YYYY-MM-DDTHH:mm' */
2847
- format = 'YYYY-MM-DDTHH:mm';
2848
- /** Display format shown inside the input field. Default: 'ddd DD/MM/YYYY HH:mm' → Sun 18/01/2026 19:18 */
2849
- set displayFormatInput(val) {
2850
- this._displayFormat = val || 'ddd DD/MM/YYYY HH:mm';
2851
- this._scheduleDisplayUpdate();
2852
- }
2853
- _displayFormat = 'ddd DD/MM/YYYY HH:mm';
2854
- showSeconds = false;
2855
- enableMeridian = false;
2856
- skeletonLoading = false;
2857
- skeletonTheme = 'light';
2858
- modelChange = new EventEmitter();
2859
- changeEv = new EventEmitter();
2860
- ngAfterViewInit() {
2861
- this._updateDisplay();
2862
- }
2863
- onDateChange(date) {
2864
- this.dateModel = date;
2865
- this._updateDisplay();
2866
- const str = date ? formatDate(date, this.format) : '';
2867
- this.modelChange.emit(str);
2868
- this.changeEv.emit(str);
2869
- }
2870
- _updateDisplay() {
2871
- if (!this.dtNativeInput)
2872
- return;
2873
- this.dtNativeInput.nativeElement.value =
2874
- this.dateModel ? formatDate(this.dateModel, this._displayFormat) : '';
2875
- }
2876
- _scheduleDisplayUpdate() {
2877
- setTimeout(() => this._updateDisplay());
2878
- }
2879
- _parseToDate(val) {
2880
- if (!val)
2881
- return null;
2882
- const d = new Date(val);
2883
- return isNaN(d.getTime()) ? null : d;
2884
- }
2885
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslDatetimepicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
2886
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: OslDatetimepicker, isStandalone: false, selector: "osl-datetimepicker", inputs: { label: "label", required: "required", disabled: "disabled", model: "model", placeholder: "placeholder", minDatetime: "minDatetime", maxDatetime: "maxDatetime", format: "format", displayFormatInput: ["displayFormat", "displayFormatInput"], showSeconds: "showSeconds", enableMeridian: "enableMeridian", skeletonLoading: "skeletonLoading", skeletonTheme: "skeletonTheme" }, outputs: { modelChange: "modelChange", changeEv: "changeEv" }, providers: [
2887
- {
2888
- provide: MAT_DATE_FORMATS,
2889
- useValue: {
2890
- parse: {
2891
- dateInput: 'DD-MMM-YYYY hh:mm a',
2892
- },
2893
- display: {
2894
- dateInput: 'DD-MMM-YYYY hh:mm a',
2895
- monthYearLabel: 'MMM YYYY', dateA11yLabel: 'LL', monthYearA11yLabel: 'MMMM YYYY',
2896
- }
2897
- }
2898
- }
2899
- ], viewQueries: [{ propertyName: "dtNativeInput", first: true, predicate: ["dtNativeInput"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex flex-column\">\n @if (label) {\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <label class=\"label\" [class.txt-clr-red]=\"dtField.touched && dtField.invalid\">\n {{label}} <span class=\"txt-clr-red\">{{required ? '*' : ''}}</span>\n </label>\n </div>\n }\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <input\n class=\"dt-input\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngModel]=\"dateModel\"\n (ngModelChange)=\"onDateChange($event)\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [min]=\"minDate\"\n [max]=\"maxDate\"\n [placeholder]=\"placeholder\"\n [class.error]=\"dtField.touched && dtField.invalid\"\n #dtField=\"ngModel\"\n readonly\n />\n <button\n type=\"button\"\n class=\"dt-icon-btn\"\n (click)=\"picker.open()\"\n [disabled]=\"disabled\"\n tabindex=\"-1\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"14\" height=\"14\" rx=\"2\"/>\n <line x1=\"3\" y1=\"8\" x2=\"17\" y2=\"8\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"6\"/>\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"6\"/>\n </svg>\n </button>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"showSeconds\"\n [enableMeridian]=\"enableMeridian\">\n </ngx-mat-datetime-picker>\n </div>\n @if (dtField.touched && dtField.invalid && required) {\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\n }\n</div>\n", styles: [".label{font-size:var(--osl-label-font-size);margin-bottom:5px}.txt-clr-red{color:var(--osl-error-color)}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.input-wrapper{position:relative;display:flex;align-items:center}.dt-icon-btn{position:absolute;right:7px;top:50%;transform:translateY(-50%);width:22px;height:22px;padding:0;border:none;background:transparent;cursor:pointer;color:#9ca3af;display:flex;align-items:center;justify-content:center;transition:color .15s;border-radius:4px}.dt-icon-btn svg{width:16px;height:16px;display:block}.dt-icon-btn:hover:not(:disabled){color:var(--osl-focus-border-color)}.dt-icon-btn:disabled{opacity:.35;cursor:not-allowed}.dt-input{height:var(--osl-control-height);width:100%;border-radius:var(--osl-border-radius);outline:none;border:1px solid var(--osl-border-color);padding:0 38px 0 10px;font-size:var(--osl-text-font-size);font-family:inherit;color:#333;background-color:#fff;transition:border-color .2s,box-shadow .2s;letter-spacing:.01em;box-sizing:border-box}.dt-input::placeholder{color:#bbb}.dt-input:hover:not(:disabled){border-color:var(--osl-focus-border-color)}.dt-input:focus{border-color:var(--osl-focus-border-color);box-shadow:0 0 0 3px var(--osl-focus-shadow, rgba(99, 102, 241, .14))}.dt-input:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.7}.dt-input.error{border-color:var(--osl-error-color)}.dt-input.error:focus{box-shadow:0 0 0 3px var(--osl-error-shadow, rgba(220, 38, 38, .14))}\n"], dependencies: [{ kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: OslSkeletonDirective, selector: "[oslSkeleton]", inputs: ["oslSkeleton", "oslSkeletonType", "oslSkeletonAnimation", "oslSkeletonTheme", "oslSkeletonColor", "oslSkeletonHighlight", "oslSkeletonRadius", "oslSkeletonRows", "oslSkeletonRowGap", "oslSkeletonZIndex", "oslSkeletonDelay", "oslSkeletonDuration", "oslSkeletonMinHeight", "oslSkeletonForceReread", "oslSkeletonCircleSize", "oslSkeletonListItems", "oslSkeletonTableRows", "oslSkeletonTableCols", "oslSkeletonCardLines", "oslSkeletonBgColor"] }, { kind: "component", type: i4.NgxMatDatetimepicker, selector: "ngx-mat-datetime-picker", exportAs: ["ngxMatDatetimePicker"] }, { kind: "directive", type: i4.NgxMatDatepickerInput, selector: "input[ngxMatDatetimePicker]", inputs: ["ngxMatDatetimePicker", "min", "max", "matDatepickerFilter"], exportAs: ["ngxMatDatepickerInput"] }] });
2900
- }
2901
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OslDatetimepicker, decorators: [{
2902
- type: Component,
2903
- args: [{ selector: 'osl-datetimepicker', standalone: false, providers: [
2904
- {
2905
- provide: MAT_DATE_FORMATS,
2906
- useValue: {
2907
- parse: {
2908
- dateInput: 'DD-MMM-YYYY hh:mm a',
2909
- },
2910
- display: {
2911
- dateInput: 'DD-MMM-YYYY hh:mm a',
2912
- monthYearLabel: 'MMM YYYY', dateA11yLabel: 'LL', monthYearA11yLabel: 'MMMM YYYY',
2913
- }
2914
- }
2915
- }
2916
- ], template: "<div class=\"d-flex flex-column\">\n @if (label) {\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <label class=\"label\" [class.txt-clr-red]=\"dtField.touched && dtField.invalid\">\n {{label}} <span class=\"txt-clr-red\">{{required ? '*' : ''}}</span>\n </label>\n </div>\n }\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <input\n class=\"dt-input\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngModel]=\"dateModel\"\n (ngModelChange)=\"onDateChange($event)\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [min]=\"minDate\"\n [max]=\"maxDate\"\n [placeholder]=\"placeholder\"\n [class.error]=\"dtField.touched && dtField.invalid\"\n #dtField=\"ngModel\"\n readonly\n />\n <button\n type=\"button\"\n class=\"dt-icon-btn\"\n (click)=\"picker.open()\"\n [disabled]=\"disabled\"\n tabindex=\"-1\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"14\" height=\"14\" rx=\"2\"/>\n <line x1=\"3\" y1=\"8\" x2=\"17\" y2=\"8\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"6\"/>\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"6\"/>\n </svg>\n </button>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"showSeconds\"\n [enableMeridian]=\"enableMeridian\">\n </ngx-mat-datetime-picker>\n </div>\n @if (dtField.touched && dtField.invalid && required) {\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\n }\n</div>\n", styles: [".label{font-size:var(--osl-label-font-size);margin-bottom:5px}.txt-clr-red{color:var(--osl-error-color)}.hint{color:var(--osl-error-color);margin-top:2px;font-size:var(--osl-hint-font-size)}.input-wrapper{position:relative;display:flex;align-items:center}.dt-icon-btn{position:absolute;right:7px;top:50%;transform:translateY(-50%);width:22px;height:22px;padding:0;border:none;background:transparent;cursor:pointer;color:#9ca3af;display:flex;align-items:center;justify-content:center;transition:color .15s;border-radius:4px}.dt-icon-btn svg{width:16px;height:16px;display:block}.dt-icon-btn:hover:not(:disabled){color:var(--osl-focus-border-color)}.dt-icon-btn:disabled{opacity:.35;cursor:not-allowed}.dt-input{height:var(--osl-control-height);width:100%;border-radius:var(--osl-border-radius);outline:none;border:1px solid var(--osl-border-color);padding:0 38px 0 10px;font-size:var(--osl-text-font-size);font-family:inherit;color:#333;background-color:#fff;transition:border-color .2s,box-shadow .2s;letter-spacing:.01em;box-sizing:border-box}.dt-input::placeholder{color:#bbb}.dt-input:hover:not(:disabled){border-color:var(--osl-focus-border-color)}.dt-input:focus{border-color:var(--osl-focus-border-color);box-shadow:0 0 0 3px var(--osl-focus-shadow, rgba(99, 102, 241, .14))}.dt-input:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.7}.dt-input.error{border-color:var(--osl-error-color)}.dt-input.error:focus{box-shadow:0 0 0 3px var(--osl-error-shadow, rgba(220, 38, 38, .14))}\n"] }]
2917
- }], propDecorators: { dtNativeInput: [{
2918
- type: ViewChild,
2919
- args: ['dtNativeInput']
2920
- }], label: [{
2921
- type: Input,
2922
- args: ['label']
2923
- }], required: [{
2924
- type: Input,
2925
- args: ['required']
2926
- }], disabled: [{
2927
- type: Input,
2928
- args: ['disabled']
2929
- }], model: [{
2930
- type: Input,
2931
- args: ['model']
2932
- }], placeholder: [{
2933
- type: Input,
2934
- args: ['placeholder']
2935
- }], minDatetime: [{
2936
- type: Input,
2937
- args: ['minDatetime']
2938
- }], maxDatetime: [{
2939
- type: Input,
2940
- args: ['maxDatetime']
2941
- }], format: [{
2942
- type: Input,
2943
- args: ['format']
2944
- }], displayFormatInput: [{
2945
- type: Input,
2946
- args: ['displayFormat']
2947
- }], showSeconds: [{
2948
- type: Input,
2949
- args: ['showSeconds']
2950
- }], enableMeridian: [{
2951
- type: Input,
2952
- args: ['enableMeridian']
2953
- }], skeletonLoading: [{
2954
- type: Input,
2955
- args: ['skeletonLoading']
2956
- }], skeletonTheme: [{
2957
- type: Input,
2958
- args: ['skeletonTheme']
2959
- }], modelChange: [{
2960
- type: Output
2961
- }], changeEv: [{
2962
- type: Output
2963
- }] } });
2964
-
2965
2965
  class OslSetupStateService {
2966
2966
  _map = new Map();
2967
2967
  save(key, state) {
@@ -7327,11 +7327,11 @@ class UnsavedChangesDialog {
7327
7327
  leave() { this.dialogRef.close('leave'); }
7328
7328
  cancel() { this.dialogRef.close(null); }
7329
7329
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UnsavedChangesDialog, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
7330
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: UnsavedChangesDialog, isStandalone: true, selector: "unsaved-changes-dialog", ngImport: i0, template: "<div class=\"ucd-wrap\">\n\n <!-- Amber gradient header zone + icon -->\n <div class=\"ucd-header\">\n <button mat-icon-button class=\"ucd-close\" (click)=\"cancel()\" aria-label=\"Close\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n <div class=\"ucd-icon-ring\">\n <svg class=\"ucd-icon-svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n </div>\n </div>\n\n <!-- Content -->\n <mat-dialog-content class=\"ucd-body\">\n <h2 class=\"ucd-title\">Unsaved Changes</h2>\n <p class=\"ucd-subtitle\">You have unsaved changes that will be lost if you leave this page.</p>\n </mat-dialog-content>\n\n <!-- Actions \u2014 all buttons on one line -->\n <mat-dialog-actions class=\"ucd-actions\">\n <button mat-stroked-button class=\"ucd-btn ucd-stay\" (click)=\"cancel()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"/>\n </svg>\n <span>Stay on Page</span>\n </button>\n <button mat-stroked-button class=\"ucd-btn ucd-leave\" (click)=\"leave()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z\"/>\n </svg>\n <span>Discard</span>\n </button>\n @if (data.hasSaveCallback) {\n <button mat-flat-button class=\"ucd-btn ucd-save\" (click)=\"save()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z\"/>\n </svg>\n <span>Save &amp; Leave</span>\n </button>\n }\n </mat-dialog-actions>\n\n</div>\n", styles: ["@keyframes ucd-icon-bounce{0%{transform:scale(.55) rotate(-10deg);opacity:0}60%{transform:scale(1.12) rotate(4deg);opacity:1}80%{transform:scale(.93) rotate(-2deg)}to{transform:scale(1) rotate(0)}}@keyframes ucd-glow{0%,to{box-shadow:0 0 #f59e0b73,0 6px 20px #f59e0b1f}55%{box-shadow:0 0 0 14px #f59e0b00,0 6px 20px #f59e0b38}}.ucd-header{position:relative;background:linear-gradient(160deg,#fffbeb,#fef3c7 55%,#fde68a);padding:40px 20px 32px;display:flex;justify-content:center;align-items:center}.ucd-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(245,158,11,.4),transparent)}.ucd-close{position:absolute;top:10px;right:10px;width:30px!important;height:30px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important;color:#92400e;opacity:.5;transition:opacity .15s ease,transform .2s ease}.ucd-close ::ng-deep .mat-mdc-button-touch-target,.ucd-close ::ng-deep .mat-mdc-focus-indicator{display:none}.ucd-close svg{display:block;flex-shrink:0}.ucd-close:hover{opacity:1;transform:rotate(90deg)}.ucd-icon-ring{width:82px;height:82px;border-radius:50%;background:linear-gradient(145deg,#fef9e7,#fde68a);border:2px solid rgba(245,158,11,.55);display:flex;align-items:center;justify-content:center;animation:ucd-glow 2.6s ease-in-out infinite}.ucd-icon-svg{width:40px;height:40px;color:#d97706;display:block;animation:ucd-icon-bounce .55s cubic-bezier(.34,1.56,.64,1) .12s both}.ucd-body{text-align:center;padding:26px 36px 12px!important;max-height:unset!important;overflow:visible!important}.ucd-title{font-size:20px;font-weight:700;color:#111827;margin:0 0 8px;letter-spacing:-.25px;line-height:1.25}.ucd-subtitle{font-size:14px;color:#6b7280;margin:0;line-height:1.65}.ucd-actions{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important;justify-content:center!important;align-items:center!important;gap:10px;padding:18px 28px 28px!important;min-height:unset!important}.ucd-btn{height:40px!important;border-radius:10px!important;font-size:13.5px!important;font-weight:500!important;letter-spacing:.1px;padding:0 20px!important;white-space:nowrap;transition:transform .15s ease,box-shadow .15s ease,background .15s ease,border-color .15s ease!important}.ucd-btn ::ng-deep .mdc-button__label{display:flex;align-items:center;gap:7px;line-height:1}.ucd-btn:hover{transform:translateY(-2px)}.ucd-btn:active{transform:translateY(0) scale(.97)}.ucd-btn-icon{width:15px;height:15px;flex-shrink:0;display:block}.ucd-stay{border-color:#d1d5db!important;color:#374151!important}.ucd-stay:hover{border-color:#9ca3af!important;background:#f9fafb!important;box-shadow:0 3px 10px #00000012!important}.ucd-leave{border-color:#dc262666!important;color:#dc2626!important;background:#fef2f280!important}.ucd-leave:hover{border-color:#dc2626!important;background:#fef2f2!important;box-shadow:0 3px 12px #dc26262e!important}.ucd-save{background:linear-gradient(135deg,#2563eb,#4f46e5);color:#fff!important;border:none!important;box-shadow:0 2px 10px #4f46e54d!important}.ucd-save .ucd-btn-icon{color:#fff}.ucd-save:hover{background:linear-gradient(135deg,#1d4ed8,#4338ca);box-shadow:0 6px 20px #4f46e56b!important}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }] });
7330
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: UnsavedChangesDialog, isStandalone: true, selector: "unsaved-changes-dialog", ngImport: i0, template: "<div class=\"ucd-wrap\">\n\n <!-- Amber gradient header zone + icon -->\n <div class=\"ucd-header\">\n <button mat-icon-button class=\"ucd-close\" (click)=\"cancel()\" aria-label=\"Close\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n <div class=\"ucd-icon-ring\">\n <svg class=\"ucd-icon-svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n </div>\n </div>\n\n <!-- Content -->\n <mat-dialog-content class=\"ucd-body\">\n <h2 class=\"ucd-title\">Unsaved Changes</h2>\n <p class=\"ucd-subtitle\">You have unsaved changes that will be lost if you leave this page.</p>\n </mat-dialog-content>\n\n <!-- Actions \u2014 all buttons on one line -->\n <mat-dialog-actions class=\"ucd-actions\">\n <button mat-stroked-button class=\"ucd-btn ucd-stay\" (click)=\"cancel()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"/>\n </svg>\n <span>Stay on Page</span>\n </button>\n <button mat-stroked-button class=\"ucd-btn ucd-leave\" (click)=\"leave()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z\"/>\n </svg>\n <span>Leave Page</span>\n </button>\n @if (data.hasSaveCallback) {\n <button mat-flat-button class=\"ucd-btn ucd-save\" (click)=\"save()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z\"/>\n </svg>\n <span>Save &amp; Leave</span>\n </button>\n }\n </mat-dialog-actions>\n\n</div>\n", styles: ["@keyframes ucd-icon-bounce{0%{transform:scale(.55) rotate(-10deg);opacity:0}60%{transform:scale(1.12) rotate(4deg);opacity:1}80%{transform:scale(.93) rotate(-2deg)}to{transform:scale(1) rotate(0)}}@keyframes ucd-glow{0%,to{box-shadow:0 0 #f59e0b73,0 6px 20px #f59e0b1f}55%{box-shadow:0 0 0 14px #f59e0b00,0 6px 20px #f59e0b38}}.ucd-header{position:relative;background:linear-gradient(160deg,#fffbeb,#fef3c7 55%,#fde68a);padding:40px 20px 32px;display:flex;justify-content:center;align-items:center}.ucd-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(245,158,11,.4),transparent)}.ucd-close{position:absolute;top:10px;right:10px;width:30px!important;height:30px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important;color:#92400e;opacity:.5;transition:opacity .15s ease,transform .2s ease}.ucd-close ::ng-deep .mat-mdc-button-touch-target,.ucd-close ::ng-deep .mat-mdc-focus-indicator{display:none}.ucd-close svg{display:block;flex-shrink:0}.ucd-close:hover{opacity:1;transform:rotate(90deg)}.ucd-icon-ring{width:82px;height:82px;border-radius:50%;background:linear-gradient(145deg,#fef9e7,#fde68a);border:2px solid rgba(245,158,11,.55);display:flex;align-items:center;justify-content:center;animation:ucd-glow 2.6s ease-in-out infinite}.ucd-icon-svg{width:40px;height:40px;color:#d97706;display:block;animation:ucd-icon-bounce .55s cubic-bezier(.34,1.56,.64,1) .12s both}.ucd-body{text-align:center;padding:26px 36px 12px!important;max-height:unset!important;overflow:visible!important}.ucd-title{font-size:20px;font-weight:700;color:#111827;margin:0 0 8px;letter-spacing:-.25px;line-height:1.25}.ucd-subtitle{font-size:14px;color:#6b7280;margin:0;line-height:1.65}.ucd-actions{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important;justify-content:center!important;align-items:center!important;gap:10px;padding:18px 28px 28px!important;min-height:unset!important}.ucd-btn{height:40px!important;border-radius:10px!important;font-size:13.5px!important;font-weight:500!important;letter-spacing:.1px;padding:0 20px!important;white-space:nowrap;transition:transform .15s ease,box-shadow .15s ease,background .15s ease,border-color .15s ease!important}.ucd-btn ::ng-deep .mdc-button__label{display:flex;align-items:center;gap:7px;line-height:1}.ucd-btn:hover{transform:translateY(-2px)}.ucd-btn:active{transform:translateY(0) scale(.97)}.ucd-btn-icon{width:15px;height:15px;flex-shrink:0;display:block}.ucd-stay{border-color:#d1d5db!important;color:#374151!important}.ucd-stay:hover{border-color:#9ca3af!important;background:#f9fafb!important;box-shadow:0 3px 10px #00000012!important}.ucd-leave{border-color:#dc262666!important;color:#dc2626!important;background:#fef2f280!important}.ucd-leave:hover{border-color:#dc2626!important;background:#fef2f2!important;box-shadow:0 3px 12px #dc26262e!important}.ucd-save{background:linear-gradient(135deg,#2563eb,#4f46e5);color:#fff!important;border:none!important;box-shadow:0 2px 10px #4f46e54d!important}.ucd-save .ucd-btn-icon{color:#fff}.ucd-save:hover{background:linear-gradient(135deg,#1d4ed8,#4338ca);box-shadow:0 6px 20px #4f46e56b!important}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }] });
7331
7331
  }
7332
7332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UnsavedChangesDialog, decorators: [{
7333
7333
  type: Component,
7334
- args: [{ selector: 'unsaved-changes-dialog', standalone: true, imports: [MatDialogModule, MatButtonModule], template: "<div class=\"ucd-wrap\">\n\n <!-- Amber gradient header zone + icon -->\n <div class=\"ucd-header\">\n <button mat-icon-button class=\"ucd-close\" (click)=\"cancel()\" aria-label=\"Close\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n <div class=\"ucd-icon-ring\">\n <svg class=\"ucd-icon-svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n </div>\n </div>\n\n <!-- Content -->\n <mat-dialog-content class=\"ucd-body\">\n <h2 class=\"ucd-title\">Unsaved Changes</h2>\n <p class=\"ucd-subtitle\">You have unsaved changes that will be lost if you leave this page.</p>\n </mat-dialog-content>\n\n <!-- Actions \u2014 all buttons on one line -->\n <mat-dialog-actions class=\"ucd-actions\">\n <button mat-stroked-button class=\"ucd-btn ucd-stay\" (click)=\"cancel()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"/>\n </svg>\n <span>Stay on Page</span>\n </button>\n <button mat-stroked-button class=\"ucd-btn ucd-leave\" (click)=\"leave()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z\"/>\n </svg>\n <span>Discard</span>\n </button>\n @if (data.hasSaveCallback) {\n <button mat-flat-button class=\"ucd-btn ucd-save\" (click)=\"save()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z\"/>\n </svg>\n <span>Save &amp; Leave</span>\n </button>\n }\n </mat-dialog-actions>\n\n</div>\n", styles: ["@keyframes ucd-icon-bounce{0%{transform:scale(.55) rotate(-10deg);opacity:0}60%{transform:scale(1.12) rotate(4deg);opacity:1}80%{transform:scale(.93) rotate(-2deg)}to{transform:scale(1) rotate(0)}}@keyframes ucd-glow{0%,to{box-shadow:0 0 #f59e0b73,0 6px 20px #f59e0b1f}55%{box-shadow:0 0 0 14px #f59e0b00,0 6px 20px #f59e0b38}}.ucd-header{position:relative;background:linear-gradient(160deg,#fffbeb,#fef3c7 55%,#fde68a);padding:40px 20px 32px;display:flex;justify-content:center;align-items:center}.ucd-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(245,158,11,.4),transparent)}.ucd-close{position:absolute;top:10px;right:10px;width:30px!important;height:30px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important;color:#92400e;opacity:.5;transition:opacity .15s ease,transform .2s ease}.ucd-close ::ng-deep .mat-mdc-button-touch-target,.ucd-close ::ng-deep .mat-mdc-focus-indicator{display:none}.ucd-close svg{display:block;flex-shrink:0}.ucd-close:hover{opacity:1;transform:rotate(90deg)}.ucd-icon-ring{width:82px;height:82px;border-radius:50%;background:linear-gradient(145deg,#fef9e7,#fde68a);border:2px solid rgba(245,158,11,.55);display:flex;align-items:center;justify-content:center;animation:ucd-glow 2.6s ease-in-out infinite}.ucd-icon-svg{width:40px;height:40px;color:#d97706;display:block;animation:ucd-icon-bounce .55s cubic-bezier(.34,1.56,.64,1) .12s both}.ucd-body{text-align:center;padding:26px 36px 12px!important;max-height:unset!important;overflow:visible!important}.ucd-title{font-size:20px;font-weight:700;color:#111827;margin:0 0 8px;letter-spacing:-.25px;line-height:1.25}.ucd-subtitle{font-size:14px;color:#6b7280;margin:0;line-height:1.65}.ucd-actions{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important;justify-content:center!important;align-items:center!important;gap:10px;padding:18px 28px 28px!important;min-height:unset!important}.ucd-btn{height:40px!important;border-radius:10px!important;font-size:13.5px!important;font-weight:500!important;letter-spacing:.1px;padding:0 20px!important;white-space:nowrap;transition:transform .15s ease,box-shadow .15s ease,background .15s ease,border-color .15s ease!important}.ucd-btn ::ng-deep .mdc-button__label{display:flex;align-items:center;gap:7px;line-height:1}.ucd-btn:hover{transform:translateY(-2px)}.ucd-btn:active{transform:translateY(0) scale(.97)}.ucd-btn-icon{width:15px;height:15px;flex-shrink:0;display:block}.ucd-stay{border-color:#d1d5db!important;color:#374151!important}.ucd-stay:hover{border-color:#9ca3af!important;background:#f9fafb!important;box-shadow:0 3px 10px #00000012!important}.ucd-leave{border-color:#dc262666!important;color:#dc2626!important;background:#fef2f280!important}.ucd-leave:hover{border-color:#dc2626!important;background:#fef2f2!important;box-shadow:0 3px 12px #dc26262e!important}.ucd-save{background:linear-gradient(135deg,#2563eb,#4f46e5);color:#fff!important;border:none!important;box-shadow:0 2px 10px #4f46e54d!important}.ucd-save .ucd-btn-icon{color:#fff}.ucd-save:hover{background:linear-gradient(135deg,#1d4ed8,#4338ca);box-shadow:0 6px 20px #4f46e56b!important}\n"] }]
7334
+ args: [{ selector: 'unsaved-changes-dialog', standalone: true, imports: [MatDialogModule, MatButtonModule], template: "<div class=\"ucd-wrap\">\n\n <!-- Amber gradient header zone + icon -->\n <div class=\"ucd-header\">\n <button mat-icon-button class=\"ucd-close\" (click)=\"cancel()\" aria-label=\"Close\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n <div class=\"ucd-icon-ring\">\n <svg class=\"ucd-icon-svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n </div>\n </div>\n\n <!-- Content -->\n <mat-dialog-content class=\"ucd-body\">\n <h2 class=\"ucd-title\">Unsaved Changes</h2>\n <p class=\"ucd-subtitle\">You have unsaved changes that will be lost if you leave this page.</p>\n </mat-dialog-content>\n\n <!-- Actions \u2014 all buttons on one line -->\n <mat-dialog-actions class=\"ucd-actions\">\n <button mat-stroked-button class=\"ucd-btn ucd-stay\" (click)=\"cancel()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"/>\n </svg>\n <span>Stay on Page</span>\n </button>\n <button mat-stroked-button class=\"ucd-btn ucd-leave\" (click)=\"leave()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z\"/>\n </svg>\n <span>Leave Page</span>\n </button>\n @if (data.hasSaveCallback) {\n <button mat-flat-button class=\"ucd-btn ucd-save\" (click)=\"save()\">\n <svg class=\"ucd-btn-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z\"/>\n </svg>\n <span>Save &amp; Leave</span>\n </button>\n }\n </mat-dialog-actions>\n\n</div>\n", styles: ["@keyframes ucd-icon-bounce{0%{transform:scale(.55) rotate(-10deg);opacity:0}60%{transform:scale(1.12) rotate(4deg);opacity:1}80%{transform:scale(.93) rotate(-2deg)}to{transform:scale(1) rotate(0)}}@keyframes ucd-glow{0%,to{box-shadow:0 0 #f59e0b73,0 6px 20px #f59e0b1f}55%{box-shadow:0 0 0 14px #f59e0b00,0 6px 20px #f59e0b38}}.ucd-header{position:relative;background:linear-gradient(160deg,#fffbeb,#fef3c7 55%,#fde68a);padding:40px 20px 32px;display:flex;justify-content:center;align-items:center}.ucd-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(245,158,11,.4),transparent)}.ucd-close{position:absolute;top:10px;right:10px;width:30px!important;height:30px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important;color:#92400e;opacity:.5;transition:opacity .15s ease,transform .2s ease}.ucd-close ::ng-deep .mat-mdc-button-touch-target,.ucd-close ::ng-deep .mat-mdc-focus-indicator{display:none}.ucd-close svg{display:block;flex-shrink:0}.ucd-close:hover{opacity:1;transform:rotate(90deg)}.ucd-icon-ring{width:82px;height:82px;border-radius:50%;background:linear-gradient(145deg,#fef9e7,#fde68a);border:2px solid rgba(245,158,11,.55);display:flex;align-items:center;justify-content:center;animation:ucd-glow 2.6s ease-in-out infinite}.ucd-icon-svg{width:40px;height:40px;color:#d97706;display:block;animation:ucd-icon-bounce .55s cubic-bezier(.34,1.56,.64,1) .12s both}.ucd-body{text-align:center;padding:26px 36px 12px!important;max-height:unset!important;overflow:visible!important}.ucd-title{font-size:20px;font-weight:700;color:#111827;margin:0 0 8px;letter-spacing:-.25px;line-height:1.25}.ucd-subtitle{font-size:14px;color:#6b7280;margin:0;line-height:1.65}.ucd-actions{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important;justify-content:center!important;align-items:center!important;gap:10px;padding:18px 28px 28px!important;min-height:unset!important}.ucd-btn{height:40px!important;border-radius:10px!important;font-size:13.5px!important;font-weight:500!important;letter-spacing:.1px;padding:0 20px!important;white-space:nowrap;transition:transform .15s ease,box-shadow .15s ease,background .15s ease,border-color .15s ease!important}.ucd-btn ::ng-deep .mdc-button__label{display:flex;align-items:center;gap:7px;line-height:1}.ucd-btn:hover{transform:translateY(-2px)}.ucd-btn:active{transform:translateY(0) scale(.97)}.ucd-btn-icon{width:15px;height:15px;flex-shrink:0;display:block}.ucd-stay{border-color:#d1d5db!important;color:#374151!important}.ucd-stay:hover{border-color:#9ca3af!important;background:#f9fafb!important;box-shadow:0 3px 10px #00000012!important}.ucd-leave{border-color:#dc262666!important;color:#dc2626!important;background:#fef2f280!important}.ucd-leave:hover{border-color:#dc2626!important;background:#fef2f2!important;box-shadow:0 3px 12px #dc26262e!important}.ucd-save{background:linear-gradient(135deg,#2563eb,#4f46e5);color:#fff!important;border:none!important;box-shadow:0 2px 10px #4f46e54d!important}.ucd-save .ucd-btn-icon{color:#fff}.ucd-save:hover{background:linear-gradient(135deg,#1d4ed8,#4338ca);box-shadow:0 6px 20px #4f46e56b!important}\n"] }]
7335
7335
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
7336
7336
  type: Inject,
7337
7337
  args: [MAT_DIALOG_DATA]