carriera-intern 1.1.137 → 1.1.138
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.
- package/fesm2022/carriera-intern.mjs +565 -215
- package/fesm2022/carriera-intern.mjs.map +1 -1
- package/index.d.ts +114 -18
- package/package.json +1 -1
- package/src/styles/custompickers.scss +14 -0
|
@@ -180,6 +180,68 @@ const PDFJS_ASSET_BASE = new InjectionToken('PDFJS_ASSET_BASE', {
|
|
|
180
180
|
factory: () => '/assets/pdfjs/',
|
|
181
181
|
});
|
|
182
182
|
|
|
183
|
+
// Non-breaking space, so a grouped number never wraps across lines.
|
|
184
|
+
const NON_BREAKING_SPACE = ' ';
|
|
185
|
+
const NUMBER_FORMAT_SEPARATORS = {
|
|
186
|
+
DecimalPointCommaThousands: { thousands: ',', decimal: '.' },
|
|
187
|
+
DecimalCommaSpaceThousands: { thousands: NON_BREAKING_SPACE, decimal: ',' },
|
|
188
|
+
DecimalCommaPeriodThousands: { thousands: '.', decimal: ',' },
|
|
189
|
+
DecimalPointSpaceThousands: { thousands: NON_BREAKING_SPACE, decimal: '.' },
|
|
190
|
+
};
|
|
191
|
+
const DEFAULT_NUMBER_FORMAT = 'DecimalPointCommaThousands';
|
|
192
|
+
|
|
193
|
+
// Placeholders double as moment tokens, so a pattern joins into a moment format.
|
|
194
|
+
const DATE_PART_PLACEHOLDERS = {
|
|
195
|
+
month: 'MM',
|
|
196
|
+
day: 'DD',
|
|
197
|
+
year: 'YYYY',
|
|
198
|
+
shortYear: 'YY',
|
|
199
|
+
};
|
|
200
|
+
const DATE_FORMAT_PATTERNS = {
|
|
201
|
+
MmDdYyyy: { parts: ['month', 'day', 'year'], separator: '/' },
|
|
202
|
+
DdMmYyyy: { parts: ['day', 'month', 'year'], separator: '/' },
|
|
203
|
+
YyyyMmDd: { parts: ['year', 'month', 'day'], separator: '-' },
|
|
204
|
+
DdMmYyyyDot: { parts: ['day', 'month', 'year'], separator: '.' },
|
|
205
|
+
};
|
|
206
|
+
// Shown when no date format is set: the month-first date with a two digit year.
|
|
207
|
+
const DEFAULT_DATE_FORMAT_PATTERN = {
|
|
208
|
+
parts: ['month', 'day', 'shortYear'],
|
|
209
|
+
separator: '/',
|
|
210
|
+
};
|
|
211
|
+
const getDateFormatPattern = (dateFormat) => dateFormat ? DATE_FORMAT_PATTERNS[dateFormat] : DEFAULT_DATE_FORMAT_PATTERN;
|
|
212
|
+
|
|
213
|
+
// Moment formats of the time shown in the input.
|
|
214
|
+
const TIME_FORMAT_PATTERNS = {
|
|
215
|
+
TwelveHour: 'hh:mm A',
|
|
216
|
+
TwentyFourHour: 'HH:mm',
|
|
217
|
+
};
|
|
218
|
+
const DEFAULT_TIME_FORMAT = 'TwelveHour';
|
|
219
|
+
|
|
220
|
+
// National format, used when a phone input is not international.
|
|
221
|
+
const PHONE_MASK = '(000) 000-0000';
|
|
222
|
+
// Dial code prepended to a pasted number without a country code.
|
|
223
|
+
const DEFAULT_PHONE_DIAL_CODE = '1';
|
|
224
|
+
// Longest number allowed by E.164, country code included.
|
|
225
|
+
const PHONE_MAX_DIGITS = 15;
|
|
226
|
+
// Starter set. A dial code that is not listed gets the default format:
|
|
227
|
+
// country code, a space, then the national number in groups of three.
|
|
228
|
+
const PHONE_COUNTRIES = [
|
|
229
|
+
{ dialCode: '1', mask: '+0 (000) 000-0000' }, // US, Canada
|
|
230
|
+
{ dialCode: '44', mask: '+00 0000 000000' }, // United Kingdom
|
|
231
|
+
{ dialCode: '52', mask: '+00 00 0000 0000' }, // Mexico
|
|
232
|
+
{ dialCode: '381', mask: '+000 00 000 0000' }, // Serbia
|
|
233
|
+
];
|
|
234
|
+
// Dial codes are prefix-free: a number starting with 1 or 7 has a one-digit
|
|
235
|
+
// code, one starting with any of these has a two-digit code, and every other
|
|
236
|
+
// code is three digits. That is enough to split off a code that is not listed.
|
|
237
|
+
// prettier-ignore
|
|
238
|
+
const PHONE_TWO_DIGIT_DIAL_CODES = [
|
|
239
|
+
'20', '27', '30', '31', '32', '33', '34', '36', '39', '40', '41', '43',
|
|
240
|
+
'44', '45', '46', '47', '48', '49', '51', '52', '53', '54', '55', '56',
|
|
241
|
+
'57', '58', '60', '61', '62', '63', '64', '65', '66', '81', '82', '84',
|
|
242
|
+
'86', '90', '91', '92', '93', '94', '95', '98',
|
|
243
|
+
];
|
|
244
|
+
|
|
183
245
|
class DocumentThumbnailHelper {
|
|
184
246
|
static previewTargetWidth() {
|
|
185
247
|
const ratio = Math.min(globalThis.devicePixelRatio || 1, 2);
|
|
@@ -260,6 +322,22 @@ const DropdownTypes = [
|
|
|
260
322
|
'accident-truck',
|
|
261
323
|
'accident-trailer',
|
|
262
324
|
];
|
|
325
|
+
const NumberFormats = [
|
|
326
|
+
'DecimalPointCommaThousands', // 1,234.56
|
|
327
|
+
'DecimalCommaSpaceThousands', // 1 234,56
|
|
328
|
+
'DecimalCommaPeriodThousands', // 1.234,56
|
|
329
|
+
'DecimalPointSpaceThousands', // 1 234.56
|
|
330
|
+
];
|
|
331
|
+
const DateFormats = [
|
|
332
|
+
'MmDdYyyy', // 10/02/2026
|
|
333
|
+
'DdMmYyyy', // 02/10/2026
|
|
334
|
+
'YyyyMmDd', // 2026-10-02
|
|
335
|
+
'DdMmYyyyDot', // 02.10.2026
|
|
336
|
+
];
|
|
337
|
+
const TimeFormats = [
|
|
338
|
+
'TwelveHour', // 08:05 PM
|
|
339
|
+
'TwentyFourHour', // 20:05
|
|
340
|
+
];
|
|
263
341
|
const sizes = [
|
|
264
342
|
22, 26,
|
|
265
343
|
// 34 For later versions when applicant is done
|
|
@@ -633,23 +711,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
633
711
|
}] });
|
|
634
712
|
|
|
635
713
|
class NumberFormatPipe {
|
|
636
|
-
transform(value) {
|
|
714
|
+
transform(value, numberFormat = DEFAULT_NUMBER_FORMAT) {
|
|
637
715
|
if (!value)
|
|
638
716
|
return '';
|
|
717
|
+
const { thousands, decimal } = NUMBER_FORMAT_SEPARATORS[numberFormat];
|
|
639
718
|
if (value.includes('.')) {
|
|
640
719
|
const [integerPart, decimalPart] = value.split('.');
|
|
641
720
|
// Cap decimal places to maximum 2
|
|
642
721
|
const cappedDecimalPart = decimalPart ? decimalPart.substring(0, 2) : '';
|
|
643
|
-
// Format the integer part with
|
|
644
|
-
const formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g,
|
|
722
|
+
// Format the integer part with thousands separators
|
|
723
|
+
const formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, thousands);
|
|
645
724
|
// If there's a decimal part, show it (capped at 2 places)
|
|
646
725
|
if (decimalPart !== undefined) {
|
|
647
|
-
return `${formattedInteger}
|
|
726
|
+
return `${formattedInteger}${decimal}${cappedDecimalPart}`;
|
|
648
727
|
}
|
|
649
728
|
// If user just typed a decimal point, show it
|
|
650
|
-
return `${formattedInteger}
|
|
729
|
+
return `${formattedInteger}${decimal}`;
|
|
651
730
|
}
|
|
652
|
-
return value.replace(/\B(?=(\d{3})+(?!\d))/g,
|
|
731
|
+
return value.replace(/\B(?=(\d{3})+(?!\d))/g, thousands);
|
|
653
732
|
}
|
|
654
733
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: NumberFormatPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
655
734
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.33", ngImport: i0, type: NumberFormatPipe, isStandalone: true, name: "numberFormat" });
|
|
@@ -663,8 +742,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
663
742
|
|
|
664
743
|
class ErrorMessagePipe {
|
|
665
744
|
numberFormatPipe = new NumberFormatPipe();
|
|
666
|
-
transform(errors, customErrors // custom error messages to be displayed in the input
|
|
667
|
-
) {
|
|
745
|
+
transform(errors, customErrors, // custom error messages to be displayed in the input
|
|
746
|
+
numberFormat) {
|
|
668
747
|
if (!errors)
|
|
669
748
|
return [];
|
|
670
749
|
// Create a map of custom errors for quick lookup
|
|
@@ -678,8 +757,8 @@ class ErrorMessagePipe {
|
|
|
678
757
|
required: () => 'Required',
|
|
679
758
|
minlength: (value) => `${value.requiredLength} Characters Min`,
|
|
680
759
|
maxlength: (value) => `${value.requiredLength} Characters Max`,
|
|
681
|
-
min: (value) => `Min ${this.numberFormatPipe.transform(String(value.min))}`,
|
|
682
|
-
max: (value) => `Max ${this.numberFormatPipe.transform(String(value.max))}`,
|
|
760
|
+
min: (value) => `Min ${this.numberFormatPipe.transform(String(value.min), numberFormat)}`,
|
|
761
|
+
max: (value) => `Max ${this.numberFormatPipe.transform(String(value.max), numberFormat)}`,
|
|
683
762
|
hasUppercase: () => 'Must contain at least one uppercase letter',
|
|
684
763
|
hasNumber: () => 'Must contain at least one number',
|
|
685
764
|
hasSymbol: () => 'Must contain at least one symbol',
|
|
@@ -2141,6 +2220,78 @@ class MaskHelper {
|
|
|
2141
2220
|
}
|
|
2142
2221
|
}
|
|
2143
2222
|
|
|
2223
|
+
class PhoneHelper {
|
|
2224
|
+
static extractDigits(value) {
|
|
2225
|
+
return value.replace(/\D/g, '');
|
|
2226
|
+
}
|
|
2227
|
+
/**
|
|
2228
|
+
* Finds the country whose dial code the digits start with. Dial codes are
|
|
2229
|
+
* prefix-free, so at most one of the leading 1, 2 or 3 digits can match.
|
|
2230
|
+
*/
|
|
2231
|
+
static findCountry(digits, countries) {
|
|
2232
|
+
for (let length = 1; length <= 3; length++) {
|
|
2233
|
+
const dialCode = digits.slice(0, length);
|
|
2234
|
+
const country = countries.find((c) => c.dialCode === dialCode);
|
|
2235
|
+
if (country)
|
|
2236
|
+
return country;
|
|
2237
|
+
}
|
|
2238
|
+
return undefined;
|
|
2239
|
+
}
|
|
2240
|
+
/**
|
|
2241
|
+
* Length of the dial code the digits start with, for codes that are not
|
|
2242
|
+
* in the lookup table.
|
|
2243
|
+
*/
|
|
2244
|
+
static dialCodeLength(digits) {
|
|
2245
|
+
if (digits[0] === '1' || digits[0] === '7')
|
|
2246
|
+
return 1;
|
|
2247
|
+
return PHONE_TWO_DIGIT_DIAL_CODES.includes(digits.slice(0, 2)) ? 2 : 3;
|
|
2248
|
+
}
|
|
2249
|
+
/**
|
|
2250
|
+
* Picks the mask for the given digits.
|
|
2251
|
+
* @param digits The digits entered so far, country code included.
|
|
2252
|
+
* @param isInternational Whether the input takes a country code.
|
|
2253
|
+
* @param countries The dial code lookup table.
|
|
2254
|
+
* @returns The mask pattern to apply.
|
|
2255
|
+
*/
|
|
2256
|
+
static resolveMask(digits, isInternational, countries) {
|
|
2257
|
+
if (!isInternational)
|
|
2258
|
+
return PHONE_MASK;
|
|
2259
|
+
const country = this.findCountry(digits, countries);
|
|
2260
|
+
if (country)
|
|
2261
|
+
return country.mask;
|
|
2262
|
+
const dialCodeLength = this.dialCodeLength(digits);
|
|
2263
|
+
const national = '0'
|
|
2264
|
+
.repeat(PHONE_MAX_DIGITS - dialCodeLength)
|
|
2265
|
+
.match(/.{1,3}/g)
|
|
2266
|
+
.join(' ');
|
|
2267
|
+
return `+${'0'.repeat(dialCodeLength)} ${national}`;
|
|
2268
|
+
}
|
|
2269
|
+
/**
|
|
2270
|
+
* Prepares a pasted number for the mask. Typed input never needs this:
|
|
2271
|
+
* the mask supplies the `+`, so it is always international.
|
|
2272
|
+
* @param value The raw text, before the mask strips it.
|
|
2273
|
+
* @param isInternational Whether the input takes a country code.
|
|
2274
|
+
* @param defaultDialCode Dial code for a number that has none.
|
|
2275
|
+
* @returns The digits to format.
|
|
2276
|
+
*/
|
|
2277
|
+
static normalize(value, isInternational, defaultDialCode) {
|
|
2278
|
+
const raw = (value || '').trim();
|
|
2279
|
+
const digits = this.extractDigits(raw);
|
|
2280
|
+
if (!isInternational) {
|
|
2281
|
+
// A national number written with its country code, ex. +1 (202) 555-0123
|
|
2282
|
+
const hasDialCode = digits.startsWith(defaultDialCode) &&
|
|
2283
|
+
(raw.startsWith('+') || digits.length === defaultDialCode.length + 10);
|
|
2284
|
+
return hasDialCode ? digits.slice(defaultDialCode.length) : digits;
|
|
2285
|
+
}
|
|
2286
|
+
if (!digits || raw.startsWith('+'))
|
|
2287
|
+
return digits;
|
|
2288
|
+
if (raw.startsWith('00'))
|
|
2289
|
+
return digits.slice(2);
|
|
2290
|
+
// No country code: drop the trunk prefix and assume the default country
|
|
2291
|
+
return defaultDialCode + digits.replace(/^0+/, '');
|
|
2292
|
+
}
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2144
2295
|
class PasswordDirective {
|
|
2145
2296
|
el;
|
|
2146
2297
|
/**
|
|
@@ -2476,6 +2627,11 @@ class NumberFormatDirective {
|
|
|
2476
2627
|
disableDecimals = input(false, ...(ngDevMode ? [{ debugName: "disableDecimals" }] : []));
|
|
2477
2628
|
prefix = input('', ...(ngDevMode ? [{ debugName: "prefix" }] : []));
|
|
2478
2629
|
clampToMax = input(false, ...(ngDevMode ? [{ debugName: "clampToMax" }] : []));
|
|
2630
|
+
/**
|
|
2631
|
+
* Thousands and decimal separators used to display and parse the value.
|
|
2632
|
+
* The real value always keeps '.' as its decimal separator.
|
|
2633
|
+
*/
|
|
2634
|
+
numberFormat = input(...(ngDevMode ? [undefined, { debugName: "numberFormat" }] : []));
|
|
2479
2635
|
/**
|
|
2480
2636
|
* Stores the unformatted, "real" numeric value of the input.
|
|
2481
2637
|
* This is the value that should be used for calculations or form submissions,
|
|
@@ -2484,6 +2640,19 @@ class NumberFormatDirective {
|
|
|
2484
2640
|
realValue = '';
|
|
2485
2641
|
constructor(el) {
|
|
2486
2642
|
this.el = el;
|
|
2643
|
+
// Re-render the current value when the separators change
|
|
2644
|
+
effect(() => {
|
|
2645
|
+
this.numberFormat();
|
|
2646
|
+
if (this.appNumberFormat() && this.realValue !== '') {
|
|
2647
|
+
this.updateDisplayValue();
|
|
2648
|
+
}
|
|
2649
|
+
});
|
|
2650
|
+
}
|
|
2651
|
+
get resolvedNumberFormat() {
|
|
2652
|
+
return this.numberFormat() ?? DEFAULT_NUMBER_FORMAT;
|
|
2653
|
+
}
|
|
2654
|
+
get decimalSeparator() {
|
|
2655
|
+
return NUMBER_FORMAT_SEPARATORS[this.resolvedNumberFormat].decimal;
|
|
2487
2656
|
}
|
|
2488
2657
|
/**
|
|
2489
2658
|
* Lifecycle hook that is called after Angular has initialized all data-bound
|
|
@@ -2522,7 +2691,7 @@ class NumberFormatDirective {
|
|
|
2522
2691
|
const oldValue = input.value;
|
|
2523
2692
|
const oldRealValue = this.realValue;
|
|
2524
2693
|
const maxValue = this.max();
|
|
2525
|
-
this.realValue = this.
|
|
2694
|
+
this.realValue = this.extractDisplayedValue(oldValue);
|
|
2526
2695
|
if (maxValue !== undefined && maxValue !== null) {
|
|
2527
2696
|
const numericValue = Number(this.realValue);
|
|
2528
2697
|
if (!Number.isNaN(numericValue) && numericValue > maxValue) {
|
|
@@ -2561,11 +2730,11 @@ class NumberFormatDirective {
|
|
|
2561
2730
|
// If there's a selection
|
|
2562
2731
|
event.preventDefault(); // Prevent default cut
|
|
2563
2732
|
const cutText = input.value.slice(start, end);
|
|
2564
|
-
event.clipboardData?.setData('text', this.
|
|
2733
|
+
event.clipboardData?.setData('text', this.toClipboardValue(cutText)); // Put numeric part on clipboard
|
|
2565
2734
|
// Reconstruct value without the cut part
|
|
2566
2735
|
const oldValue = input.value;
|
|
2567
2736
|
const valueAfterCut = input.value.slice(0, start) + input.value.slice(end);
|
|
2568
|
-
this.realValue = this.
|
|
2737
|
+
this.realValue = this.extractDisplayedValue(valueAfterCut);
|
|
2569
2738
|
this.updateDisplayValue();
|
|
2570
2739
|
const newValue = input.value;
|
|
2571
2740
|
const newCursorPos = this.calculateCursorPosition(start, oldValue, newValue);
|
|
@@ -2591,7 +2760,7 @@ class NumberFormatDirective {
|
|
|
2591
2760
|
event.preventDefault(); // Prevent default copy
|
|
2592
2761
|
const selectedText = input.value.slice(start, end);
|
|
2593
2762
|
// Copy the underlying numeric value of the selection
|
|
2594
|
-
event.clipboardData?.setData('text', this.
|
|
2763
|
+
event.clipboardData?.setData('text', this.toClipboardValue(selectedText));
|
|
2595
2764
|
}
|
|
2596
2765
|
}
|
|
2597
2766
|
/**
|
|
@@ -2624,8 +2793,8 @@ class NumberFormatDirective {
|
|
|
2624
2793
|
event.altKey) {
|
|
2625
2794
|
return; // Don't prevent default for these
|
|
2626
2795
|
}
|
|
2627
|
-
// Allow a single decimal
|
|
2628
|
-
if (event.key ===
|
|
2796
|
+
// Allow a single decimal separator if not already present in the realValue
|
|
2797
|
+
if (event.key === this.decimalSeparator &&
|
|
2629
2798
|
!this.realValue.includes('.') &&
|
|
2630
2799
|
!this.disableDecimals()) {
|
|
2631
2800
|
// If the input is empty or realValue is empty, prepend '0' before the decimal
|
|
@@ -2650,7 +2819,7 @@ class NumberFormatDirective {
|
|
|
2650
2819
|
const afterSelection = currentValue.slice(end);
|
|
2651
2820
|
const simulatedValue = beforeSelection + event.key + afterSelection;
|
|
2652
2821
|
// Extract numeric value from simulated result
|
|
2653
|
-
const simulatedNumericValue = this.
|
|
2822
|
+
const simulatedNumericValue = this.extractDisplayedValue(simulatedValue);
|
|
2654
2823
|
const simulatedNumber = Number(simulatedNumericValue);
|
|
2655
2824
|
// Prevent if it would exceed max
|
|
2656
2825
|
if (!Number.isNaN(simulatedNumber) && simulatedNumber > maxValue) {
|
|
@@ -2692,6 +2861,32 @@ class NumberFormatDirective {
|
|
|
2692
2861
|
}
|
|
2693
2862
|
return cleanValue;
|
|
2694
2863
|
}
|
|
2864
|
+
/**
|
|
2865
|
+
* Extracts a clean numeric string from text shown in the input, where the
|
|
2866
|
+
* decimal separator is the one of the current number format.
|
|
2867
|
+
* @param value - The displayed text to clean.
|
|
2868
|
+
* @returns A string representing the extracted numeric value.
|
|
2869
|
+
*/
|
|
2870
|
+
extractDisplayedValue(value) {
|
|
2871
|
+
const decimal = this.decimalSeparator;
|
|
2872
|
+
if (decimal === '.')
|
|
2873
|
+
return this.extractNumericValue(value);
|
|
2874
|
+
const normalized = value
|
|
2875
|
+
.split('')
|
|
2876
|
+
.filter((char) => /\d/.test(char) || char === decimal)
|
|
2877
|
+
.join('')
|
|
2878
|
+
.split(decimal)
|
|
2879
|
+
.join('.');
|
|
2880
|
+
return this.extractNumericValue(normalized);
|
|
2881
|
+
}
|
|
2882
|
+
/**
|
|
2883
|
+
* Numeric part of a displayed selection for the clipboard: no thousands
|
|
2884
|
+
* separators or prefix, decimal separator of the current number format so
|
|
2885
|
+
* it can be pasted back.
|
|
2886
|
+
*/
|
|
2887
|
+
toClipboardValue(value) {
|
|
2888
|
+
return this.extractDisplayedValue(value).replace('.', this.decimalSeparator);
|
|
2889
|
+
}
|
|
2695
2890
|
/**
|
|
2696
2891
|
* Updates the input element's display value with the formatted version
|
|
2697
2892
|
* of the current `realValue`.
|
|
@@ -2705,6 +2900,7 @@ class NumberFormatDirective {
|
|
|
2705
2900
|
return;
|
|
2706
2901
|
}
|
|
2707
2902
|
let [integerPart, decimalPart] = this.realValue.split('.');
|
|
2903
|
+
const decimal = this.decimalSeparator;
|
|
2708
2904
|
if (integerPart.length > 1) {
|
|
2709
2905
|
integerPart = integerPart.replace(/^0+/, '') || '0';
|
|
2710
2906
|
}
|
|
@@ -2713,20 +2909,20 @@ class NumberFormatDirective {
|
|
|
2713
2909
|
formattedValue = integerPart;
|
|
2714
2910
|
// Still add decimal part if it exists and formatting is not disabled
|
|
2715
2911
|
if (this.realValue.endsWith('.')) {
|
|
2716
|
-
formattedValue = formattedValue +
|
|
2912
|
+
formattedValue = formattedValue + decimal;
|
|
2717
2913
|
}
|
|
2718
2914
|
else if (decimalPart !== undefined) {
|
|
2719
|
-
formattedValue = formattedValue +
|
|
2915
|
+
formattedValue = formattedValue + decimal + decimalPart;
|
|
2720
2916
|
}
|
|
2721
2917
|
}
|
|
2722
2918
|
else {
|
|
2723
2919
|
// Use full formatting with NumberFormatPipe
|
|
2724
|
-
const formattedInteger = new NumberFormatPipe().transform(integerPart);
|
|
2920
|
+
const formattedInteger = new NumberFormatPipe().transform(integerPart, this.resolvedNumberFormat);
|
|
2725
2921
|
if (this.realValue.endsWith('.')) {
|
|
2726
|
-
formattedValue = formattedInteger +
|
|
2922
|
+
formattedValue = formattedInteger + decimal;
|
|
2727
2923
|
}
|
|
2728
2924
|
else if (decimalPart !== undefined) {
|
|
2729
|
-
formattedValue = formattedInteger +
|
|
2925
|
+
formattedValue = formattedInteger + decimal + decimalPart;
|
|
2730
2926
|
}
|
|
2731
2927
|
else {
|
|
2732
2928
|
formattedValue = formattedInteger;
|
|
@@ -2769,12 +2965,15 @@ class NumberFormatDirective {
|
|
|
2769
2965
|
adjustedOldCursorPos = 0;
|
|
2770
2966
|
// Count digits before cursor in old value (excluding prefix)
|
|
2771
2967
|
const beforeCursor = oldValueWithoutPrefix.substring(0, adjustedOldCursorPos);
|
|
2772
|
-
const
|
|
2968
|
+
const decimal = this.decimalSeparator;
|
|
2969
|
+
const isSignificant = (char) => /\d/.test(char) || char === decimal;
|
|
2970
|
+
const digitsBeforeCursor = beforeCursor.split('').filter(isSignificant)
|
|
2971
|
+
.length;
|
|
2773
2972
|
// Find position in new value where we have the same number of digits
|
|
2774
2973
|
let digitCount = 0;
|
|
2775
2974
|
let newCursorPos = prefixLength;
|
|
2776
2975
|
for (let i = 0; i < newValueWithoutPrefix.length; i++) {
|
|
2777
|
-
if (
|
|
2976
|
+
if (isSignificant(newValueWithoutPrefix[i])) {
|
|
2778
2977
|
digitCount++;
|
|
2779
2978
|
if (digitCount >= digitsBeforeCursor) {
|
|
2780
2979
|
newCursorPos = prefixLength + i + 1;
|
|
@@ -2825,7 +3024,7 @@ class NumberFormatDirective {
|
|
|
2825
3024
|
this.updateDisplayValue();
|
|
2826
3025
|
}
|
|
2827
3026
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: NumberFormatDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
2828
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.33", type: NumberFormatDirective, isStandalone: true, selector: "[appNumberFormat]", inputs: { appNumberFormat: { classPropertyName: "appNumberFormat", publicName: "appNumberFormat", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, isNumberFormattingDisabled: { classPropertyName: "isNumberFormattingDisabled", publicName: "isNumberFormattingDisabled", isSignal: true, isRequired: false, transformFunction: null }, disableDecimals: { classPropertyName: "disableDecimals", publicName: "disableDecimals", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, clampToMax: { classPropertyName: "clampToMax", publicName: "clampToMax", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput($event)", "cut": "onCut($event)", "copy": "onCopy($event)", "keydown": "onKeydown($event)" } }, providers: [NumberFormatPipe], ngImport: i0 });
|
|
3027
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.33", type: NumberFormatDirective, isStandalone: true, selector: "[appNumberFormat]", inputs: { appNumberFormat: { classPropertyName: "appNumberFormat", publicName: "appNumberFormat", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, isNumberFormattingDisabled: { classPropertyName: "isNumberFormattingDisabled", publicName: "isNumberFormattingDisabled", isSignal: true, isRequired: false, transformFunction: null }, disableDecimals: { classPropertyName: "disableDecimals", publicName: "disableDecimals", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, clampToMax: { classPropertyName: "clampToMax", publicName: "clampToMax", isSignal: true, isRequired: false, transformFunction: null }, numberFormat: { classPropertyName: "numberFormat", publicName: "numberFormat", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput($event)", "cut": "onCut($event)", "copy": "onCopy($event)", "keydown": "onKeydown($event)" } }, providers: [NumberFormatPipe], ngImport: i0 });
|
|
2829
3028
|
}
|
|
2830
3029
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: NumberFormatDirective, decorators: [{
|
|
2831
3030
|
type: Directive,
|
|
@@ -2833,7 +3032,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
2833
3032
|
selector: '[appNumberFormat]',
|
|
2834
3033
|
providers: [NumberFormatPipe],
|
|
2835
3034
|
}]
|
|
2836
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { appNumberFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "appNumberFormat", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], isNumberFormattingDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isNumberFormattingDisabled", required: false }] }], disableDecimals: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableDecimals", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], clampToMax: [{ type: i0.Input, args: [{ isSignal: true, alias: "clampToMax", required: false }] }], onInput: [{
|
|
3035
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { appNumberFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "appNumberFormat", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], isNumberFormattingDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isNumberFormattingDisabled", required: false }] }], disableDecimals: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableDecimals", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], clampToMax: [{ type: i0.Input, args: [{ isSignal: true, alias: "clampToMax", required: false }] }], numberFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberFormat", required: false }] }], onInput: [{
|
|
2837
3036
|
type: HostListener,
|
|
2838
3037
|
args: ['input', ['$event']]
|
|
2839
3038
|
}], onCut: [{
|
|
@@ -2860,11 +3059,29 @@ class MaskDirective {
|
|
|
2860
3059
|
appMask = input('', ...(ngDevMode ? [{ debugName: "appMask" }] : []));
|
|
2861
3060
|
reveal = input(0, ...(ngDevMode ? [{ debugName: "reveal" }] : []));
|
|
2862
3061
|
hide = input(0, ...(ngDevMode ? [{ debugName: "hide" }] : []));
|
|
3062
|
+
/**
|
|
3063
|
+
* Whether the input is a phone number. The mask is then picked from the
|
|
3064
|
+
* digits entered instead of `appMask`.
|
|
3065
|
+
*/
|
|
3066
|
+
phone = input(false, ...(ngDevMode ? [{ debugName: "phone" }] : []));
|
|
3067
|
+
/**
|
|
3068
|
+
* Whether a phone input takes a country code and is formatted by country.
|
|
3069
|
+
* Otherwise it is a national number, ex. (000) 000-0000.
|
|
3070
|
+
*/
|
|
3071
|
+
isInternational = input(false, ...(ngDevMode ? [{ debugName: "isInternational" }] : []));
|
|
3072
|
+
phoneCountries = input(undefined, ...(ngDevMode ? [{ debugName: "phoneCountries" }] : []));
|
|
3073
|
+
defaultDialCode = input(undefined, ...(ngDevMode ? [{ debugName: "defaultDialCode" }] : []));
|
|
2863
3074
|
/**
|
|
2864
3075
|
* Stores the unmasked, "real" value of the input, containing only
|
|
2865
3076
|
* the characters entered by the user that fit the mask placeholders.
|
|
2866
3077
|
*/
|
|
2867
3078
|
realValue = '';
|
|
3079
|
+
/**
|
|
3080
|
+
* Text of a paste that replaces the whole phone value, kept until the
|
|
3081
|
+
* 'input' event that follows so its country code can be read before the
|
|
3082
|
+
* mask strips it.
|
|
3083
|
+
*/
|
|
3084
|
+
pastedPhone = null;
|
|
2868
3085
|
constructor(el) {
|
|
2869
3086
|
this.el = el;
|
|
2870
3087
|
}
|
|
@@ -2875,8 +3092,23 @@ class MaskDirective {
|
|
|
2875
3092
|
isHandledByPassword() {
|
|
2876
3093
|
return this.reveal() !== 0 || this.hide() !== 0;
|
|
2877
3094
|
}
|
|
3095
|
+
isMasked() {
|
|
3096
|
+
return !!this.appMask() || this.phone();
|
|
3097
|
+
}
|
|
3098
|
+
/**
|
|
3099
|
+
* The mask for the given user input. Phone inputs resolve it from the
|
|
3100
|
+
* digits, so the format follows the country code as it is entered.
|
|
3101
|
+
*/
|
|
3102
|
+
resolveMask(realValue) {
|
|
3103
|
+
if (!this.phone())
|
|
3104
|
+
return this.appMask();
|
|
3105
|
+
return PhoneHelper.resolveMask(realValue, this.isInternational(), this.phoneCountries() ?? PHONE_COUNTRIES);
|
|
3106
|
+
}
|
|
3107
|
+
normalizePhone(value) {
|
|
3108
|
+
return PhoneHelper.normalize(value, this.isInternational(), this.defaultDialCode() ?? DEFAULT_PHONE_DIAL_CODE);
|
|
3109
|
+
}
|
|
2878
3110
|
ngOnInit() {
|
|
2879
|
-
if (this.
|
|
3111
|
+
if (this.isMasked() && this.el.nativeElement.value) {
|
|
2880
3112
|
this.formatValue(this.el.nativeElement.value);
|
|
2881
3113
|
this.setCursorToEnd();
|
|
2882
3114
|
}
|
|
@@ -2886,9 +3118,15 @@ class MaskDirective {
|
|
|
2886
3118
|
* formatting the value as the user types or pastes.
|
|
2887
3119
|
*/
|
|
2888
3120
|
onInput(event) {
|
|
2889
|
-
if (!this.
|
|
3121
|
+
if (!this.isMasked() || this.isHandledByPassword())
|
|
2890
3122
|
return;
|
|
2891
3123
|
const input = this.el.nativeElement;
|
|
3124
|
+
if (this.pastedPhone !== null) {
|
|
3125
|
+
this.formatValue(this.normalizePhone(this.pastedPhone));
|
|
3126
|
+
this.pastedPhone = null;
|
|
3127
|
+
this.setCursorToEnd();
|
|
3128
|
+
return;
|
|
3129
|
+
}
|
|
2892
3130
|
const cursorPosition = input.selectionStart || 0;
|
|
2893
3131
|
const oldValue = input.value;
|
|
2894
3132
|
this.formatValue(input.value);
|
|
@@ -2901,8 +3139,18 @@ class MaskDirective {
|
|
|
2901
3139
|
* cleans it, and integrates it into the masked value.
|
|
2902
3140
|
*/
|
|
2903
3141
|
onPaste(event) {
|
|
2904
|
-
if (!this.
|
|
3142
|
+
if (!this.isMasked())
|
|
2905
3143
|
return;
|
|
3144
|
+
if (this.phone()) {
|
|
3145
|
+
const input = this.el.nativeElement;
|
|
3146
|
+
const replacesValue = (input.selectionStart || 0) === 0 &&
|
|
3147
|
+
(input.selectionEnd || 0) === input.value.length;
|
|
3148
|
+
if (replacesValue) {
|
|
3149
|
+
this.pastedPhone = event.clipboardData?.getData('text') ?? null;
|
|
3150
|
+
// Dropped if the paste is cancelled and no 'input' event follows
|
|
3151
|
+
setTimeout(() => (this.pastedPhone = null));
|
|
3152
|
+
}
|
|
3153
|
+
}
|
|
2906
3154
|
//event.preventDefault();
|
|
2907
3155
|
//const pastedData = event.clipboardData?.getData('text') || '';
|
|
2908
3156
|
//this.formatValue(this.realValue + pastedData);
|
|
@@ -2913,7 +3161,7 @@ class MaskDirective {
|
|
|
2913
3161
|
* from the input copies the unmasked, "real" value.
|
|
2914
3162
|
*/
|
|
2915
3163
|
onCopy(event) {
|
|
2916
|
-
if (!this.
|
|
3164
|
+
if (!this.isMasked() || this.isHandledByPassword())
|
|
2917
3165
|
return;
|
|
2918
3166
|
const selection = this.el.nativeElement.value.substring(this.el.nativeElement.selectionStart || 0, this.el.nativeElement.selectionEnd || 0);
|
|
2919
3167
|
if (selection) {
|
|
@@ -2928,7 +3176,7 @@ class MaskDirective {
|
|
|
2928
3176
|
* the corresponding part from the real value and reformats the input.
|
|
2929
3177
|
*/
|
|
2930
3178
|
onCut(event) {
|
|
2931
|
-
if (!this.
|
|
3179
|
+
if (!this.isMasked() || this.isHandledByPassword())
|
|
2932
3180
|
return;
|
|
2933
3181
|
const input = this.el.nativeElement;
|
|
2934
3182
|
const start = input.selectionStart || 0;
|
|
@@ -2953,8 +3201,7 @@ class MaskDirective {
|
|
|
2953
3201
|
* the mask pattern, preventing invalid characters from being entered.
|
|
2954
3202
|
*/
|
|
2955
3203
|
onKeydown(event) {
|
|
2956
|
-
|
|
2957
|
-
if (!mask)
|
|
3204
|
+
if (!this.isMasked())
|
|
2958
3205
|
return;
|
|
2959
3206
|
const controlKeys = [
|
|
2960
3207
|
'Backspace',
|
|
@@ -2970,6 +3217,8 @@ class MaskDirective {
|
|
|
2970
3217
|
if (controlKeys.includes(event.key) || event.metaKey || event.ctrlKey) {
|
|
2971
3218
|
return;
|
|
2972
3219
|
}
|
|
3220
|
+
// A phone mask can change with the digit being typed
|
|
3221
|
+
const mask = this.resolveMask(/^\d$/.test(event.key) ? this.realValue + event.key : this.realValue);
|
|
2973
3222
|
const placeholders = mask.replace(/[^0a*]/g, '');
|
|
2974
3223
|
const selectionStart = this.el.nativeElement.selectionStart || 0;
|
|
2975
3224
|
const selectionEnd = this.el.nativeElement.selectionEnd || 0;
|
|
@@ -3002,10 +3251,12 @@ class MaskDirective {
|
|
|
3002
3251
|
* @param value The current value from the input field.
|
|
3003
3252
|
*/
|
|
3004
3253
|
formatValue(value) {
|
|
3005
|
-
|
|
3006
|
-
if (!mask)
|
|
3254
|
+
if (!this.isMasked())
|
|
3007
3255
|
return;
|
|
3008
|
-
const extractedValue =
|
|
3256
|
+
const extractedValue = this.phone()
|
|
3257
|
+
? PhoneHelper.extractDigits(value)
|
|
3258
|
+
: MaskHelper.extractUserInput(value);
|
|
3259
|
+
const mask = this.resolveMask(extractedValue);
|
|
3009
3260
|
const { formattedValue, finalRealValue } = MaskHelper.applyMask(extractedValue, mask);
|
|
3010
3261
|
this.realValue = finalRealValue;
|
|
3011
3262
|
this.el.nativeElement.value = formattedValue;
|
|
@@ -3066,7 +3317,7 @@ class MaskDirective {
|
|
|
3066
3317
|
* @param value The new value to set.
|
|
3067
3318
|
*/
|
|
3068
3319
|
setRealValue(value) {
|
|
3069
|
-
if (this.
|
|
3320
|
+
if (this.isMasked()) {
|
|
3070
3321
|
this.formatValue(value || '');
|
|
3071
3322
|
this.setCursorToEnd();
|
|
3072
3323
|
}
|
|
@@ -3075,14 +3326,14 @@ class MaskDirective {
|
|
|
3075
3326
|
}
|
|
3076
3327
|
}
|
|
3077
3328
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: MaskDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
3078
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.33", type: MaskDirective, isStandalone: true, selector: "[appMask]", inputs: { appMask: { classPropertyName: "appMask", publicName: "appMask", isSignal: true, isRequired: false, transformFunction: null }, reveal: { classPropertyName: "reveal", publicName: "reveal", isSignal: true, isRequired: false, transformFunction: null }, hide: { classPropertyName: "hide", publicName: "hide", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput($event)", "paste": "onPaste($event)", "copy": "onCopy($event)", "cut": "onCut($event)", "keydown": "onKeydown($event)" } }, ngImport: i0 });
|
|
3329
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.33", type: MaskDirective, isStandalone: true, selector: "[appMask]", inputs: { appMask: { classPropertyName: "appMask", publicName: "appMask", isSignal: true, isRequired: false, transformFunction: null }, reveal: { classPropertyName: "reveal", publicName: "reveal", isSignal: true, isRequired: false, transformFunction: null }, hide: { classPropertyName: "hide", publicName: "hide", isSignal: true, isRequired: false, transformFunction: null }, phone: { classPropertyName: "phone", publicName: "phone", isSignal: true, isRequired: false, transformFunction: null }, isInternational: { classPropertyName: "isInternational", publicName: "isInternational", isSignal: true, isRequired: false, transformFunction: null }, phoneCountries: { classPropertyName: "phoneCountries", publicName: "phoneCountries", isSignal: true, isRequired: false, transformFunction: null }, defaultDialCode: { classPropertyName: "defaultDialCode", publicName: "defaultDialCode", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput($event)", "paste": "onPaste($event)", "copy": "onCopy($event)", "cut": "onCut($event)", "keydown": "onKeydown($event)" } }, ngImport: i0 });
|
|
3079
3330
|
}
|
|
3080
3331
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: MaskDirective, decorators: [{
|
|
3081
3332
|
type: Directive,
|
|
3082
3333
|
args: [{
|
|
3083
3334
|
selector: '[appMask]',
|
|
3084
3335
|
}]
|
|
3085
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { appMask: [{ type: i0.Input, args: [{ isSignal: true, alias: "appMask", required: false }] }], reveal: [{ type: i0.Input, args: [{ isSignal: true, alias: "reveal", required: false }] }], hide: [{ type: i0.Input, args: [{ isSignal: true, alias: "hide", required: false }] }], onInput: [{
|
|
3336
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { appMask: [{ type: i0.Input, args: [{ isSignal: true, alias: "appMask", required: false }] }], reveal: [{ type: i0.Input, args: [{ isSignal: true, alias: "reveal", required: false }] }], hide: [{ type: i0.Input, args: [{ isSignal: true, alias: "hide", required: false }] }], phone: [{ type: i0.Input, args: [{ isSignal: true, alias: "phone", required: false }] }], isInternational: [{ type: i0.Input, args: [{ isSignal: true, alias: "isInternational", required: false }] }], phoneCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "phoneCountries", required: false }] }], defaultDialCode: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultDialCode", required: false }] }], onInput: [{
|
|
3086
3337
|
type: HostListener,
|
|
3087
3338
|
args: ['input', ['$event']]
|
|
3088
3339
|
}], onPaste: [{
|
|
@@ -3821,7 +4072,8 @@ class InputComponent {
|
|
|
3821
4072
|
onRealValueChange(event) {
|
|
3822
4073
|
this.value.set(event.detail);
|
|
3823
4074
|
this.searchValue.set(event.detail);
|
|
3824
|
-
|
|
4075
|
+
// An empty number input stays empty (null) instead of becoming 0
|
|
4076
|
+
if (this.config().type === 'number' && event.detail !== '') {
|
|
3825
4077
|
this.dispatchOnChange(Number(event.detail));
|
|
3826
4078
|
return;
|
|
3827
4079
|
}
|
|
@@ -3996,7 +4248,8 @@ class InputComponent {
|
|
|
3996
4248
|
if (!this.inputRef || !this.inputRef.nativeElement) {
|
|
3997
4249
|
return;
|
|
3998
4250
|
}
|
|
3999
|
-
let type = !!this.config().mask
|
|
4251
|
+
let type = (!!this.config().mask || this.config().type === 'phone') &&
|
|
4252
|
+
!this.isPartiallyMasked()
|
|
4000
4253
|
? 'masked'
|
|
4001
4254
|
: this.config().type;
|
|
4002
4255
|
if ((type === 'password' || type === 'account') &&
|
|
@@ -4543,9 +4796,9 @@ class InputComponent {
|
|
|
4543
4796
|
}
|
|
4544
4797
|
}
|
|
4545
4798
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: InputComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
4546
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: InputComponent, isStandalone: true, selector: "cai-input", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, preselectedOptions: { classPropertyName: "preselectedOptions", publicName: "preselectedOptions", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, hideValidation: { classPropertyName: "hideValidation", publicName: "hideValidation", isSignal: true, isRequired: false, transformFunction: null }, showNoResults: { classPropertyName: "showNoResults", publicName: "showNoResults", isSignal: true, isRequired: false, transformFunction: null }, preselectedUnit: { classPropertyName: "preselectedUnit", publicName: "preselectedUnit", isSignal: true, isRequired: false, transformFunction: null }, unassignedCount: { classPropertyName: "unassignedCount", publicName: "unassignedCount", isSignal: true, isRequired: false, transformFunction: null }, forceInvalidStyling: { classPropertyName: "forceInvalidStyling", publicName: "forceInvalidStyling", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onBlur: "onBlur", onFocused: "onFocused", onReset: "onReset", onValueChange: "onValueChange", onOptionAdded: "onOptionAdded", onAdd: "onAdd", onSelectionChange: "onSelectionChange", onSelectedObject: "onSelectedObject", onSelectedGroup: "onSelectedGroup", onClear: "onClear", onAutofill: "onAutofill", onScrolledToBottom: "onScrolledToBottom", onScrolledToBottomGroup: "onScrolledToBottomGroup", onSearch: "onSearch", onValueAdded: "onValueAdded", onRemove: "onRemove", onHoverRemove: "onHoverRemove" }, host: { listeners: { "realValueChange": "onRealValueChange($event)" } }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "closeTooltip", first: true, predicate: ["closeTooltip"], descendants: true }, { propertyName: "PasswordDirective", first: true, predicate: PasswordDirective, descendants: true }, { propertyName: "NumberFormatDirective", first: true, predicate: NumberFormatDirective, descendants: true }, { propertyName: "MaskDirective", first: true, predicate: MaskDirective, descendants: true }], ngImport: i0, template: "<!-- #region Variables -->\n@let valid =\n ngControl?.valid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let invalid =\n ngControl?.invalid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let subcontent =\n config().subcontent ||\n (config().dropdown === \"subcontent\" &&\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![config().optionLabel || \"label\"]);\n\n@let name = config().name;\n@let password = config().type === \"password\" || config().type === \"account\";\n\n@let optionLabel = this.config().optionLabel || \"label\";\n@let dropdownType = this.config().dropdown;\n\n@let focusedOptionIndex = keyboardNavigationState().singleIndex;\n@let groupedNavigationState = keyboardNavigationState().groupedNavigationState;\n\n@let tooltipClass =\n config().inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n<!-- #region Multiple selection -->\n@if (config().dropdown === \"multiple\" && !!multipleSelectedOptions().length) {\n <div\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"toggleHovered(true)\"\n (mouseleave)=\"toggleHovered(false)\"\n class=\"multiple-container\"\n [class]=\"{\n focused: focused(),\n hovered: hovered(),\n }\"\n >\n <label class=\"multiple-label\">{{ name }}</label>\n\n @for (option of multipleSelectedOptions(); track $index) {\n <div class=\"multiple-selected\">\n <p>{{ cast(option, \"dropdownOption\")![optionLabel || \"label\"] }}</p>\n <button\n type=\"button\"\n class=\"\"\n (pointerdown)=\"handleOption(option, $event)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Clear\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n [container]=\"'body'\"\n >\n <svg-icon\n name=\"cai-cancel\"\n class=\"multiple-remove-button multiple-remove-icon bg-icon\"\n ></svg-icon>\n </button>\n </div>\n }\n </div>\n}\n<!-- #endregion -->\n\n@let hasFloatingError =\n invalid &&\n (config().errorBehavior === \"floating\" ||\n (!!config().inTable && config().placeholderBehavior !== \"static\"));\n\n<div\n class=\"app-input-container\"\n [class]=\"\n {\n config: config(),\n hideValidation: hideValidation(),\n isPasswordVisible: visible(),\n isInvalid: !!invalid || forceInvalidStyling(),\n isValid: !!valid && !forceInvalidStyling(),\n isHovered: hovered(),\n hasText: hasText(),\n isAdding: isAdding(),\n selectedOption: selectedOption(),\n } | inputClass\n \"\n ngbDropdown\n [autoClose]=\"false\"\n #dropdown=\"ngbDropdown\"\n dropdownClass=\"cai-dropdown\"\n #containerRef\n [ngbTooltip]=\"errorTooltip\"\n [disableTooltip]=\"!hasFloatingError\"\n [container]=\"'body'\"\n [placement]=\"['bottom', 'top']\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip \"\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"dropdownType === 'multiple' && toggleHovered(true)\"\n (mouseleave)=\"dropdownType === 'multiple' && toggleHovered(false)\"\n>\n @if (config().icon && !password && !config().withButtons) {\n <div\n class=\"icon-container\"\n (pointerdown)=\"focus($event)\"\n [class]=\"{\n 'colored-icon': config().iconColor,\n }\"\n [style.--icon-color]=\"config().iconColor || ''\"\n >\n <svg-icon class=\"icon\" [name]=\"config().icon || ''\"></svg-icon>\n @if (!config().noSeparator) {\n <div class=\"separator\"></div>\n }\n </div>\n }\n @if (password) {\n <div class=\"icon-container\" (pointerdown)=\"toggleVisibility($event)\">\n <div\n class=\"password-icons\"\n [ngbTooltip]=\"passwordTooltip\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [placement]=\"'top'\"\n [openDelay]=\"600\"\n >\n <svg-icon\n class=\"icon password-key hover-icon\"\n name=\"cai-password-key\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-shown hover-icon\"\n name=\"cai-password-shown\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-hidden hover-icon\"\n name=\"cai-password-hidden\"\n ></svg-icon>\n </div>\n <div class=\"separator\"></div>\n </div>\n }\n\n <input\n class=\"app-input\"\n [tabindex]=\"isDisabled() ? '-1' : '0'\"\n [type]=\"\n password && !isPartiallyMasked()\n ? visible()\n ? 'text'\n : 'password'\n : 'text'\n \"\n [required]=\"config().required\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (blur)=\"dispatchOnBlur()\"\n [id]=\"id()\"\n [attr.aria-label]=\"config().label\"\n [attr.name]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n [placeholder]=\"config()?.placeholder || ''\"\n [autocomplete]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n #inputRef\n [appPassword]=\"password\"\n [appMask]=\"config().mask || ''\"\n [appNumberRangeList]=\"config().numberRangeList || false\"\n [reveal]=\"config().reveal || 0\"\n [hide]=\"config().hide || 0\"\n [account]=\"config().type === 'account'\"\n [visible]=\"visible()\"\n [appNumberFormat]=\"config().type === 'number'\"\n [isNumberFormattingDisabled]=\"config().isNumberFormattingDisabled || false\"\n [disableDecimals]=\"config().disableDecimals || false\"\n [prefix]=\"config().prefix || ''\"\n [max]=\"config().max\"\n [clampToMax]=\"config().clampToMax || false\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus($event)\"\n />\n @if (\n !(dropdownType === \"multiple\" && !!multipleSelectedOptions().length) &&\n config().placeholderBehavior !== \"hidden\"\n ) {\n <label\n class=\"app-input-label\"\n [class.placeholder-color]=\"this.config().placeholderColor\"\n [style.--placeholder-color]=\"this.config().placeholderColor || ''\"\n (click)=\"focus($event)\"\n >\n <!-- Truck Trailer Driver Dropdown label -->\n @if (dropdownType === \"dispatch\" || dropdownType === \"ftl-dispatch\") {\n <p class=\"truck-item app-input-name\">Truck</p>\n <p class=\"trailer-item\">Trailer</p>\n <p>Driver</p>\n <p class=\"sub-label\">Rate</p>\n }\n <!-- Split Load -->\n @else if (dropdownType === \"split-driver\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Rate</p>\n } @else if (\n dropdownType === \"split-truck\" || dropdownType === \"split-trailer\"\n ) {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Location</p>\n }\n <!-- Dropdown variants -->\n @else if (dropdownType === \"broker\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Credit</p>\n } @else if (dropdownType === \"contact\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Phone</p>\n } @else if (dropdownType === \"shipper\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Address</p>\n } @else if (dropdownType === \"owner\") {\n <p class=\"owner-ein app-input-name\">EIN</p>\n <p class=\"app-input-name\">Company Name</p>\n } @else if (dropdownType === \"fuelcard\") {\n <p class=\"fuelcard-number app-input-name\">Card No.</p>\n <p class=\"fuelcard-brand app-input-name\">Provider</p>\n <p class=\"app-input-name\">Nickname</p>\n }\n <!-- Accident -->\n @else if (dropdownType === \"accident-driver\") {\n <p class=\"accident-name app-input-name\">{{ name }}</p>\n <p class=\"accident-dob app-input-name\">DOB</p>\n <p class=\"accident-cdl-number app-input-name\">CDL No.</p>\n <p class=\"accident-state app-input-name\">CDL State</p>\n } @else if (\n dropdownType === \"accident-truck\" || dropdownType === \"accident-trailer\"\n ) {\n <p class=\"accident-unit app-input-name\">{{ name }}</p>\n <p class=\"accident-vin app-input-name\">VIN</p>\n <p class=\"accident-plate app-input-name\">Lic. Plate No.</p>\n <p class=\"accident-state app-input-name\">Lic. State</p>\n }\n <!-- Default Dropdown label -->\n @else {\n <span class=\"app-input-name\">{{ name }}</span>\n }\n </label>\n }\n @if (config().type === \"number\" && config().withButtons) {\n <div class=\"number-container\">\n <div class=\"number-buttons\">\n <div class=\"separator\"></div>\n <div\n class=\"plus-button-container\"\n ngbTooltip=\"Add\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n (pointerdown)=\"increment($event)\"\n >\n <svg-icon name=\"cai-plus\" class=\"bg-icon plus-icon\"></svg-icon>\n </div>\n <div\n class=\"minus-button-container\"\n ngbTooltip=\"Remove\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n (pointerdown)=\"decrement($event)\"\n >\n <svg-icon name=\"cai-minus\" class=\"bg-icon minus-icon\"></svg-icon>\n </div>\n </div>\n </div>\n }\n @if (!config().inTable) {\n @if (!dropdownType) {\n <svg-icon\n name=\"cai-checkmark\"\n class=\"app-input-icon positive-icon\"\n ></svg-icon>\n <svg-icon\n name=\"cai-status-warning\"\n class=\"app-input-icon warning-icon\"\n ></svg-icon>\n }\n }\n\n @if (\n invalid &&\n config().errorBehavior !== \"hidden\" &&\n (ngControl?.errors | errorMessage: config().customErrors)[0] &&\n !(config().inTable && config().placeholderBehavior !== \"static\")\n ) {\n <div class=\"app-input-error\">\n {{ (ngControl?.errors | errorMessage: config().customErrors)[0] }}\n </div>\n }\n\n <!-- Accept button -->\n @if ((config().add && isAdding()) || config().isEdit) {\n <button\n type=\"button\"\n class=\"app-input-icon button-icon accept-button\"\n (pointerdown)=\"addOption()\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Confirm\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n >\n <svg-icon class=\"bg-icon\" name=\"cai-checkmark\"></svg-icon>\n </button>\n }\n\n <!-- Cancel button -->\n <button\n type=\"button\"\n class=\"app-input-icon button-icon cancel-button\"\n (pointerdown)=\"reset($event)\"\n (mouseenter)=\"onClearHover(true)\"\n (mouseleave)=\"onClearHover(false)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"{{\n hasText()\n | clearTooltip\n : isAdding()\n : config().isEdit || false\n : config().placeholderBehavior || 'dynamic'\n : dropdownType === 'multiple'\n : config().hasResetButton\n : canTooltipBeVisible()\n }}\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n >\n @let iconName =\n config().hasResetButton\n ? \"cai-reset\"\n : config().removable\n ? \"cai-delete\"\n : \"cai-cancel\";\n <svg-icon class=\"bg-icon\" [name]=\"iconName\"></svg-icon>\n </button>\n\n <div class=\"dropdown-anchor\" ngbDropdownAnchor></div>\n <!-- Dropdown menu -->\n\n @let hasLoader = isLoading() !== undefined;\n\n @if (hasLoader) {\n <div class=\"loader\" [class.loading]=\"isLoading()\">\n <svg-icon name=\"cai-loader\" class=\"loader-icon\"></svg-icon>\n </div>\n }\n\n @if (dropdownType) {\n @let maxHeight =\n ((dropdownOptions()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n @let animateDropdown =\n dropdownType !== \"toll\" &&\n dropdownType !== \"fuel-stop-transaction\" &&\n dropdownType !== \"dispatch\" &&\n dropdownType !== \"ftl-dispatch\" &&\n dropdownType !== \"split-driver\" &&\n dropdownType !== \"split-truck\" &&\n dropdownType !== \"split-trailer\";\n\n @let unfilteredHeight =\n dropdownType === \"contact\" || !animateDropdown\n ? 244\n : ((options()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n <div\n ngbDropdownMenu\n class=\"dropdown-menu input-dropdown-menu\"\n [class]=\"{\n 'hide-dropdown':\n config().dropdownAutocomplete &&\n !dropdownOptions()?.length &&\n !(showNoResults() && value()),\n 'animate-dropdown': animateDropdown,\n 'size-22': config().size === 22,\n 'has-stroke': config().hasStroke,\n }\"\n [class.closing]=\"closing()\"\n [style.--unfiltered-height]=\"\n unfilteredHeight > 244 ? '244px' : unfilteredHeight + 'px'\n \"\n [style.--max-height]=\"maxHeight > 244 ? '244px' : maxHeight + 'px'\"\n [style.width.px]=\"containerWidth()\"\n [tabindex]=\"-1\"\n (pointerdown)=\"onDropdownBackgroundClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <div\n class=\"dropdown-menu-content\"\n [tabindex]=\"-1\"\n caiInfiniteScroll\n [scrollThreshold]=\"50\"\n (scrolledToBottom)=\"onDropdownScrolledToBottom()\"\n >\n @if (config().add) {\n <button\n class=\"dropdown-item add-new\"\n [class.focused]=\"\n focusedOptionIndex === -1 ||\n groupedNavigationState?.groupIndex === -1\n \"\n (click)=\"handleAddingOption($event)\"\n >\n <p>ADD NEW</p>\n <svg-icon name=\"cai-plus\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"dropdownMenuRef\"></ng-container>\n </div>\n </div>\n\n @if (!config().dropdownAutocomplete) {\n <div\n class=\"dropdown-icon-container\"\n [class.open]=\"dropdown.isOpen() && !closing()\"\n (pointerdown)=\"onDropdownIconClick($event)\"\n >\n <svg-icon\n name=\"cai-arrow-secondary-down\"\n class=\"dropdown-icon icon\"\n ></svg-icon>\n </div>\n }\n @let specialDropdown =\n dropdownType === \"dispatch\" ||\n dropdownType === \"ftl-dispatch\" ||\n dropdownType === \"broker\" ||\n dropdownType === \"contact\" ||\n dropdownType === \"shipper\" ||\n dropdownType === \"bank\" ||\n dropdownType === \"dispatcher\" ||\n dropdownType === \"driver-owner\" ||\n dropdownType === \"truck-owner\" ||\n dropdownType === \"truck\" ||\n dropdownType === \"trailer\" ||\n dropdownType === \"hazardous\" ||\n dropdownType === \"state\" ||\n dropdownType === \"owner\" ||\n dropdownType === \"fuelcard\" ||\n dropdownType === \"pm\" ||\n dropdownType === \"color\" ||\n dropdownType === \"make\" ||\n dropdownType === \"toll\" ||\n dropdownType === \"provider\" ||\n dropdownType === \"split-driver\" ||\n dropdownType === \"split-truck\" ||\n dropdownType === \"split-trailer\" ||\n dropdownType === \"accident-driver\" ||\n dropdownType === \"accident-truck\" ||\n dropdownType === \"accident-trailer\";\n <!-- Placeholder -->\n @if (specialDropdown) {\n <ng-container *ngTemplateOutlet=\"selectedOptionRef\"></ng-container>\n } @else if (\n (config().add || config().search) &&\n !inputRef.value &&\n !this.isAdding() &&\n dropdownType !== \"subcontent\"\n ) {\n <div class=\"dropdown-selected\">\n @if (config().placeholderBehavior === \"static\") {\n <p class=\"selected-label-hidden\">\n {{ name + (config().required ? \" *\" : \"\") }}\n </p>\n <p class=\"selected-text\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n @if (\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ] === \"Hazardous\"\n ) {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n }\n }\n </div>\n }\n } @else if (config().isEdit && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ name }}</p>\n </div>\n }\n @if (config().passwordRequirements) {\n <div\n class=\"dropdown-menu password-requirement\"\n ngbDropdownMenu\n [style.width.px]=\"containerWidth()\"\n [class.closing]=\"closing()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <ng-container *ngTemplateOutlet=\"passwordRequirementsRef\"></ng-container>\n </div>\n }\n @if (subcontent) {\n <p class=\"subcontent\">\n @if (!(config().alignment === \"right\")) {\n <span class=\"subcontent-hide\"\n >{{\n config().search\n ? selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n : inputRef.value\n }}\n </span>\n }\n {{ subcontent }}\n </p>\n }\n</div>\n\n<!-- #region Templates -->\n\n<!-- #region Password requirements -->\n<ng-template #passwordRequirementsRef>\n @let isMinLengthValid =\n !this.ngControl?.errors?.[\"minlength\"] && this.value();\n @let isHasNumberValid =\n !this.ngControl?.errors?.[\"hasNumber\"] && this.value();\n @let isHasSymbolValid =\n !this.ngControl?.errors?.[\"hasSymbol\"] && this.value();\n @let isHasUppercaseValid =\n !this.ngControl?.errors?.[\"hasUppercase\"] && this.value();\n\n <p>Strong Password Requirement</p>\n <ul>\n <li [class.valid]=\"isMinLengthValid\">\n <svg-icon\n [name]=\"isMinLengthValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isMinLengthValid ? 'checkmark' : 'cancel'\"\n class=\"icon\"\n ></svg-icon\n ><span>Minimum 8 characters</span>\n </li>\n <li [class.valid]=\"isHasNumberValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasNumberValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasNumberValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One number</span>\n </li>\n <li [class.valid]=\"isHasSymbolValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasSymbolValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasSymbolValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One symbol</span>\n </li>\n <li [class.valid]=\"isHasUppercaseValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasUppercaseValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasUppercaseValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One upper-case letter</span>\n </li>\n </ul>\n</ng-template>\n<!-- #endregion -->\n@let search = config().search;\n\n<ng-template #dropdownMenuRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"dispatchesRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"ftlDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"brokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"contactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"shipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"bankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"dispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"driverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"truckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"trailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"truckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"hazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"stateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"ownerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"fuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"pmRef\"></ng-container>\n }\n @case (\"multiple\") {\n <ng-container *ngTemplateOutlet=\"multipleRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"makeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"tollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"colorRef\"></ng-container>\n }\n @case (\"fuel-stop-transaction\") {\n <ng-container *ngTemplateOutlet=\"fuelStopTransactionRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"providerRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"splitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"splitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"splitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container *ngTemplateOutlet=\"accidentDriverRef\"></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"accidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container *ngTemplateOutlet=\"accidentTrailerRef\"></ng-container>\n }\n @case (\"subcontent\") {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n }\n</ng-template>\n\n<ng-template #selectedOptionRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"selectedBrokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"selectedContactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"selectedShipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"selectedBankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedDriverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedTrailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"selectedHazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"selectedStateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"selectedOwnerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"selectedFuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"selectedPmRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"selectedMakeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"selectedTollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"selectedColorRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"selectedProviderRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentDriverRef\"\n ></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedAccidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentTrailerRef\"\n ></ng-container>\n }\n }\n</ng-template>\n\n<!-- Standard dropdown -->\n<ng-template #dropdownOptionsRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dropdownOption')?.id === dropdownOption.id,\n focused: focusedOptionIndex === index,\n }\"\n (click)=\"handleOption(dropdownOption, $event)\"\n >\n @if (dropdownOption[optionLabel] === \"Hazardous\") {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n }\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #multipleRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n (click)=\"handleOption(dropdownOption, $event)\"\n [class]=\"{\n selected: isSelectedOption(dropdownOption),\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #bankRef>\n @if (dropdownOptions().length) {\n @for (bank of dropdownOptions(); track $index; let index = $index) {\n @let bankOption = cast(bank, \"bank\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ bankOption.id }}\"\n (click)=\"handleOption(bankOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'bank')?.id === bankOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (bankOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"bankOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (bankOption.name || '' | highlightSearch: value())\n : bankOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #makeRef>\n @if (dropdownOptions().length) {\n @for (make of dropdownOptions(); track $index; let index = $index) {\n @let makeOption = cast(make, \"make\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ makeOption.id }}\"\n (click)=\"handleOption(makeOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'make')?.id === makeOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (makeOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"makeOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (makeOption.name || '' | highlightSearch: value())\n : makeOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Broker -->\n<ng-template #brokerRef>\n @if (dropdownOptions().length) {\n @for (broker of dropdownOptions(); track $index; let index = $index) {\n @let brokerOption = cast(broker, \"broker\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"broker-{{ brokerOption.id }}\"\n (click)=\"\n !(brokerOption.dnu || brokerOption.ban) &&\n handleOption(brokerOption, $event)\n \"\n [class]=\"{\n selected: cast(selectedOption(), 'broker')?.id === brokerOption.id,\n focused: focusedOptionIndex === index,\n banned: brokerOption.dnu || brokerOption.ban,\n dnu: brokerOption.dnu,\n }\"\n >\n @if (brokerOption?.dnu || brokerOption?.ban) {\n <svg-icon name=\"cai-minus\" class=\"round-icon\"></svg-icon>\n } @else if (brokerOption?.fraudCheck) {\n <svg-icon\n name=\"cai-status-warning-lite\"\n class=\"fraud-icon\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (brokerOption.businessName || '' | highlightSearch: value())\n : brokerOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n @if (!brokerOption.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>{{ brokerOption.availableCredit || 0 | currency }}</p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).status\n \"\n ></div>\n }\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ brokerOption.loadsCount }} |\n {{ brokerOption.availableCredit || 0 | currency }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Contact dropdown -->\n<ng-template #contactRef>\n @if (dropdownOptions().length) {\n @for (contact of dropdownOptions(); track $index; let index = $index) {\n @let contactOption = cast(contact, \"contact\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"contact-{{ contact.id }}\"\n (click)=\"handleOption(contact, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'contact')?.id === contact.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (contactOption.contactName || '' | highlightSearch: value())\n : contactOption.contactName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p class=\"text-truncate\">{{ contactOption.department?.name }}</p>\n </div>\n <div class=\"end-item-hover\">\n <p class=\"text-truncate\">\n {{ contactOption.phone }}\n {{\n contactOption.extensionPhone\n ? \"x\" + contactOption.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Owner dropdown -->\n<ng-template #ownerRef>\n @if (dropdownOptions().length) {\n @for (owner of dropdownOptions(); track $index; let index = $index) {\n @let ownerOption = cast(owner, \"owner\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"owner-{{ ownerOption?.id }}\"\n (click)=\"handleOption(ownerOption!, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'owner')?.id === ownerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"owner-ein\"\n [innerHTML]=\"\n search\n ? (ownerOption?.ein || '' | highlightSearch: value())\n : ownerOption?.ein\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (ownerOption?.name || '' | highlightSearch: value())\n : ownerOption?.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Fuelcard dropdown -->\n<ng-template #fuelcardRef>\n @if (dropdownOptions().length) {\n @for (fuelcard of dropdownOptions(); track $index; let index = $index) {\n @let fuelcardOption = cast(fuelcard, \"fuelCard\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"fuelcard-{{ fuelcardOption?.id }}\"\n (click)=\"handleOption(fuelcardOption!, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'fuelCard')?.id === fuelcardOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"fuelcard-number\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.number || '' | highlightSearch: value())\n : fuelcardOption?.number\n \"\n ></p>\n <p\n class=\"fuelcard-brand\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.brand || '' | highlightSearch: value())\n : fuelcardOption?.brand\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (fuelcardOption?.account || '' | highlightSearch: value())\n : fuelcardOption?.account\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident driver dropdown -->\n<ng-template #accidentDriverRef>\n @if (dropdownOptions().length) {\n @for (driver of dropdownOptions(); track $index; let index = $index) {\n @let driverOption = cast(driver, \"accidentDriver\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-driver-{{ driverOption.id }}\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentDriver')?.id === driverOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <p class=\"accident-dob\">\n {{ driverOption.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p\n class=\"accident-cdl-number\"\n [innerHTML]=\"driverOption.cdlNumber || '' | highlightSearch: value()\"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n driverOption.cdlState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n driverOption.cdlState?.countryType?.name &&\n driverOption.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n driverOption.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n driverOption.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident truck dropdown -->\n<ng-template #accidentTruckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"accidentTruck\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-truck-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTruck')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (truckOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n [name]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"truckOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n truckOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n truckOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n truckOption.licenseState?.countryType?.name &&\n truckOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n truckOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n truckOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident trailer dropdown -->\n<ng-template #accidentTrailerRef>\n @if (dropdownOptions().length) {\n @for (trailer of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(trailer, \"accidentTrailer\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-trailer-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTrailer')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (trailerOption.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n [name]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"trailerOption.trailerNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"trailerOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n trailerOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n trailerOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n trailerOption.licenseState?.countryType?.name &&\n trailerOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n trailerOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n trailerOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Shipper dropdown -->\n<ng-template #shipperRef>\n @if (dropdownOptions().length) {\n @for (shipper of dropdownOptions(); track $index; let index = $index) {\n @let shipperOption = cast(shipper, \"shipper\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"shipper-{{ shipperOption.id }}\"\n (click)=\"handleOption(shipperOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'shipper')?.id === shipperOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.businessName || '' | highlightSearch: value())\n : shipperOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.address?.address || ''\n | highlightSearch: value())\n : shipperOption.address?.address\n \"\n ></p>\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ shipperOption.pickupCount }} Pickup |\n {{ shipperOption.deliveryCount }} Delivery\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatch dropdown -->\n<ng-template #dispatchesRef>\n @if (dropdownOptions().length) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"resetSelection()\"\n [class]=\"{\n selected: !selectedOption(),\n }\"\n >\n <p>Unassigned</p>\n <div class=\"unassigned-ltl\">\n <p>{{ unassignedCount() }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </button>\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n <!-- Temporary variant since BE doesn't support boards -->\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base dispatch-ltl\">\n <p>{{ dispatch.numberOfSingleLtlLoads }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- ftl dispatch dropdown -->\n<ng-template #ftlDispatchRef>\n @if (dropdownOptions().length) {\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <!-- Load Status -->\n @let dispatchStatus = dispatch.status | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (dispatch.status?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ dispatch.status?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ dispatch?.pendingLoadCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitDriverRef>\n @if (dropdownOptions().length) {\n @for (splitDriverBoard of dropdownOptions(); track splitDriverBoard.id) {\n @let driverBoard = cast(splitDriverBoard, \"splitDriverBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(driverBoard.id, $event)\"\n [class]=\"{\n unfolded: (driverBoard.drivers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n driverBoard.isTeamBoard ? \"Team Board\" : driverBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ driverBoard.drivers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (driver of driverBoard.drivers || []; track driver.id) {\n @let driverOption = cast(driver, \"splitDriver\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitDriver')?.id === driverOption.id,\n }\"\n >\n <div class=\"dropdown-subitem\">\n <div class=\"dropdown-avatar\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n </div>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n driverOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (driverOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ driverOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ driverOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ driverOption.payTypeValue }}</p>\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTruckRef>\n @if (dropdownOptions().length) {\n @for (splitTruckBoard of dropdownOptions(); track splitTruckBoard.id) {\n @let truckBoard = cast(splitTruckBoard, \"splitTruckBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(truckBoard.id, $event)\"\n [class]=\"{\n unfolded: (truckBoard.trucks?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n truckBoard.isTeamBoard ? \"Team Board\" : truckBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ truckBoard.trucks?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (truck of truckBoard.trucks || []; track truck.id) {\n @let truckOption = cast(truck, \"splitTruck\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTruck')?.id === truckOption.id,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [style.--truck-color]=\"truckOption.color?.code || ''\"\n [name]=\"truckOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus = truckOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (truckOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ truckOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ truckOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n truckOption.location?.city &&\n truckOption.location?.stateShortName\n ) {\n <p>\n {{ truckOption.location?.city }},\n {{ truckOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTrailerRef>\n @if (dropdownOptions().length) {\n @for (splitTrailerBoard of dropdownOptions(); track splitTrailerBoard.id) {\n @let trailerBoard = cast(splitTrailerBoard, \"splitTrailerBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(trailerBoard.id, $event)\"\n [class]=\"{\n unfolded: (trailerBoard.trailers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n trailerBoard.isTeamBoard\n ? \"Team Board\"\n : trailerBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ trailerBoard.trailers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (trailer of trailerBoard.trailers || []; track trailer.id) {\n @let trailerOption = cast(trailer, \"splitTrailer\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTrailer')?.id === trailerOption.id,\n }\"\n >\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [style.--trailer-color]=\"trailerOption.color?.code || ''\"\n [name]=\"trailerOption.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n trailerOption.trailerNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n trailerOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (trailerOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ trailerOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ trailerOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n trailerOption.location?.city &&\n trailerOption.location?.stateShortName\n ) {\n <p>\n {{ trailerOption.location?.city }},\n {{ trailerOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #tollRef>\n @if (dropdownOptions().length) {\n @for (toll of dropdownOptions(); track $index; let groupIndex = $index) {\n @let tollOption = cast(toll, \"tollOption\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item pe-none\"\n [class]=\"{\n unfolded: tollOption.tollTransponders?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{ tollOption.groupName }}\n </p>\n </button>\n @let tollTransponders = tollOption.tollTransponders || [];\n @for (\n tollTransponder of tollTransponders;\n track tollTransponder.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(tollTransponder, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'tollTransponderOption')?.id ===\n tollTransponder.id,\n focused: isOptionFocused,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (tollTransponder.name || '' | highlightSearch: value())\n : tollTransponder.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatcher dropdown -->\n\n<ng-template #dispatcherRef>\n @if (dropdownOptions().length) {\n @for (dispatcher of dropdownOptions(); track $index; let index = $index) {\n @let dispatcherOption = cast(dispatcher, \"dispatcher\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dispatcherOption.id }}\"\n (click)=\"handleOption(dispatcherOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatcher')?.id === dispatcherOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (dispatcherOption.fullName || '' | highlightSearch: value())\n : dispatcherOption.fullName\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Driver Owner dropdown -->\n\n<ng-template #driverOwnerRef>\n @if (dropdownOptions().length) {\n @for (driverOwner of dropdownOptions(); track $index; let index = $index) {\n @let driverOwnerOption = cast(driverOwner, \"driverOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ driverOwnerOption.id }}\"\n (click)=\"handleOption(driverOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'driverOwner')?.id === driverOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (driverOwnerOption.fullName || '' | highlightSearch: value())\n : driverOwnerOption.fullName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ driverOwnerOption.driverType | driverTypeLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Truck Owner dropdown -->\n\n<ng-template #truckOwnerRef>\n @if (dropdownOptions().length) {\n @for (truckOwner of dropdownOptions(); track $index; let index = $index) {\n @let truckOwnerOption = cast(truckOwner, \"truckOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOwnerOption.id }}\"\n (click)=\"handleOption(truckOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOwner')?.id === truckOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem truck-owner-unit\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.truckNumber || ''\n | highlightSearch: value())\n : truckOwnerOption.truckNumber\n \"\n ></p>\n @if (truckOwnerOption.model) {\n <p class=\"truck-owner-bullet\">\u2022</p>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.model | highlightSearch: value())\n : truckOwnerOption.model\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #truckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"truckOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOption')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (truckOption.name || '' | highlightSearch: value())\n : truckOption.name\n \"\n ></p>\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"truckOption.logoName.slice(0, -4)\"\n [name]=\"truckOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #trailerRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(truck, \"trailerOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'trailerOption')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (trailerOption.name || '' | highlightSearch: value())\n : trailerOption.name\n \"\n ></p>\n\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"trailerOption.logoName.slice(0, -4)\"\n [name]=\"trailerOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #providerRef>\n @if (dropdownOptions().length) {\n @for (provider of dropdownOptions(); track $index; let index = $index) {\n @let providerOption = cast(provider, \"provider\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ providerOption?.id }}\"\n (click)=\"handleOption(providerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'provider')?.id === providerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"full-icon\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Hazardous dropdown -->\n<ng-template #hazardousRef>\n @if (dropdownOptions().length) {\n @for (hazardous of dropdownOptions(); track $index; let index = $index) {\n @let hazardousOption = cast(hazardous, \"hazardous\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ hazardousOption.id }}\"\n (click)=\"handleOption(hazardousOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'hazardous')?.id === hazardousOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon [name]=\"hazardousOption.logoName?.slice(0, -4)\"></svg-icon>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (hazardousOption.description || '' | highlightSearch: value())\n : hazardousOption.description\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #pmRef>\n @if (dropdownOptions().length) {\n @for (pm of dropdownOptions(); track $index; let index = $index) {\n @let pmOption = cast(pm, \"pmOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ pmOption.id }}\"\n (click)=\"handleOption(pmOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'pmOption')?.id === pmOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"pmOption.title | remapPmIcons\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (pmOption.title || '' | highlightSearch: value())\n : pmOption.title\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #colorRef>\n @if (dropdownOptions().length) {\n @for (color of dropdownOptions(); track $index; let index = $index) {\n @let colorOption = cast(color, \"colorOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item color-item\"\n id=\"option-{{ colorOption.id }}\"\n (click)=\"handleOption(colorOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'colorOption')?.id === colorOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (colorOption.name || '' | highlightSearch: value())\n : colorOption.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #stateRef>\n @if (dropdownOptions().length) {\n @for (state of dropdownOptions(); track $index; let index = $index) {\n @let stateOption = cast(state, \"state\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ stateOption.id }}\"\n (click)=\"handleOption(stateOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'state')?.id === stateOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (stateOption.stateShortName +\n ' ' +\n (config().fullState\n ? ' (' + stateOption?.stateName + ')'\n : '') || '' | highlightSearch: value())\n : stateOption.stateShortName +\n ' ' +\n (config().fullState ? ' (' + stateOption?.stateName + ')' : '')\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #fuelStopTransactionRef>\n @if (dropdownOptions().length) {\n @for (\n franchise of dropdownOptions();\n track franchise.id;\n let groupIndex = $index\n ) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let franchiseOption = cast(franchise, \"franchise\")!;\n @if (franchiseOption?.count !== null) {\n <div\n class=\"dropdown-group\"\n [class.no-items]=\"!franchiseOption?.count\"\n [class]=\"{\n active: openGroup() === franchiseOption.id,\n }\"\n [style.--max-height]=\"\n openGroup() === franchiseOption.id\n ? 30 * ((franchiseOption.fuelStopStores?.length || 0) + 1) + 'px'\n : '26px'\n \"\n >\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(franchiseOption.id, $event, franchiseOption)\"\n [class]=\"{\n unfolded: openGroup() === franchiseOption.id,\n focused: isGroupFocused,\n }\"\n >\n <p\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n <p class=\"counter\">{{ franchiseOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @if (openGroup() === franchiseOption.id) {\n @if (franchiseOption.fuelStopStores?.length || 0 > 0) {\n @for (\n fuelStopStore of franchiseOption.fuelStopStores;\n track fuelStopStore.id\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === $index + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item fuel-stop-transaction-store\"\n [class]=\"{\n focused: isOptionFocused,\n }\"\n (click)=\"handleOption(fuelStopStore, $event)\"\n >\n <p\n [innerHTML]=\"\n fuelStopStore?.store ?? '' | highlightSearch: value()\n \"\n ></p>\n @let city = fuelStopStore?.address?.city ?? \"\";\n @let state = fuelStopStore?.address?.stateShortName ?? \"\";\n @let zip = fuelStopStore?.address?.zipCode ?? \"\";\n <p\n class=\"fuel-stop-transaction-store-address\"\n [innerHTML]=\"\n city + (state || zip ? ', ' : '') + state + ' ' + zip\n | highlightSearch: value()\n \"\n ></p>\n\n @if (fuelStopStore?.[\"favourite\"]) {\n <svg-icon\n name=\"cai-favorite\"\n class=\"favorite-icon\"\n ></svg-icon>\n }\n </button>\n }\n <!-- Infinite scroll trigger - emits event when item comes into view -->\n <div\n class=\"dropdown-infinite-scroll-item\"\n caiIntersectionObserver\n [threshold]=\"0.1\"\n (inView)=\"onDropdownScrolledToBottom(true)\"\n ></div>\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n </div>\n } @else {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n [class.focused]=\"\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0\n \"\n (click)=\"handleOption(franchiseOption, $event)\"\n >\n <p\n class=\"fuel-stop-transaction-nostore\"\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- #endregion -->\n\n<!-- #region Selected options -->\n\n<!-- selected dispatch -->\n<ng-template #selectedDispatchRef>\n @let dispatchOption = cast(selectedOption(), \"dispatch\");\n @if (dispatchOption && !inputRef.value && !isAdding()) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"dispatchOption!.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ dispatchOption!.truck.truckNumber }}\n </p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatchOption!.trailer) {\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"\n cast(\n selectedOption(),\n 'dispatch'\n )!.trailer?.trailerType?.logoName?.slice(0, -4)\n \"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ dispatchOption!.trailer?.trailerNumber }}\n </p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatchOption!.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" & \" +\n dispatchOption!.coDriver?.firstName\n }}\n </p>\n } @else {\n <cai-avatar\n [driver]=\"dispatchOption!.driver\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" \" +\n dispatchOption!.driver.lastName\n }}\n </p>\n }\n </div>\n <p class=\"selected-end-item\">\n {{ dispatchOption!.payType }}\n </p>\n </div>\n } @else {\n @if (!inputRef.value && this.config().dropdown == \"dispatch\") {\n <p class=\"dropdown-selected\">Unassigned</p>\n }\n }\n</ng-template>\n\n<!-- selected broker -->\n<ng-template #selectedBrokerRef>\n @let brokerOption = cast(selectedOption(), \"broker\");\n @if (brokerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (brokerOption!.fraudCheck) {\n <svg-icon name=\"cai-status-warning-lite\" class=\"fraud-icon\"></svg-icon>\n }\n <p class=\"dropdown-selected-content\">{{ brokerOption!.businessName }}</p>\n <div class=\"selected-end-item\">\n @if (!brokerOption!.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>\n {{ brokerOption!.availableCredit || 0 | currency }}\n </p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).status\n \"\n ></div>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedContactRef>\n @let contactOption = cast(selectedOption(), \"contact\");\n @if (contactOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ contactOption?.contactName }}</p>\n <div class=\"selected-end-item\">\n <p>\n {{ contactOption?.phone }}\n {{\n contactOption?.extensionPhone\n ? \"x\" + contactOption?.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedShipperRef>\n @let shipperOption = cast(selectedOption(), \"shipper\");\n @if (shipperOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ shipperOption?.businessName }}</p>\n <div class=\"selected-end-item selected-end-item-truncate\">\n <p class=\"text-truncate\">{{ shipperOption?.address?.address }}</p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedOwnerRef>\n @let ownerOption = cast(selectedOption(), \"owner\");\n @if (ownerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"owner-ein\">{{ ownerOption?.ein }}</p>\n <p class=\"\">{{ ownerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedFuelcardRef>\n @let fuelcardOption = cast(selectedOption(), \"fuelCard\");\n @if (fuelcardOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"fuelcard-number\">\n {{ fuelcardOption?.number }}\n </p>\n <p class=\"fuelcard-brand\">\n {{ fuelcardOption?.brand }}\n </p>\n <p class=\"\">\n {{ fuelcardOption?.account }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedBankRef>\n @let bankOption = cast(selectedOption(), \"bank\");\n @if (bankOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (bankOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"bankOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ bankOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedProviderRef>\n @let providerOption = cast(selectedOption(), \"provider\");\n @if (providerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedMakeRef>\n @let makeOption = cast(selectedOption(), \"make\");\n @if (makeOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (makeOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"makeOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ makeOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedStateRef>\n @let stateOption = cast(selectedOption(), \"state\");\n @if (stateOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ stateOption?.stateShortName }}\n {{ config().fullState ? \" (\" + stateOption?.stateName + \")\" : \"\" }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDispatcherRef>\n @let dispatcherOption = cast(selectedOption(), \"dispatcher\");\n @if (dispatcherOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ dispatcherOption?.fullName }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDriverOwnerRef>\n @let driverOwnerOption = cast(selectedOption(), \"driverOwner\");\n @if (driverOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ driverOwnerOption?.fullName }}</p>\n <p class=\"selected-end-item driver-type\">\n {{ driverOwnerOption?.driverType | driverTypeLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckOwnerRef>\n @let truckOwnerOption = cast(selectedOption(), \"truckOwner\");\n @if (truckOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p class=\"dropdown-selected-content\">\n {{ truckOwnerOption.truckNumber }}\n @if (truckOwnerOption.model) {\n <span class=\"truck-owner-bullet\">\u2022</span>\n {{ truckOwnerOption.model }}\n }\n </p>\n <p class=\"selected-end-item driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckRef>\n @let truckOption = cast(selectedOption(), \"truckOption\");\n @if (truckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"truckOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ truckOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTrailerRef>\n @let trailerOption = cast(selectedOption(), \"trailerOption\");\n @if (trailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"trailerOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ trailerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedHazardousRef>\n @let hazardousOption = cast(selectedOption(), \"hazardous\");\n @if (hazardousOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"hazard-icon\"\n [name]=\"hazardousOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content dropdown-selected-hazardous\">\n {{ hazardousOption?.description }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedPmRef>\n @let pmOption = cast(selectedOption(), \"pmOption\");\n @if (pmOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"pmOption?.title | remapPmIcons\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ pmOption?.title }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedColorRef>\n @let colorOption = cast(selectedOption(), \"colorOption\");\n @if (colorOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ colorOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTollRef>\n @let tollOption = cast(selectedOption(), \"tollTransponderOption\");\n @if (tollOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">\n {{ tollOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitDriverRef>\n @let splitDriverOption = cast(selectedOption(), \"splitDriver\");\n @if (splitDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem\">\n <cai-avatar [driver]=\"splitDriverOption\" [size]=\"18\"></cai-avatar>\n <p class=\"driver-name\">\n {{ splitDriverOption.firstName + \" \" + splitDriverOption.lastName }}\n </p>\n </div>\n </div>\n\n <p class=\"selected-end-item\">\n {{ splitDriverOption.payTypeValue }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTruckRef>\n @let splitTruckOption = cast(selectedOption(), \"splitTruck\");\n @if (splitTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"splitTruckOption!.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ splitTruckOption!.truckNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTruckOption!.location?.city &&\n splitTruckOption!.location?.stateShortName\n ) {\n {{ splitTruckOption!.location?.city }},\n {{ splitTruckOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTrailerRef>\n @let splitTrailerOption = cast(selectedOption(), \"splitTrailer\");\n @if (splitTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"splitTrailerOption!.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ splitTrailerOption!.trailerNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTrailerOption!.location?.city &&\n splitTrailerOption!.location?.stateShortName\n ) {\n {{ splitTrailerOption!.location?.city }},\n {{ splitTrailerOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentDriverRef>\n @let accidentDriverOption = cast(selectedOption(), \"accidentDriver\");\n @if (accidentDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"accidentDriverOption!\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p>\n {{\n accidentDriverOption!.firstName +\n \" \" +\n accidentDriverOption!.lastName\n }}\n </p>\n </div>\n <p class=\"accident-dob\">\n {{ accidentDriverOption!.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p class=\"accident-cdl-number\">\n {{ accidentDriverOption!.cdlNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentDriverOption!.cdlState?.stateShortName }}</p>\n @if (\n accidentDriverOption!.cdlState?.countryType?.name &&\n accidentDriverOption!.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentDriverOption!.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentDriverOption!.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTruckRef>\n @let accidentTruckOption = cast(selectedOption(), \"accidentTruck\");\n @if (accidentTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTruckOption!.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"accidentTruckOption!.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTruckOption!.truckNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTruckOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTruckOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTruckOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTruckOption!.licenseState?.countryType?.name &&\n accidentTruckOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTruckOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTruckOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTrailerRef>\n @let accidentTrailerOption = cast(selectedOption(), \"accidentTrailer\");\n @if (accidentTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTrailerOption!.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon option-icon\"\n [name]=\"accidentTrailerOption!.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTrailerOption!.trailerNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTrailerOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTrailerOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTrailerOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTrailerOption!.licenseState?.countryType?.name &&\n accidentTrailerOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTrailerOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTrailerOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #passwordTooltip>\n {{ visible() ? \"Hide\" : \"Show\" }}\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (\n (config().errorBehavior === \"floating\" ||\n (config().errorBehavior === \"static\" && hasText()) ||\n config().inTable) &&\n invalid &&\n !dropdown.isOpen()\n ) {\n {{ (ngControl?.errors | errorMessage: config().customErrors)[0] }}\n }\n</ng-template>\n\n<!-- #endregion -->\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.app-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;position:relative;border-radius:2px;background-color:var(--color-surface-neutral);color:var(--color-text);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);display:flex}.app-input-container.inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #ffffff;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.app-input-container.inverse:not(.has-error):not(.has-valid) .app-input:focus-visible{color:#2f2f2f}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon,.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon,.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse.has-text:has(.app-input:disabled) .app-input-label{color:#424242!important}.app-input-container.hovered{background-color:var(--color-surface-neutral-hover)}.app-input-container.hovered:not(:has(.app-input:disabled)) .sub-label,.app-input-container.hovered:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}@media(hover:hover){.app-input-container:hover{background-color:var(--color-surface-neutral-hover)}.app-input-container:hover:not(:has(.app-input:disabled)) .sub-label,.app-input-container:hover:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}}.app-input-container.has-text .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container.has-text.fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container.has-text .subcontent{opacity:1!important}.app-input-container.has-text.static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text)}@media(hover:hover){.app-input-container.has-text.is-address:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:hover .bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral-hover)}}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible){background-color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container:has(.app-input:focus-visible) .subcontent{opacity:1!important;color:#ffffffb2;left:unset!important;right:4px!important}.app-input-container:has(.app-input:focus-visible).has-text .subcontent{right:26px!important}.app-input-container:has(.app-input:focus-visible) .sub-label,.app-input-container:has(.app-input:focus-visible) .app-input-label .accident-state{margin-right:44px}.app-input-container:has(.app-input:focus-visible).fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container:has(.app-input:focus-visible).static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text-inverse)!important}.app-input-container:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}.app-input-container:has(.app-input:disabled){background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled).hovered{background-color:var(--color-surface-disable)}@media(hover:hover){.app-input-container:has(.app-input:disabled):hover{background-color:var(--color-surface-disable)}}.app-input-container:has(.app-input:disabled):focus{background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled) .app-input-label{color:var(--color-text-subtle)}.app-input-container:has(.app-input:disabled) .separator{background-color:var(--color-icon-disable)}.app-input-container:has(.app-input:disabled) .dropdown-icon-container{opacity:0;pointer-events:none!important}.app-input-container:has(.app-input:disabled) .dropdown-selected:has(.selected-end-item){width:100%}.app-input-container:has(.app-input:disabled) .driver-type{color:#919191}.app-input-container:has(.app-input:disabled) .icon-container{pointer-events:none!important}.app-input-container:has(.app-input:disabled):not(.disabled-removable) .cancel-button{display:none!important}.app-input-container:has(.app-input:required):not(:has(.app-input:disabled)) .app-input-name:after{content:\" *\";color:var(--color-text-negative)}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .dropdown-icon-container:hover .dropdown-icon{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .hover-icon:hover{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.canceled .app-input-label,.app-input-container.canceled .app-input{color:var(--color-text-subtle)!important}.app-input-container.canceled .icon-container .icon,.app-input-container.canceled .icon-container .icon-sm{color:var(--color-icon-disable)!important}.subcontent{pointer-events:none;position:absolute;left:6px;color:#919191;-webkit-user-select:none;user-select:none;top:50%;transform:translateY(-50%);transition:right .1s ease-in-out,left .1s ease-in-out,transform .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);opacity:0;font-family:Montserrat;font-weight:400;font-style:Regular;font-size:14px;line-height:18px;letter-spacing:0%;height:18px;overflow:hidden}.subcontent .subcontent-hide{opacity:0!important}.app-input-label{position:absolute;display:flex;gap:4px;left:0;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.app-input-label.placeholder-color{color:var(--placeholder-color)!important}.app-input{padding:.25rem 6px;width:100%;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.app-input:focus-visible{color:var(--color-text-inverse)}@media(pointer:coarse){.app-input{font-size:16px;transform:scale(.875);transform-origin:left center;height:26px}}.app-input-error{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;pointer-events:none;-webkit-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text-negative);transform:translateY(-10px)}.app-input-container.has-error{background-color:var(--color-surface-negative)}.app-input-container.has-error:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-error:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-error:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-error.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-error.hovered{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error.hovered.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error.hovered.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}@media(hover:hover){.app-input-container.has-error:hover{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error:hover.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error:hover.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}}.app-input-container.has-error:has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus);color:var(--color-text-inverse)}.app-input-container.has-error:has(.app-input:focus-visible).has-text .button-icon{opacity:1}.app-input-container.has-error:has(.app-input:focus-visible).has-text .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.app-input-container.has-error:has(.app-input:focus-visible).is-empty,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected){background-color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .app-input-error,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .app-input-error{opacity:0}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .bg-icon,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .bg-icon{color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .warning-icon,.app-input-container.has-error.is-empty:has(.app-input:not(:focus-visible)) .warning-icon{opacity:1!important}.app-input-container.has-error .app-input-error{opacity:1;transform:translateY(0);pointer-events:auto}.app-input-container.has-error .app-input::selection{background-color:#ffffff4d}.app-input-container.has-error .icon-container .separator,.app-input-container.has-error .dropdown-icon-container .separator{background-color:var(--color-icon-negative)}.app-input-container.has-error .icon-container .icon,.app-input-container.has-error .icon-container .icon-sm,.app-input-container.has-error .dropdown-icon-container .icon,.app-input-container.has-error .dropdown-icon-container .icon-sm{color:var(--color-icon-negative)}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.has-valid:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-valid:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-valid:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-valid.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-valid.has-text:not(.has-dropdown):not(.in-table),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.in-table),.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.in-table){background-color:var(--color-surface-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible){background-color:var(--color-surface-positive-focus);color:var(--color-text-inverse)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon{opacity:1}.app-input-container.has-valid.has-text:not(.has-dropdown) .app-input::selection,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .app-input::selection,.app-input-container.has-valid.has-multiple-dropdown.has-text .app-input::selection{background-color:#ffffff4d}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .separator,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .separator{background-color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon-sm{color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .password-key{opacity:0;pointer-events:none}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.in-table,.in-table.has-error,.in-table.has-valid.has-text{background-color:transparent}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)) .app-input{color:var(--color-text-negative)}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)):not(.static-placeholder) .app-input-label{color:var(--color-text-negative)}.in-table .dropdown-icon-container{opacity:0}@media(hover:hover){.in-table:hover .dropdown-icon-container{opacity:1}}.in-table:has(.app-input:focus-visible) .dropdown-icon-container{opacity:1}.app-input-icon{position:absolute;right:4px;top:4px;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.button-icon{opacity:0;pointer-events:none}@media(hover:hover){.button-icon:hover{cursor:pointer}}.bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);transform-box:border-box;transform-origin:center;will-change:transform}.bg-icon svg{transition:transform .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.bg-icon:hover{transform:scale(1.2222222222)}.bg-icon:hover svg{transform:scale(.8181818182)}}.bg-icon:active{transform:scale(1)}.round-icon{background-color:#919191;color:#2f2f2f;border-radius:50%;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.positive-icon{color:var(--color-icon-positive);height:18px;width:18px;display:grid;place-items:center;opacity:0}.warning-icon{color:var(--color-icon-negative);height:18px;width:18px;display:grid;place-items:center;opacity:0}.text-color-positive:not(:hover):not(:has(.app-input:focus-visible)) .app-input{color:#3b73ed}.is-plan.has-selected .app-input,.is-plan.has-selected .dropdown-selected-content,.is-plan.has-selected .selected-text{font-weight:700}.is-plan.has-selected:not(:has(.app-input:focus-visible)) .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .selected-text{color:#3b73ed}@media(hover:hover){.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .selected-text{color:#0b49d1}}.floating-error .app-input-error{opacity:0!important}.static-error .app-input-error{pointer-events:none!important;transform:translateY(calc(-100% - 4px))!important;transition:margin .1s ease-in-out,opacity .1s ease-in-out}.static-error.has-icon .app-input-error{margin-right:26px!important}.static-error:has(.app-input:not(:focus-visible)) .app-input-error{opacity:1}.static-error.has-text .app-input-error{opacity:0!important}.static-placeholder .app-input-label{position:relative;white-space:nowrap;font-size:11px;font-weight:600}.static-placeholder .dropdown-selected{overflow:hidden;display:flex!important;justify-content:left!important}.static-placeholder .dropdown-selected .selected-label-hidden{width:max-content;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;pointer-events:none}.static-placeholder .dropdown-selected .selected-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}.static-placeholder .app-input{padding-left:0!important}.static-placeholder.has-dropdown .cancel-button{display:none}.static-placeholder.has-dropdown .dropdown-icon-container .dropdown-icon{opacity:0;pointer-events:none}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container .dropdown-icon{opacity:1!important}@media(hover:hover){.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container .dropdown-icon{opacity:1!important}}.static-placeholder.has-dropdown .dropdown-icon-container{right:4px!important;left:auto!important}.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm{color:var(--color-icon-inverse)!important}.app-input-container.has-icon.colored-icon .icon-container .icon,.app-input-container.has-icon.colored-icon .icon-container .icon-sm,.app-input-container.has-password.colored-icon .icon-container .icon,.app-input-container.has-password.colored-icon .icon-container .icon-sm,.app-input-container.has-dropdown.colored-icon .icon-container .icon,.app-input-container.has-dropdown.colored-icon .icon-container .icon-sm{color:var(--icon-color)}.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm{color:var(--color-icon-disable)!important}.app-input-container.has-icon .positive-icon,.app-input-container.has-icon .warning-icon,.app-input-container.has-password .positive-icon,.app-input-container.has-password .warning-icon,.app-input-container.has-dropdown .positive-icon,.app-input-container.has-dropdown .warning-icon{display:none!important}.app-input-container.has-icon .icon,.app-input-container.has-icon .icon-sm,.app-input-container.has-password .icon,.app-input-container.has-password .icon-sm,.app-input-container.has-dropdown .icon,.app-input-container.has-dropdown .icon-sm{height:18px;width:18px;display:grid;place-items:center;color:var(--color-icon-neutral);transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);opacity:1}.app-input-container.has-icon:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}@media(hover:hover){.app-input-container.has-icon:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}}.icon-sm{height:14px;width:14px}.app-input-container.has-icon .icon-container,.app-input-container.has-password .icon-container{height:26px;display:flex;justify-items:center;align-items:center;gap:4px;padding:.25rem 0 .25rem 6px}@media(hover:hover){.app-input-container.has-icon .icon-container:hover,.app-input-container.has-password .icon-container:hover{cursor:text}}.app-input-container.has-icon .subcontent,.app-input-container.has-password .subcontent{left:32px}.app-input-container.has-icon .app-input-label,.app-input-container.has-password .app-input-label{left:27px}.app-input-container.has-icon .app-input,.app-input-container.has-password .app-input{padding-left:4px}.separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);opacity:40%}.has-password .password-icons{display:grid;place-items:center;position:relative;height:18px;width:18px}.has-password .password-icons .icon,.has-password .password-icons .icon-sm{position:absolute;opacity:0}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-key{opacity:1!important}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-icons{pointer-events:none}.has-password:has(.app-input:disabled) .password-icons{pointer-events:none}.has-password.has-text .password-hidden,.has-password:has(.app-input:focus-visible) .password-hidden{opacity:1!important}@media(hover:hover){.has-password.has-text .password-hidden:hover,.has-password:has(.app-input:focus-visible) .password-hidden:hover{cursor:pointer}}.has-visible.has-text .password-shown,.has-visible:has(.app-input:focus-visible) .password-shown{opacity:1!important}@media(hover:hover){.has-visible.has-text .password-shown:hover,.has-visible:has(.app-input:focus-visible) .password-shown:hover{cursor:pointer}}.has-visible.has-text .password-hidden,.has-visible:has(.app-input:focus-visible) .password-hidden{opacity:0!important;pointer-events:none}.has-number .number-container{position:relative;display:flex;justify-content:center;align-items:center;right:4px;pointer-events:none}.has-number .number-buttons{display:flex;gap:4px;position:absolute;right:0;justify-content:center;align-items:center;opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);pointer-events:none}.has-number .plus-icon,.has-number .minus-icon{cursor:pointer;pointer-events:none}.has-number:has(.app-input:focus-visible){cursor:text}.has-number:has(.app-input:focus-visible) .number-buttons{opacity:1}.has-number:has(.app-input:focus-visible) .plus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .minus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .button-icon{opacity:0!important;pointer-events:none!important}.has-number:has(.app-input:focus-visible) .number-container{width:60px}.has-number:has(.app-input:focus-visible) .subcontent{right:52px!important}.has-number:has(.app-input:focus-visible).has-text .subcontent{right:52px!important}.colored-icon .icon,.colored-icon .icon-sm{color:var(--icon-color)!important}.dropdown-anchor{position:absolute;width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0}.dropdown-infinite-scroll-item{width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0;height:0}.dropdown-menu{min-width:0px!important;width:100%;border:0;margin-top:4px;top:30px;height:var(--unfiltered-height);min-height:var(--unfiltered-height);padding:0!important;overflow:hidden;border-radius:0!important;background:transparent!important}.dropdown-menu.has-stroke .dropdown-menu-content{outline:1px solid #6c6c6c;outline-offset:-1px}.dropdown-menu .dropdown-menu-content{position:absolute;width:100%;background-color:#2f2f2f;border-radius:3px;padding:4px 0 4px 4px;max-height:244px;z-index:1100!important;overflow-y:scroll;margin-top:auto!important;scroll-padding:6px 0}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar{background-color:#2f2f2f;border-radius:0 3px 3px 0;width:4px}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar-thumb{width:4px;background:#2f2f2f;border-left:2px solid #919191;background-clip:padding-box;border-radius:1px 3px 3px 1px}@supports (-moz-appearance: none){.dropdown-menu .dropdown-menu-content{padding-right:4px;scrollbar-width:4px;scrollbar-color:#919191 transparent;scrollbar-gutter:stable!important}@media(hover:hover){.dropdown-menu .dropdown-menu-content:hover{scrollbar-color:#919191 transparent;scrollbar-width:4px!important;scrollbar-gutter:stable!important}}}@-moz-document url-prefix(){.dropdown-menu .dropdown-menu-content{overflow:-moz-scrollbars-vertical;scrollbar-width:4px;scrollbar-color:#919191 transparent}}.option-icon{color:#6c6c6c;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.option-icon.full-size{width:max-content;min-width:100%;height:18px!important;min-height:18px;flex-shrink:0;overflow:hidden}.option-icon.full-size svg{height:18px;width:max-content}.cai-color{color:var(--color)!important;transition:color .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.color-item:hover .cai-color{color:var(--hover-color)!important}}.dropdown-item{color:#fff;font-weight:400;font-size:14px;line-height:18px;height:26px;padding:4px;width:100%;scroll-margin:6px 0;outline:1px solid transparent;outline-offset:-1px;display:flex;align-items:center;justify-content:left;gap:4px;background-color:#2f2f2f;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),outline .1s cubic-bezier(.46,.03,.51,.95);border-radius:2px;position:relative}.dropdown-item.focused{outline:1px solid #6c6c6c!important}.dropdown-item.focused .end-item-base{opacity:0}.dropdown-item.focused .end-item-hover{opacity:1}.dropdown-item.focused .full-icon{color:#ffffffb2}.dropdown-item.focused .truck-trailer-option{opacity:1}.dropdown-item .icon,.dropdown-item .icon-sm{color:#919191}.dropdown-item .dropdown-content-with-icon{max-width:calc(100% - 22px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content-hazardous{max-width:calc(100% - 40px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content{max-width:70%;overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){.dropdown-item:hover:not(.no-hover){background-color:#424242}.dropdown-item:hover:not(.no-hover) .end-item-base{opacity:0}.dropdown-item:hover:not(.no-hover) .end-item-hover{opacity:1}.dropdown-item:hover:not(.no-hover) .full-icon{color:#ffffffb2}.dropdown-item:hover:not(.no-hover) .truck-trailer-option{opacity:1}}.dropdown-item.no-hover{cursor:default;pointer-events:none}.dropdown-item:focus-visible{background-color:#424242;border:0;outline:none}.dropdown-item:not(:first-child){margin-top:4px}.dropdown-item.banned{color:#919191;cursor:default}@media(hover:hover){.dropdown-item.banned:hover{color:#919191;background-color:#2f2f2f}.dropdown-item.banned:hover .end-item-base{opacity:0}.dropdown-item.banned:hover .end-item-hover{opacity:1}}.dropdown-item.dnu .round-icon{background-color:#e66767}.dropdown-item.selected .dispatch-load-count,.dropdown-item.selected .unassigned-ltl,.dropdown-item.selected .unassigned-ltl .icon,.dropdown-item.selected .unassigned-ltl .icon-sm{color:#92b1f5}.dropdown-item:not(:hover):not(.focused):not(.selected) .truck-icon{color:#919191}.dropdown-item:not(:hover):not(.focused):not(.selected) .trailer-icon{color:#919191}@media(hover:hover){.dropdown-avatar:hover{z-index:20}}.no-results{color:#919191;font-weight:700;cursor:default;pointer-events:none}.add-new{color:#92b1f5!important;font-weight:700;font-size:11px}.add-new .dropdown-item-icon{opacity:1}@media(hover:hover){.add-new:hover{background-color:#3b73ed66!important;color:#fff!important}}.selected{font-weight:700}.selected .dropdown-item-icon{opacity:1}.selected .dropdown-item-count{color:#fff;background-color:#3b73ed}.selected .full-icon{color:#fff}.selected .end-item-base,.selected .end-item-hover{font-weight:700;color:#92b1f5}.selected .end-item-base .icon,.selected .end-item-base .icon-sm,.selected .end-item-hover .icon,.selected .end-item-hover .icon-sm{color:#92b1f5}.dropdown-item-icon{opacity:0;color:#92b1f5;width:14px;height:14px;margin-left:auto}.dropdown-item-icon.no-margin{margin-left:0}.dropdown-item-count{position:absolute;right:6px;top:50%;transform:translateY(-50%);padding:2px 5px;border-radius:10px;background-color:#424242;color:#ffffffb2;min-width:18px;line-height:14px;font-weight:600;font-size:11px;text-align:center}.fraud-icon{color:#fab15c!important;height:18px;width:18px}.dropdown-icon-container{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;display:grid;place-items:center;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-icon-container.open .dropdown-icon{transform:rotateX(180deg)}.dropdown-icon{transition:transform .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)!important;transform:rotateX(0);cursor:pointer}.has-dropdown .app-input-icon{right:26px}.has-dropdown:has(.app-input:focus-visible) .subcontent{right:26px!important}.has-dropdown:has(.app-input:focus-visible).has-text .subcontent,.has-dropdown:has(.app-input:focus-visible).has-selected .subcontent{right:48px!important}.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}@media(hover:hover){.has-dropdown:hover:not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}}.has-right .app-input{text-align:right}@media(pointer:coarse){.has-right .app-input{transform-origin:right center}}.has-right .positive-icon,.has-right .app-input-icon{left:4px;right:auto}.has-right .cancel-button{z-index:1}.has-right.has-number .plus-button-container{order:2}.has-right.has-number .minus-button-container{order:1}.has-right.static-placeholder .app-input-icon{right:4px!important;left:auto!important;opacity:0!important}.has-right.static-placeholder:has(.app-input:focus-visible) .cancel-button{opacity:0!important;pointer-events:none!important}.has-right.static-placeholder.removable .cancel-button .bg-icon{background-color:transparent!important}@media(hover:hover){.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon{color:var(--color-icon-positive)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon{color:var(--color-icon-neutral)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon{color:var(--color-icon-negative)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button{opacity:1!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button .bg-icon{opacity:1!important;pointer-events:auto!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon,.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon-sm{opacity:0!important}}@media(hover:hover){.has-right.static-placeholder:hover:not(:has(.app-input:focus-visible)):not(:has(.app-input:disabled)).has-text .cancel-button{opacity:1!important}}.has-right .app-input{order:1}.has-right.has-subcontent .app-input{flex:1;min-width:0;word-break:none}.has-right .dropdown-selected{margin-left:0!important;text-align:right!important;right:0!important;left:0!important;justify-content:flex-end!important;width:100%!important}.has-right .subcontent{position:relative!important;order:1;display:grid;place-items:center;padding-right:4px;height:unset!important;transform:translateY(0)!important;left:0!important;right:unset!important}.has-right .subcontent .subcontent-hide{display:none!important}.has-right.has-text .subcontent{left:0!important;right:unset!important}.has-right:has(.app-input:focus-visible) .subcontent{left:0!important;right:unset!important}.has-right.has-icon .subcontent,.has-right.has-password .subcontent{padding-right:0!important;padding-left:4px}.has-right.has-icon .dropdown-selected,.has-right.has-password .dropdown-selected{width:calc(100% - 24px)!important}.has-right.has-icon .app-input,.has-right.has-password .app-input{padding-right:0!important}.has-right.has-icon .app-input-label,.has-right.has-password .app-input-label{left:0!important}.has-right.has-icon.fade-placeholder .app-input-label,.has-right.has-password.fade-placeholder .app-input-label{left:auto!important;right:24px!important}.has-right.has-icon .icon-container,.has-right.has-password .icon-container{width:30px;padding-left:4px}.has-right.has-icon .icon-container .icon,.has-right.has-icon .icon-container .icon-sm,.has-right.has-password .icon-container .icon,.has-right.has-password .icon-container .icon-sm{order:2}.has-right.has-dropdown .app-input-icon{left:26px}.has-right.has-dropdown .dropdown-icon-container{left:4px}.has-right .warning-icon{display:none!important}.has-right.has-number .separator{order:3}.has-right.has-number .number-buttons{left:0;right:unset}.has-right.has-number .number-container{left:4px;right:unset}.has-right.has-number.app-input-container:has(.app-input:focus-visible) .app-input{padding-left:4px}@media(hover:hover){.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .number-container{width:60px}.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .app-input{padding-left:4px}}.has-right .icon-container{order:2;margin-right:4px}.has-right .icon-container .password-icons{order:2}.has-right.fade-placeholder .app-input-label{right:0!important;left:auto!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:after{content:none!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:before{content:\"* \";color:var(--color-text-negative)}@media(hover:hover){.removable:has(.cancel-button:hover).in-table{background-color:transparent!important}.removable:has(.cancel-button:hover).in-table .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):not(.in-table){background-color:var(--color-surface-negative-hover)!important}.removable:has(.cancel-button:hover):not(.in-table) .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus)!important}.removable:has(.cancel-button:hover):has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}}.no-clear .cancel-button{display:none!important}.is-adding{padding-right:20px}.is-adding .dropdown-icon{opacity:0!important}.is-adding .accept-button{pointer-events:none;opacity:0!important}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.is-adding:has(.app-input:focus-visible){padding-right:48px!important}@media(hover:hover){.is-adding:hover{padding-right:48px!important}}.is-adding.has-right{padding-left:26px}.is-adding.has-right.has-right:has(.app-input:focus-visible){padding-left:40px}@media(hover:hover){.is-adding.has-right.has-right:hover{padding-left:40px}}.is-adding .app-input-icon{right:4px}@media(hover:hover){.is-adding.has-text:hover .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:hover .accept-button{pointer-events:auto;opacity:1!important}}.is-adding.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:has(.app-input:focus-visible) .accept-button{pointer-events:auto;opacity:1!important}.is-adding .cancel-button{opacity:1!important;pointer-events:auto}.is-adding .dropdown-icon-container{pointer-events:none}.is-adding .accept-button{right:26px;pointer-events:auto}.dropdown-selected{-webkit-user-select:none;user-select:none;position:absolute;top:50%;transform:translateY(-50%);left:0;width:calc(100% - 22px);pointer-events:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;word-break:break-all;padding:.25rem 6px;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),width .1s ease-in-out;color:var(--color-text);display:flex;gap:4px}.dropdown-selected .dropdown-selected-content{overflow:hidden;-webkit-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.dropdown-selected .dropdown-selected-hazardous{max-width:calc(100% - 22px)}p.dropdown-selected{-webkit-user-select:none;user-select:none;display:block}.app-input-container:has(.app-input:focus-visible) .dropdown-selected{color:#fff;opacity:.7}.app-input-container:has(.app-input:focus-visible) .dropdown-selected .option-icon{color:#fff!important}.has-icon .positive-icon,.has-icon .warning-icon{display:none}.has-icon .dropdown-selected{left:27px;width:calc(100% - 49px)}@media(hover:hover){.has-icon:hover .dropdown-selected{width:calc(100% - 71px)}}.has-icon.app-input-container:has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 71px)}.hazard-icon{height:18px;width:max-content}.has-dispatch .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.dispatch-load-count{color:#dadada;font-weight:700}.dispatch-separator{color:#919191;font-weight:400}.dispatch-status{font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:14px;letter-spacing:0%;text-transform:uppercase;color:#ffffffb2;border-radius:2px;padding:2px 4px;display:flex;justify-content:center;align-items:center;gap:4px}.dispatch-status.status-available{background-color:#50ac2533}.dispatch-status.status-dispatched{background-color:#3b73ed33}.dispatch-status.status-arrivedpickup,.dispatch-status.status-checkedinpickup,.dispatch-status.status-checkedin,.dispatch-status.status-loading,.dispatch-status.status-loaded{background-color:#259f9433}.dispatch-status.status-arriveddelivery,.dispatch-status.status-checkedindelivery,.dispatch-status.status-offloading,.dispatch-status.status-offloaded,.dispatch-status.status-empty{background-color:#ff704333}.dispatch-status.status-canceled{background-color:#df3c3c33}.dispatch-status.status-off,.dispatch-status.status-deadheading,.dispatch-status.status-break,.dispatch-status.status-split{background-color:#91919133}.dispatch-status.status-towing{background-color:#9e47ec33}.dispatch-status.status-repair,.dispatch-status.status-dispatchedrepair,.dispatch-status.status-loadedrepair{background-color:#865e3a33}.dispatch-status .status-block{border-radius:1px;background-color:#aaa;padding-left:2px;padding-right:2px;font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:12px;text-align:center;color:#2f2f2f;min-width:12px;height:12px}.dispatch-status .status-block.blue{background-color:#6692f1}.dispatch-status .status-block.green{background-color:#56b4ac}.dispatch-status .status-block.orange{background-color:#ff906d}.has-ftl-dispatch,.has-dispatch{min-width:600px}.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon{color:#fff}.dropdown-subitem{display:flex;justify-content:left;align-items:center;gap:4px}.truck-item{width:128px}.trailer-item{width:138px}.truck-trailer-option{opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);margin-left:auto}.truck-trailer-icon-colors.ic_truck_semi-truck,.truck-trailer-icon-colors.ic_truck_semi-wSleeper{color:#92b1f5}.truck-trailer-icon-colors.ic_truck_box-truck,.truck-trailer-icon-colors.ic_truck_reefer,.truck-trailer-icon-colors.ic_truck_cargo-van{color:#fbc88b}.truck-trailer-icon-colors.ic_truck_cement,.truck-trailer-icon-colors.ic_truck_dump,.truck-trailer-icon-colors.ic_truck_garbage{color:#ed9292}.truck-trailer-icon-colors.ic_truck_tow-truck,.truck-trailer-icon-colors.ic_truck_car-hauler,.truck-trailer-icon-colors.ic_truck_spotter{color:#86c9c3}.truck-trailer-icon-colors.ic_trailer_flatbed,.truck-trailer-icon-colors.ic_trailer_low-boy,.truck-trailer-icon-colors.ic_trailer_step-deck{color:#92b1f5}.truck-trailer-icon-colors.ic_trailer_chassis,.truck-trailer-icon-colors.ic_trailer_container{color:#80d6f1}.truck-trailer-icon-colors.ic_trailer_conestoga,.truck-trailer-icon-colors.ic_trailer_side-kit{color:#8785e8}.truck-trailer-icon-colors.ic_trailer_dryvan,.truck-trailer-icon-colors.ic_trailer_reefer{color:#fbc88b}.truck-trailer-icon-colors.ic_trailer_end-dump,.truck-trailer-icon-colors.ic_trailer_bottom-dump,.truck-trailer-icon-colors.ic_trailer_hopper{color:#ed9292}.truck-trailer-icon-colors.ic_trailer_tanker,.truck-trailer-icon-colors.ic_trailer_tanker-pneumatic{color:#ed93bb}.truck-trailer-icon-colors.ic_trailer_carhauler,.truck-trailer-icon-colors.ic_trailer_carhauler-stinger{color:#86c9c3}.sub-label{margin-left:auto;margin-right:22px;opacity:0;transition:margin .1s ease-in-out,opacity .1s ease-in-out;color:#6c6c6c}.app-input-label:has(.sub-label),.app-input-label:has(.accident-state){width:100%}.has-selected .sub-label{opacity:1}.dispatch-icon,.trailer-icon,.truck-icon{color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.truck-icon,.trailer-icon{width:42px}.truck-number{width:80px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.trailer-number{width:90px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.driver-name{max-width:170px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.dropdown-subitem-end{margin-left:auto;position:relative;height:26px;width:auto;display:flex;justify-content:right;align-items:center;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;vertical-align:bottom}.end-item-base{position:absolute;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);text-align:right}.dispatch-ltl{font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.unassigned-ltl{margin-left:auto;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.end-item-hover{position:absolute;display:flex;justify-content:right;align-items:center;gap:4px;width:max-content;opacity:0;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.selected-end-item{margin-left:auto;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;display:flex;justify-content:right;align-items:center;gap:4px}.group-item{font-family:Montserrat;font-weight:700!important;font-size:11px!important;line-height:18px;letter-spacing:0%;vertical-align:middle;text-transform:uppercase;background-color:#2f2f2f;color:#aaa!important}.group-item:not(:first-child){border-top:1px solid #424242}.group-item .group-icon{margin-left:auto;transform:rotate(180deg);transition:transform .1s cubic-bezier(.46,.03,.51,.95)}.group-item.unfolded{color:#fff!important}.group-item.unfolded .group-icon{transform:rotate(0)}.counter{background-color:#424242;padding:1px 4px;border-radius:60px;font-family:Montserrat;font-weight:600;font-size:11px;min-width:18px;line-height:14px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#ffffffb2;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.password-requirement{padding:6px;background-color:#fffffff2!important;box-shadow:0 0 4px #0006;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);overflow-y:hidden}.password-requirement p{font-family:Montserrat;font-weight:600;font-size:11px;line-height:14px;letter-spacing:0%;vertical-align:middle;color:#6c6c6c;font-style:italic}.password-requirement .icon,.password-requirement .icon-sm{width:14px!important;height:14px!important}.password-requirement .icon.checkmark,.password-requirement .checkmark.icon-sm{color:#ccc}.password-requirement .icon.cancel,.password-requirement .cancel.icon-sm{color:#e66767}.password-requirement ul{list-style-type:none;margin:6px 0 0;padding:0}.password-requirement ul li{color:#424242;font-size:11px;font-style:italic;font-weight:500;line-height:14px;display:flex;gap:4px}.password-requirement ul li.valid{color:#919191!important}.password-requirement ul li:not(:first-child){margin-top:6px}@media(hover:hover){.has-end-item:not(:has(.app-input:disabled)):hover .dropdown-selected{width:calc(100% - 44px)}}.has-end-item:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 44px)}.progress-bar{width:24px;height:8px;border-radius:2px;position:relative;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar:after{content:\"\";position:absolute;top:0;width:var(--progress);height:100%;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar.low{background-color:#df3c3c33}.progress-bar.low:after{background-color:#e66767}.progress-bar.medium{background-color:#f89b2e33}.progress-bar.medium:after{background-color:#fab15c}.progress-bar.high{background-color:#56b4ac33}.progress-bar.high:after{background-color:#56b4ac}.progress-bar.disable{background-color:#91919133}.progress-bar.disable:after{display:none}.app-input-container:has(.app-input:focus-visible) .selected-end-item .progress-bar{background-color:#fff!important}.full-icon{color:#919191}.fuelcard-number{width:216px}.fuelcard-brand{width:132px}.owner-ein{width:118px}.accident-name,.accident-unit,.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{flex-shrink:0}.accident-name>p,.accident-unit>p{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-name{width:218px}.accident-unit{width:170px}.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{text-align:right;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-dob{width:134px}.accident-cdl-number{width:140px}.accident-vin{width:182px}.accident-plate{width:140px}.accident-state{margin-left:auto;justify-content:flex-end;text-align:right}.app-input-label .accident-state{margin-right:22px;white-space:nowrap;transition:margin .1s ease-in-out}.has-multiple-dropdown.has-text{border-top-left-radius:0!important;border-top-right-radius:0!important}.multiple-container{display:flex;flex-wrap:wrap;gap:4px;padding:4px;border-top-left-radius:2px;border-top-right-radius:2px;position:relative;transition:background-color .1s ease-in-out;background-color:#e9effd}.multiple-container.hovered{background-color:#bed0f9}.multiple-container.hovered .multiple-selected{background-color:#e9effd}.multiple-container.focused{background-color:#0b49d1}.multiple-container.focused .multiple-selected{background-color:#3b73ed;color:#fff}.multiple-selected{background-color:#bed0f9;color:#2f2f2f;transition:background-color .1s ease-in-out,color .1s ease-in-out;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;padding:2px 4px;-webkit-user-select:none;user-select:none;font-family:Montserrat;font-size:14px;font-weight:400;line-height:18px;width:209px;height:22px;border-radius:1px}.multiple-selected p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media(hover:hover){.multiple-selected:hover{color:#2f2f2f!important;background-color:#fff!important}.multiple-selected:hover .multiple-remove-button{opacity:1}}.multiple-selected .multiple-remove-button{opacity:0;background-color:#6692f1;color:#fff;width:14px;height:14px}.multiple-selected .multiple-remove-button .multiple-remove-icon{width:12px;height:12px}.multiple-label{color:#424242;-webkit-user-select:none;user-select:none;pointer-events:none;font-family:Montserrat;font-size:11px;font-style:normal;font-weight:600;position:absolute;top:0;left:6px;transform:translateY(-14px)}.dropdown-group{border-radius:2px;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),max-height .1s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;margin-top:4px;max-height:var(--max-height);height:var(--max-height);overflow:hidden}.dropdown-group.no-items{cursor:default;pointer-events:none}.dropdown-group .group-item{outline:none;color:#fff!important;font-weight:400!important;font-size:14px!important;display:flex;transition:font-weight .1s ease-in-out,background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);padding-left:6px;padding-right:6px}.dropdown-group .group-item.unfolded .counter{color:#fff}@media(hover:hover){.dropdown-group .group-item:hover .counter{color:#fff}}.dropdown-group .group-item.unfolded{font-weight:700!important}.dropdown-group .group-item .counter{margin-left:auto}.dropdown-group .group-item .group-icon{margin-left:0}.dropdown-group.active{background-color:#424242}@media(hover:hover){.dropdown-group.active .group-item:hover{background-color:#424242}}.dropdown-group.active .dropdown-item{background-color:#424242}@media(hover:hover){.dropdown-group:hover:not(.no-items){background-color:#424242}.dropdown-group:hover:not(.no-items) .group-item:hover{background-color:#424242}.dropdown-group:hover:not(.no-items) .dropdown-item{background-color:#424242}}.dropdown-group.active{padding:4px;padding-top:0!important}.dropdown-group.active .group-item{position:relative!important;padding-left:2px!important;padding-right:2px!important}@media(hover:hover){.dropdown-group .dropdown-item:not(.group-item):hover{background-color:#6c6c6c!important}}.fuel-stop-transaction-store{display:flex;gap:4px}.fuel-stop-transaction-store .fuel-stop-transaction-store-address{font-size:11px;color:#ccc;margin-left:auto}.fuel-stop-transaction-store .favorite-icon{color:#92b1f5;width:14px;height:14px}.fuel-stop-transaction-nostore{padding-left:2px;padding-right:2px}.hide-dropdown{opacity:0;pointer-events:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown) .dropdown-menu-content{transition:max-height .2s cubic-bezier(.46,.03,.51,.95),opacity .2s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;animation:dropdown-menu-opening .2s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown).animate-dropdown .dropdown-menu-content{max-height:var(--max-height);height:var(--max-height)}.closing:not(.hide-dropdown) .dropdown-menu-content{animation:dropdown-menu-closing .2s cubic-bezier(.46,.03,.51,.95);opacity:0;max-height:0}@keyframes dropdown-menu-opening{0%{max-height:0;opacity:0}to{max-height:244px;opacity:1}}@keyframes dropdown-menu-closing{0%{max-height:244px;opacity:1}to{max-height:0;opacity:0}}.app-input-container:has(.app-input:focus-visible).has-dropdown .loader.loading,.app-input-container:has(.app-input:focus-visible).has-text .loader.loading{opacity:1!important}.app-input-container:has(.app-input:focus-visible).has-dropdown.has-text .loader{transform:translate(-48px)}.loader{position:absolute;top:4px;right:0;transform:translate(-26px);pointer-events:none;z-index:1000;width:18px;height:18px;display:flex;align-items:center;justify-content:center;transition:opacity .1s ease-in-out,transform .1s ease-in-out;opacity:0}.loader-icon{width:14px;height:14px;animation:spin .8s ease-in-out infinite;transform-origin:center;display:flex;align-items:center;justify-content:center}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.size-22{height:22px}.size-22 .icon,.size-22 .icon-sm{height:14px!important;width:14px!important}.size-22 .bg-icon{height:14px!important;width:14px!important;padding:2px!important}.size-22 .icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.size-22 .app-input{padding-top:2px;padding-bottom:2px;padding-left:4px}@media(pointer:coarse){.size-22 .app-input{height:22px}}.size-22 .app-input-label{padding-top:2px;padding-bottom:2px;padding-left:4px}.size-22.has-icon .app-input-label{padding-left:0!important}.size-22 .app-input-icon{height:14px!important;width:14px!important}.size-22.has-text .app-input-label,.size-22:has(.app-input:focus-visible) .app-input-label{transform:translateY(-18px)}.size-22 .loader{top:2px;transform:translate(-22px)!important}.strikethrough .app-input,.strikethrough .dropdown-selected-content{text-decoration:line-through}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.split-option>p{max-width:calc(50% - 2px)}.split-option .dropdown-subitem-end{width:calc(50% - 2px)}.split-option .end-item-base,.split-option .end-item-hover{max-width:100%}.selected-end-item-truncate{max-width:50%}.truck-owner-unit{min-width:0}.truck-owner-unit .dropdown-content{max-width:none;min-width:0}.truck-owner-bullet{flex-shrink:0;color:#919191}\n"], dependencies: [{ kind: "directive", type:
|
|
4799
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: InputComponent, isStandalone: true, selector: "cai-input", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, preselectedOptions: { classPropertyName: "preselectedOptions", publicName: "preselectedOptions", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, hideValidation: { classPropertyName: "hideValidation", publicName: "hideValidation", isSignal: true, isRequired: false, transformFunction: null }, showNoResults: { classPropertyName: "showNoResults", publicName: "showNoResults", isSignal: true, isRequired: false, transformFunction: null }, preselectedUnit: { classPropertyName: "preselectedUnit", publicName: "preselectedUnit", isSignal: true, isRequired: false, transformFunction: null }, unassignedCount: { classPropertyName: "unassignedCount", publicName: "unassignedCount", isSignal: true, isRequired: false, transformFunction: null }, forceInvalidStyling: { classPropertyName: "forceInvalidStyling", publicName: "forceInvalidStyling", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onBlur: "onBlur", onFocused: "onFocused", onReset: "onReset", onValueChange: "onValueChange", onOptionAdded: "onOptionAdded", onAdd: "onAdd", onSelectionChange: "onSelectionChange", onSelectedObject: "onSelectedObject", onSelectedGroup: "onSelectedGroup", onClear: "onClear", onAutofill: "onAutofill", onScrolledToBottom: "onScrolledToBottom", onScrolledToBottomGroup: "onScrolledToBottomGroup", onSearch: "onSearch", onValueAdded: "onValueAdded", onRemove: "onRemove", onHoverRemove: "onHoverRemove" }, host: { listeners: { "realValueChange": "onRealValueChange($event)" } }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "closeTooltip", first: true, predicate: ["closeTooltip"], descendants: true }, { propertyName: "PasswordDirective", first: true, predicate: PasswordDirective, descendants: true }, { propertyName: "NumberFormatDirective", first: true, predicate: NumberFormatDirective, descendants: true }, { propertyName: "MaskDirective", first: true, predicate: MaskDirective, descendants: true }], ngImport: i0, template: "<!-- #region Variables -->\n@let valid =\n ngControl?.valid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let invalid =\n ngControl?.invalid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let subcontent =\n config().subcontent ||\n (config().dropdown === \"subcontent\" &&\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![config().optionLabel || \"label\"]);\n\n@let name = config().name;\n@let password = config().type === \"password\" || config().type === \"account\";\n\n@let optionLabel = this.config().optionLabel || \"label\";\n@let dropdownType = this.config().dropdown;\n\n@let focusedOptionIndex = keyboardNavigationState().singleIndex;\n@let groupedNavigationState = keyboardNavigationState().groupedNavigationState;\n\n@let tooltipClass =\n config().inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n<!-- #region Multiple selection -->\n@if (config().dropdown === \"multiple\" && !!multipleSelectedOptions().length) {\n <div\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"toggleHovered(true)\"\n (mouseleave)=\"toggleHovered(false)\"\n class=\"multiple-container\"\n [class]=\"{\n focused: focused(),\n hovered: hovered(),\n }\"\n >\n <label class=\"multiple-label\">{{ name }}</label>\n\n @for (option of multipleSelectedOptions(); track $index) {\n <div class=\"multiple-selected\">\n <p>{{ cast(option, \"dropdownOption\")![optionLabel || \"label\"] }}</p>\n <button\n type=\"button\"\n class=\"\"\n (pointerdown)=\"handleOption(option, $event)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Clear\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n [container]=\"'body'\"\n >\n <svg-icon\n name=\"cai-cancel\"\n class=\"multiple-remove-button multiple-remove-icon bg-icon\"\n ></svg-icon>\n </button>\n </div>\n }\n </div>\n}\n<!-- #endregion -->\n\n@let hasFloatingError =\n invalid &&\n (config().errorBehavior === \"floating\" ||\n (!!config().inTable && config().placeholderBehavior !== \"static\"));\n\n<div\n class=\"app-input-container\"\n [class]=\"\n {\n config: config(),\n hideValidation: hideValidation(),\n isPasswordVisible: visible(),\n isInvalid: !!invalid || forceInvalidStyling(),\n isValid: !!valid && !forceInvalidStyling(),\n isHovered: hovered(),\n hasText: hasText(),\n isAdding: isAdding(),\n selectedOption: selectedOption(),\n } | inputClass\n \"\n ngbDropdown\n [autoClose]=\"false\"\n #dropdown=\"ngbDropdown\"\n dropdownClass=\"cai-dropdown\"\n #containerRef\n [ngbTooltip]=\"errorTooltip\"\n [disableTooltip]=\"!hasFloatingError\"\n [container]=\"'body'\"\n [placement]=\"['bottom', 'top']\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip \"\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"dropdownType === 'multiple' && toggleHovered(true)\"\n (mouseleave)=\"dropdownType === 'multiple' && toggleHovered(false)\"\n>\n @if (config().icon && !password && !config().withButtons) {\n <div\n class=\"icon-container\"\n (pointerdown)=\"focus($event)\"\n [class]=\"{\n 'colored-icon': config().iconColor,\n }\"\n [style.--icon-color]=\"config().iconColor || ''\"\n >\n <svg-icon class=\"icon\" [name]=\"config().icon || ''\"></svg-icon>\n @if (!config().noSeparator) {\n <div class=\"separator\"></div>\n }\n </div>\n }\n @if (password) {\n <div class=\"icon-container\" (pointerdown)=\"toggleVisibility($event)\">\n <div\n class=\"password-icons\"\n [ngbTooltip]=\"passwordTooltip\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [placement]=\"'top'\"\n [openDelay]=\"600\"\n >\n <svg-icon\n class=\"icon password-key hover-icon\"\n name=\"cai-password-key\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-shown hover-icon\"\n name=\"cai-password-shown\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-hidden hover-icon\"\n name=\"cai-password-hidden\"\n ></svg-icon>\n </div>\n <div class=\"separator\"></div>\n </div>\n }\n\n <input\n class=\"app-input\"\n [tabindex]=\"isDisabled() ? '-1' : '0'\"\n [type]=\"\n password && !isPartiallyMasked()\n ? visible()\n ? 'text'\n : 'password'\n : 'text'\n \"\n [required]=\"config().required\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (blur)=\"dispatchOnBlur()\"\n [id]=\"id()\"\n [attr.aria-label]=\"config().label\"\n [attr.name]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n [placeholder]=\"config()?.placeholder || ''\"\n [autocomplete]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n #inputRef\n [appPassword]=\"password\"\n [appMask]=\"config().mask || ''\"\n [phone]=\"config().type === 'phone'\"\n [isInternational]=\"config().isInternational || false\"\n [phoneCountries]=\"config().phoneCountries\"\n [defaultDialCode]=\"config().defaultDialCode\"\n [attr.inputmode]=\"config().type === 'phone' ? 'tel' : null\"\n [appNumberRangeList]=\"config().numberRangeList || false\"\n [reveal]=\"config().reveal || 0\"\n [hide]=\"config().hide || 0\"\n [account]=\"config().type === 'account'\"\n [visible]=\"visible()\"\n [appNumberFormat]=\"config().type === 'number'\"\n [isNumberFormattingDisabled]=\"config().isNumberFormattingDisabled || false\"\n [numberFormat]=\"config().numberFormat\"\n [disableDecimals]=\"config().disableDecimals || false\"\n [prefix]=\"config().prefix || ''\"\n [max]=\"config().max\"\n [clampToMax]=\"config().clampToMax || false\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus($event)\"\n />\n @if (\n !(dropdownType === \"multiple\" && !!multipleSelectedOptions().length) &&\n config().placeholderBehavior !== \"hidden\"\n ) {\n <label\n class=\"app-input-label\"\n [class.placeholder-color]=\"this.config().placeholderColor\"\n [style.--placeholder-color]=\"this.config().placeholderColor || ''\"\n (click)=\"focus($event)\"\n >\n <!-- Truck Trailer Driver Dropdown label -->\n @if (dropdownType === \"dispatch\" || dropdownType === \"ftl-dispatch\") {\n <p class=\"truck-item app-input-name\">Truck</p>\n <p class=\"trailer-item\">Trailer</p>\n <p>Driver</p>\n <p class=\"sub-label\">Rate</p>\n }\n <!-- Split Load -->\n @else if (dropdownType === \"split-driver\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Rate</p>\n } @else if (\n dropdownType === \"split-truck\" || dropdownType === \"split-trailer\"\n ) {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Location</p>\n }\n <!-- Dropdown variants -->\n @else if (dropdownType === \"broker\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Credit</p>\n } @else if (dropdownType === \"contact\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Phone</p>\n } @else if (dropdownType === \"shipper\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Address</p>\n } @else if (dropdownType === \"owner\") {\n <p class=\"owner-ein app-input-name\">EIN</p>\n <p class=\"app-input-name\">Company Name</p>\n } @else if (dropdownType === \"fuelcard\") {\n <p class=\"fuelcard-number app-input-name\">Card No.</p>\n <p class=\"fuelcard-brand app-input-name\">Provider</p>\n <p class=\"app-input-name\">Nickname</p>\n }\n <!-- Accident -->\n @else if (dropdownType === \"accident-driver\") {\n <p class=\"accident-name app-input-name\">{{ name }}</p>\n <p class=\"accident-dob app-input-name\">DOB</p>\n <p class=\"accident-cdl-number app-input-name\">CDL No.</p>\n <p class=\"accident-state app-input-name\">CDL State</p>\n } @else if (\n dropdownType === \"accident-truck\" || dropdownType === \"accident-trailer\"\n ) {\n <p class=\"accident-unit app-input-name\">{{ name }}</p>\n <p class=\"accident-vin app-input-name\">VIN</p>\n <p class=\"accident-plate app-input-name\">Lic. Plate No.</p>\n <p class=\"accident-state app-input-name\">Lic. State</p>\n }\n <!-- Default Dropdown label -->\n @else {\n <span class=\"app-input-name\">{{ name }}</span>\n }\n </label>\n }\n @if (config().type === \"number\" && config().withButtons) {\n <div class=\"number-container\">\n <div class=\"number-buttons\">\n <div class=\"separator\"></div>\n <div\n class=\"plus-button-container\"\n ngbTooltip=\"Add\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n (pointerdown)=\"increment($event)\"\n >\n <svg-icon name=\"cai-plus\" class=\"bg-icon plus-icon\"></svg-icon>\n </div>\n <div\n class=\"minus-button-container\"\n ngbTooltip=\"Remove\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n (pointerdown)=\"decrement($event)\"\n >\n <svg-icon name=\"cai-minus\" class=\"bg-icon minus-icon\"></svg-icon>\n </div>\n </div>\n </div>\n }\n @if (!config().inTable) {\n @if (!dropdownType) {\n <svg-icon\n name=\"cai-checkmark\"\n class=\"app-input-icon positive-icon\"\n ></svg-icon>\n <svg-icon\n name=\"cai-status-warning\"\n class=\"app-input-icon warning-icon\"\n ></svg-icon>\n }\n }\n\n @if (\n invalid &&\n config().errorBehavior !== \"hidden\" &&\n (ngControl?.errors | errorMessage: config().customErrors : config().numberFormat)[0] &&\n !(config().inTable && config().placeholderBehavior !== \"static\")\n ) {\n <div class=\"app-input-error\">\n {{ (ngControl?.errors | errorMessage: config().customErrors : config().numberFormat)[0] }}\n </div>\n }\n\n <!-- Accept button -->\n @if ((config().add && isAdding()) || config().isEdit) {\n <button\n type=\"button\"\n class=\"app-input-icon button-icon accept-button\"\n (pointerdown)=\"addOption()\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Confirm\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n >\n <svg-icon class=\"bg-icon\" name=\"cai-checkmark\"></svg-icon>\n </button>\n }\n\n <!-- Cancel button -->\n <button\n type=\"button\"\n class=\"app-input-icon button-icon cancel-button\"\n (pointerdown)=\"reset($event)\"\n (mouseenter)=\"onClearHover(true)\"\n (mouseleave)=\"onClearHover(false)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"{{\n hasText()\n | clearTooltip\n : isAdding()\n : config().isEdit || false\n : config().placeholderBehavior || 'dynamic'\n : dropdownType === 'multiple'\n : config().hasResetButton\n : canTooltipBeVisible()\n }}\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n >\n @let iconName =\n config().hasResetButton\n ? \"cai-reset\"\n : config().removable\n ? \"cai-delete\"\n : \"cai-cancel\";\n <svg-icon class=\"bg-icon\" [name]=\"iconName\"></svg-icon>\n </button>\n\n <div class=\"dropdown-anchor\" ngbDropdownAnchor></div>\n <!-- Dropdown menu -->\n\n @let hasLoader = isLoading() !== undefined;\n\n @if (hasLoader) {\n <div class=\"loader\" [class.loading]=\"isLoading()\">\n <svg-icon name=\"cai-loader\" class=\"loader-icon\"></svg-icon>\n </div>\n }\n\n @if (dropdownType) {\n @let maxHeight =\n ((dropdownOptions()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n @let animateDropdown =\n dropdownType !== \"toll\" &&\n dropdownType !== \"fuel-stop-transaction\" &&\n dropdownType !== \"dispatch\" &&\n dropdownType !== \"ftl-dispatch\" &&\n dropdownType !== \"split-driver\" &&\n dropdownType !== \"split-truck\" &&\n dropdownType !== \"split-trailer\";\n\n @let unfilteredHeight =\n dropdownType === \"contact\" || !animateDropdown\n ? 244\n : ((options()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n <div\n ngbDropdownMenu\n class=\"dropdown-menu input-dropdown-menu\"\n [class]=\"{\n 'hide-dropdown':\n config().dropdownAutocomplete &&\n !dropdownOptions()?.length &&\n !(showNoResults() && value()),\n 'animate-dropdown': animateDropdown,\n 'size-22': config().size === 22,\n 'has-stroke': config().hasStroke,\n }\"\n [class.closing]=\"closing()\"\n [style.--unfiltered-height]=\"\n unfilteredHeight > 244 ? '244px' : unfilteredHeight + 'px'\n \"\n [style.--max-height]=\"maxHeight > 244 ? '244px' : maxHeight + 'px'\"\n [style.width.px]=\"containerWidth()\"\n [tabindex]=\"-1\"\n (pointerdown)=\"onDropdownBackgroundClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <div\n class=\"dropdown-menu-content\"\n [tabindex]=\"-1\"\n caiInfiniteScroll\n [scrollThreshold]=\"50\"\n (scrolledToBottom)=\"onDropdownScrolledToBottom()\"\n >\n @if (config().add) {\n <button\n class=\"dropdown-item add-new\"\n [class.focused]=\"\n focusedOptionIndex === -1 ||\n groupedNavigationState?.groupIndex === -1\n \"\n (click)=\"handleAddingOption($event)\"\n >\n <p>ADD NEW</p>\n <svg-icon name=\"cai-plus\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"dropdownMenuRef\"></ng-container>\n </div>\n </div>\n\n @if (!config().dropdownAutocomplete) {\n <div\n class=\"dropdown-icon-container\"\n [class.open]=\"dropdown.isOpen() && !closing()\"\n (pointerdown)=\"onDropdownIconClick($event)\"\n >\n <svg-icon\n name=\"cai-arrow-secondary-down\"\n class=\"dropdown-icon icon\"\n ></svg-icon>\n </div>\n }\n @let specialDropdown =\n dropdownType === \"dispatch\" ||\n dropdownType === \"ftl-dispatch\" ||\n dropdownType === \"broker\" ||\n dropdownType === \"contact\" ||\n dropdownType === \"shipper\" ||\n dropdownType === \"bank\" ||\n dropdownType === \"dispatcher\" ||\n dropdownType === \"driver-owner\" ||\n dropdownType === \"truck-owner\" ||\n dropdownType === \"truck\" ||\n dropdownType === \"trailer\" ||\n dropdownType === \"hazardous\" ||\n dropdownType === \"state\" ||\n dropdownType === \"owner\" ||\n dropdownType === \"fuelcard\" ||\n dropdownType === \"pm\" ||\n dropdownType === \"color\" ||\n dropdownType === \"make\" ||\n dropdownType === \"toll\" ||\n dropdownType === \"provider\" ||\n dropdownType === \"split-driver\" ||\n dropdownType === \"split-truck\" ||\n dropdownType === \"split-trailer\" ||\n dropdownType === \"accident-driver\" ||\n dropdownType === \"accident-truck\" ||\n dropdownType === \"accident-trailer\";\n <!-- Placeholder -->\n @if (specialDropdown) {\n <ng-container *ngTemplateOutlet=\"selectedOptionRef\"></ng-container>\n } @else if (\n (config().add || config().search) &&\n !inputRef.value &&\n !this.isAdding() &&\n dropdownType !== \"subcontent\"\n ) {\n <div class=\"dropdown-selected\">\n @if (config().placeholderBehavior === \"static\") {\n <p class=\"selected-label-hidden\">\n {{ name + (config().required ? \" *\" : \"\") }}\n </p>\n <p class=\"selected-text\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n @if (\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ] === \"Hazardous\"\n ) {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n }\n }\n </div>\n }\n } @else if (config().isEdit && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ name }}</p>\n </div>\n }\n @if (config().passwordRequirements) {\n <div\n class=\"dropdown-menu password-requirement\"\n ngbDropdownMenu\n [style.width.px]=\"containerWidth()\"\n [class.closing]=\"closing()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <ng-container *ngTemplateOutlet=\"passwordRequirementsRef\"></ng-container>\n </div>\n }\n @if (subcontent) {\n <p class=\"subcontent\">\n @if (!(config().alignment === \"right\")) {\n <span class=\"subcontent-hide\"\n >{{\n config().search\n ? selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n : inputRef.value\n }}\n </span>\n }\n {{ subcontent }}\n </p>\n }\n</div>\n\n<!-- #region Templates -->\n\n<!-- #region Password requirements -->\n<ng-template #passwordRequirementsRef>\n @let isMinLengthValid =\n !this.ngControl?.errors?.[\"minlength\"] && this.value();\n @let isHasNumberValid =\n !this.ngControl?.errors?.[\"hasNumber\"] && this.value();\n @let isHasSymbolValid =\n !this.ngControl?.errors?.[\"hasSymbol\"] && this.value();\n @let isHasUppercaseValid =\n !this.ngControl?.errors?.[\"hasUppercase\"] && this.value();\n\n <p>Strong Password Requirement</p>\n <ul>\n <li [class.valid]=\"isMinLengthValid\">\n <svg-icon\n [name]=\"isMinLengthValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isMinLengthValid ? 'checkmark' : 'cancel'\"\n class=\"icon\"\n ></svg-icon\n ><span>Minimum 8 characters</span>\n </li>\n <li [class.valid]=\"isHasNumberValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasNumberValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasNumberValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One number</span>\n </li>\n <li [class.valid]=\"isHasSymbolValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasSymbolValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasSymbolValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One symbol</span>\n </li>\n <li [class.valid]=\"isHasUppercaseValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasUppercaseValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasUppercaseValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One upper-case letter</span>\n </li>\n </ul>\n</ng-template>\n<!-- #endregion -->\n@let search = config().search;\n\n<ng-template #dropdownMenuRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"dispatchesRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"ftlDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"brokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"contactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"shipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"bankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"dispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"driverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"truckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"trailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"truckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"hazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"stateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"ownerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"fuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"pmRef\"></ng-container>\n }\n @case (\"multiple\") {\n <ng-container *ngTemplateOutlet=\"multipleRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"makeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"tollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"colorRef\"></ng-container>\n }\n @case (\"fuel-stop-transaction\") {\n <ng-container *ngTemplateOutlet=\"fuelStopTransactionRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"providerRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"splitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"splitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"splitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container *ngTemplateOutlet=\"accidentDriverRef\"></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"accidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container *ngTemplateOutlet=\"accidentTrailerRef\"></ng-container>\n }\n @case (\"subcontent\") {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n }\n</ng-template>\n\n<ng-template #selectedOptionRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"selectedBrokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"selectedContactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"selectedShipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"selectedBankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedDriverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedTrailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"selectedHazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"selectedStateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"selectedOwnerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"selectedFuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"selectedPmRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"selectedMakeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"selectedTollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"selectedColorRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"selectedProviderRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentDriverRef\"\n ></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedAccidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentTrailerRef\"\n ></ng-container>\n }\n }\n</ng-template>\n\n<!-- Standard dropdown -->\n<ng-template #dropdownOptionsRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dropdownOption')?.id === dropdownOption.id,\n focused: focusedOptionIndex === index,\n }\"\n (click)=\"handleOption(dropdownOption, $event)\"\n >\n @if (dropdownOption[optionLabel] === \"Hazardous\") {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n }\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #multipleRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n (click)=\"handleOption(dropdownOption, $event)\"\n [class]=\"{\n selected: isSelectedOption(dropdownOption),\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #bankRef>\n @if (dropdownOptions().length) {\n @for (bank of dropdownOptions(); track $index; let index = $index) {\n @let bankOption = cast(bank, \"bank\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ bankOption.id }}\"\n (click)=\"handleOption(bankOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'bank')?.id === bankOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (bankOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"bankOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (bankOption.name || '' | highlightSearch: value())\n : bankOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #makeRef>\n @if (dropdownOptions().length) {\n @for (make of dropdownOptions(); track $index; let index = $index) {\n @let makeOption = cast(make, \"make\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ makeOption.id }}\"\n (click)=\"handleOption(makeOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'make')?.id === makeOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (makeOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"makeOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (makeOption.name || '' | highlightSearch: value())\n : makeOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Broker -->\n<ng-template #brokerRef>\n @if (dropdownOptions().length) {\n @for (broker of dropdownOptions(); track $index; let index = $index) {\n @let brokerOption = cast(broker, \"broker\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"broker-{{ brokerOption.id }}\"\n (click)=\"\n !(brokerOption.dnu || brokerOption.ban) &&\n handleOption(brokerOption, $event)\n \"\n [class]=\"{\n selected: cast(selectedOption(), 'broker')?.id === brokerOption.id,\n focused: focusedOptionIndex === index,\n banned: brokerOption.dnu || brokerOption.ban,\n dnu: brokerOption.dnu,\n }\"\n >\n @if (brokerOption?.dnu || brokerOption?.ban) {\n <svg-icon name=\"cai-minus\" class=\"round-icon\"></svg-icon>\n } @else if (brokerOption?.fraudCheck) {\n <svg-icon\n name=\"cai-status-warning-lite\"\n class=\"fraud-icon\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (brokerOption.businessName || '' | highlightSearch: value())\n : brokerOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n @if (!brokerOption.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>{{ brokerOption.availableCredit || 0 | currency }}</p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).status\n \"\n ></div>\n }\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ brokerOption.loadsCount }} |\n {{ brokerOption.availableCredit || 0 | currency }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Contact dropdown -->\n<ng-template #contactRef>\n @if (dropdownOptions().length) {\n @for (contact of dropdownOptions(); track $index; let index = $index) {\n @let contactOption = cast(contact, \"contact\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"contact-{{ contact.id }}\"\n (click)=\"handleOption(contact, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'contact')?.id === contact.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (contactOption.contactName || '' | highlightSearch: value())\n : contactOption.contactName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p class=\"text-truncate\">{{ contactOption.department?.name }}</p>\n </div>\n <div class=\"end-item-hover\">\n <p class=\"text-truncate\">\n {{ contactOption.phone }}\n {{\n contactOption.extensionPhone\n ? \"x\" + contactOption.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Owner dropdown -->\n<ng-template #ownerRef>\n @if (dropdownOptions().length) {\n @for (owner of dropdownOptions(); track $index; let index = $index) {\n @let ownerOption = cast(owner, \"owner\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"owner-{{ ownerOption?.id }}\"\n (click)=\"handleOption(ownerOption!, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'owner')?.id === ownerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"owner-ein\"\n [innerHTML]=\"\n search\n ? (ownerOption?.ein || '' | highlightSearch: value())\n : ownerOption?.ein\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (ownerOption?.name || '' | highlightSearch: value())\n : ownerOption?.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Fuelcard dropdown -->\n<ng-template #fuelcardRef>\n @if (dropdownOptions().length) {\n @for (fuelcard of dropdownOptions(); track $index; let index = $index) {\n @let fuelcardOption = cast(fuelcard, \"fuelCard\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"fuelcard-{{ fuelcardOption?.id }}\"\n (click)=\"handleOption(fuelcardOption!, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'fuelCard')?.id === fuelcardOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"fuelcard-number\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.number || '' | highlightSearch: value())\n : fuelcardOption?.number\n \"\n ></p>\n <p\n class=\"fuelcard-brand\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.brand || '' | highlightSearch: value())\n : fuelcardOption?.brand\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (fuelcardOption?.account || '' | highlightSearch: value())\n : fuelcardOption?.account\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident driver dropdown -->\n<ng-template #accidentDriverRef>\n @if (dropdownOptions().length) {\n @for (driver of dropdownOptions(); track $index; let index = $index) {\n @let driverOption = cast(driver, \"accidentDriver\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-driver-{{ driverOption.id }}\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentDriver')?.id === driverOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <p class=\"accident-dob\">\n {{ driverOption.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p\n class=\"accident-cdl-number\"\n [innerHTML]=\"driverOption.cdlNumber || '' | highlightSearch: value()\"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n driverOption.cdlState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n driverOption.cdlState?.countryType?.name &&\n driverOption.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n driverOption.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n driverOption.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident truck dropdown -->\n<ng-template #accidentTruckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"accidentTruck\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-truck-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTruck')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (truckOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n [name]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"truckOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n truckOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n truckOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n truckOption.licenseState?.countryType?.name &&\n truckOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n truckOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n truckOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident trailer dropdown -->\n<ng-template #accidentTrailerRef>\n @if (dropdownOptions().length) {\n @for (trailer of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(trailer, \"accidentTrailer\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-trailer-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTrailer')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (trailerOption.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n [name]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"trailerOption.trailerNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"trailerOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n trailerOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n trailerOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n trailerOption.licenseState?.countryType?.name &&\n trailerOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n trailerOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n trailerOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Shipper dropdown -->\n<ng-template #shipperRef>\n @if (dropdownOptions().length) {\n @for (shipper of dropdownOptions(); track $index; let index = $index) {\n @let shipperOption = cast(shipper, \"shipper\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"shipper-{{ shipperOption.id }}\"\n (click)=\"handleOption(shipperOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'shipper')?.id === shipperOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.businessName || '' | highlightSearch: value())\n : shipperOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.address?.address || ''\n | highlightSearch: value())\n : shipperOption.address?.address\n \"\n ></p>\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ shipperOption.pickupCount }} Pickup |\n {{ shipperOption.deliveryCount }} Delivery\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatch dropdown -->\n<ng-template #dispatchesRef>\n @if (dropdownOptions().length) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"resetSelection()\"\n [class]=\"{\n selected: !selectedOption(),\n }\"\n >\n <p>Unassigned</p>\n <div class=\"unassigned-ltl\">\n <p>{{ unassignedCount() }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </button>\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n <!-- Temporary variant since BE doesn't support boards -->\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base dispatch-ltl\">\n <p>{{ dispatch.numberOfSingleLtlLoads }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- ftl dispatch dropdown -->\n<ng-template #ftlDispatchRef>\n @if (dropdownOptions().length) {\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <!-- Load Status -->\n @let dispatchStatus = dispatch.status | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (dispatch.status?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ dispatch.status?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ dispatch?.pendingLoadCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitDriverRef>\n @if (dropdownOptions().length) {\n @for (splitDriverBoard of dropdownOptions(); track splitDriverBoard.id) {\n @let driverBoard = cast(splitDriverBoard, \"splitDriverBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(driverBoard.id, $event)\"\n [class]=\"{\n unfolded: (driverBoard.drivers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n driverBoard.isTeamBoard ? \"Team Board\" : driverBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ driverBoard.drivers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (driver of driverBoard.drivers || []; track driver.id) {\n @let driverOption = cast(driver, \"splitDriver\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitDriver')?.id === driverOption.id,\n }\"\n >\n <div class=\"dropdown-subitem\">\n <div class=\"dropdown-avatar\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n </div>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n driverOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (driverOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ driverOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ driverOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ driverOption.payTypeValue }}</p>\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTruckRef>\n @if (dropdownOptions().length) {\n @for (splitTruckBoard of dropdownOptions(); track splitTruckBoard.id) {\n @let truckBoard = cast(splitTruckBoard, \"splitTruckBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(truckBoard.id, $event)\"\n [class]=\"{\n unfolded: (truckBoard.trucks?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n truckBoard.isTeamBoard ? \"Team Board\" : truckBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ truckBoard.trucks?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (truck of truckBoard.trucks || []; track truck.id) {\n @let truckOption = cast(truck, \"splitTruck\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTruck')?.id === truckOption.id,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [style.--truck-color]=\"truckOption.color?.code || ''\"\n [name]=\"truckOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus = truckOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (truckOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ truckOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ truckOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n truckOption.location?.city &&\n truckOption.location?.stateShortName\n ) {\n <p>\n {{ truckOption.location?.city }},\n {{ truckOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTrailerRef>\n @if (dropdownOptions().length) {\n @for (splitTrailerBoard of dropdownOptions(); track splitTrailerBoard.id) {\n @let trailerBoard = cast(splitTrailerBoard, \"splitTrailerBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(trailerBoard.id, $event)\"\n [class]=\"{\n unfolded: (trailerBoard.trailers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n trailerBoard.isTeamBoard\n ? \"Team Board\"\n : trailerBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ trailerBoard.trailers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (trailer of trailerBoard.trailers || []; track trailer.id) {\n @let trailerOption = cast(trailer, \"splitTrailer\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTrailer')?.id === trailerOption.id,\n }\"\n >\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [style.--trailer-color]=\"trailerOption.color?.code || ''\"\n [name]=\"trailerOption.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n trailerOption.trailerNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n trailerOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (trailerOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ trailerOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ trailerOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n trailerOption.location?.city &&\n trailerOption.location?.stateShortName\n ) {\n <p>\n {{ trailerOption.location?.city }},\n {{ trailerOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #tollRef>\n @if (dropdownOptions().length) {\n @for (toll of dropdownOptions(); track $index; let groupIndex = $index) {\n @let tollOption = cast(toll, \"tollOption\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item pe-none\"\n [class]=\"{\n unfolded: tollOption.tollTransponders?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{ tollOption.groupName }}\n </p>\n </button>\n @let tollTransponders = tollOption.tollTransponders || [];\n @for (\n tollTransponder of tollTransponders;\n track tollTransponder.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(tollTransponder, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'tollTransponderOption')?.id ===\n tollTransponder.id,\n focused: isOptionFocused,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (tollTransponder.name || '' | highlightSearch: value())\n : tollTransponder.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatcher dropdown -->\n\n<ng-template #dispatcherRef>\n @if (dropdownOptions().length) {\n @for (dispatcher of dropdownOptions(); track $index; let index = $index) {\n @let dispatcherOption = cast(dispatcher, \"dispatcher\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dispatcherOption.id }}\"\n (click)=\"handleOption(dispatcherOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatcher')?.id === dispatcherOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (dispatcherOption.fullName || '' | highlightSearch: value())\n : dispatcherOption.fullName\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Driver Owner dropdown -->\n\n<ng-template #driverOwnerRef>\n @if (dropdownOptions().length) {\n @for (driverOwner of dropdownOptions(); track $index; let index = $index) {\n @let driverOwnerOption = cast(driverOwner, \"driverOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ driverOwnerOption.id }}\"\n (click)=\"handleOption(driverOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'driverOwner')?.id === driverOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (driverOwnerOption.fullName || '' | highlightSearch: value())\n : driverOwnerOption.fullName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ driverOwnerOption.driverType | driverTypeLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Truck Owner dropdown -->\n\n<ng-template #truckOwnerRef>\n @if (dropdownOptions().length) {\n @for (truckOwner of dropdownOptions(); track $index; let index = $index) {\n @let truckOwnerOption = cast(truckOwner, \"truckOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOwnerOption.id }}\"\n (click)=\"handleOption(truckOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOwner')?.id === truckOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem truck-owner-unit\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.truckNumber || ''\n | highlightSearch: value())\n : truckOwnerOption.truckNumber\n \"\n ></p>\n @if (truckOwnerOption.model) {\n <p class=\"truck-owner-bullet\">\u2022</p>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.model | highlightSearch: value())\n : truckOwnerOption.model\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #truckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"truckOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOption')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (truckOption.name || '' | highlightSearch: value())\n : truckOption.name\n \"\n ></p>\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"truckOption.logoName.slice(0, -4)\"\n [name]=\"truckOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #trailerRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(truck, \"trailerOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'trailerOption')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (trailerOption.name || '' | highlightSearch: value())\n : trailerOption.name\n \"\n ></p>\n\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"trailerOption.logoName.slice(0, -4)\"\n [name]=\"trailerOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #providerRef>\n @if (dropdownOptions().length) {\n @for (provider of dropdownOptions(); track $index; let index = $index) {\n @let providerOption = cast(provider, \"provider\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ providerOption?.id }}\"\n (click)=\"handleOption(providerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'provider')?.id === providerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"full-icon\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Hazardous dropdown -->\n<ng-template #hazardousRef>\n @if (dropdownOptions().length) {\n @for (hazardous of dropdownOptions(); track $index; let index = $index) {\n @let hazardousOption = cast(hazardous, \"hazardous\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ hazardousOption.id }}\"\n (click)=\"handleOption(hazardousOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'hazardous')?.id === hazardousOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon [name]=\"hazardousOption.logoName?.slice(0, -4)\"></svg-icon>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (hazardousOption.description || '' | highlightSearch: value())\n : hazardousOption.description\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #pmRef>\n @if (dropdownOptions().length) {\n @for (pm of dropdownOptions(); track $index; let index = $index) {\n @let pmOption = cast(pm, \"pmOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ pmOption.id }}\"\n (click)=\"handleOption(pmOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'pmOption')?.id === pmOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"pmOption.title | remapPmIcons\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (pmOption.title || '' | highlightSearch: value())\n : pmOption.title\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #colorRef>\n @if (dropdownOptions().length) {\n @for (color of dropdownOptions(); track $index; let index = $index) {\n @let colorOption = cast(color, \"colorOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item color-item\"\n id=\"option-{{ colorOption.id }}\"\n (click)=\"handleOption(colorOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'colorOption')?.id === colorOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (colorOption.name || '' | highlightSearch: value())\n : colorOption.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #stateRef>\n @if (dropdownOptions().length) {\n @for (state of dropdownOptions(); track $index; let index = $index) {\n @let stateOption = cast(state, \"state\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ stateOption.id }}\"\n (click)=\"handleOption(stateOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'state')?.id === stateOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (stateOption.stateShortName +\n ' ' +\n (config().fullState\n ? ' (' + stateOption?.stateName + ')'\n : '') || '' | highlightSearch: value())\n : stateOption.stateShortName +\n ' ' +\n (config().fullState ? ' (' + stateOption?.stateName + ')' : '')\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #fuelStopTransactionRef>\n @if (dropdownOptions().length) {\n @for (\n franchise of dropdownOptions();\n track franchise.id;\n let groupIndex = $index\n ) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let franchiseOption = cast(franchise, \"franchise\")!;\n @if (franchiseOption?.count !== null) {\n <div\n class=\"dropdown-group\"\n [class.no-items]=\"!franchiseOption?.count\"\n [class]=\"{\n active: openGroup() === franchiseOption.id,\n }\"\n [style.--max-height]=\"\n openGroup() === franchiseOption.id\n ? 30 * ((franchiseOption.fuelStopStores?.length || 0) + 1) + 'px'\n : '26px'\n \"\n >\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(franchiseOption.id, $event, franchiseOption)\"\n [class]=\"{\n unfolded: openGroup() === franchiseOption.id,\n focused: isGroupFocused,\n }\"\n >\n <p\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n <p class=\"counter\">{{ franchiseOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @if (openGroup() === franchiseOption.id) {\n @if (franchiseOption.fuelStopStores?.length || 0 > 0) {\n @for (\n fuelStopStore of franchiseOption.fuelStopStores;\n track fuelStopStore.id\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === $index + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item fuel-stop-transaction-store\"\n [class]=\"{\n focused: isOptionFocused,\n }\"\n (click)=\"handleOption(fuelStopStore, $event)\"\n >\n <p\n [innerHTML]=\"\n fuelStopStore?.store ?? '' | highlightSearch: value()\n \"\n ></p>\n @let city = fuelStopStore?.address?.city ?? \"\";\n @let state = fuelStopStore?.address?.stateShortName ?? \"\";\n @let zip = fuelStopStore?.address?.zipCode ?? \"\";\n <p\n class=\"fuel-stop-transaction-store-address\"\n [innerHTML]=\"\n city + (state || zip ? ', ' : '') + state + ' ' + zip\n | highlightSearch: value()\n \"\n ></p>\n\n @if (fuelStopStore?.[\"favourite\"]) {\n <svg-icon\n name=\"cai-favorite\"\n class=\"favorite-icon\"\n ></svg-icon>\n }\n </button>\n }\n <!-- Infinite scroll trigger - emits event when item comes into view -->\n <div\n class=\"dropdown-infinite-scroll-item\"\n caiIntersectionObserver\n [threshold]=\"0.1\"\n (inView)=\"onDropdownScrolledToBottom(true)\"\n ></div>\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n </div>\n } @else {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n [class.focused]=\"\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0\n \"\n (click)=\"handleOption(franchiseOption, $event)\"\n >\n <p\n class=\"fuel-stop-transaction-nostore\"\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- #endregion -->\n\n<!-- #region Selected options -->\n\n<!-- selected dispatch -->\n<ng-template #selectedDispatchRef>\n @let dispatchOption = cast(selectedOption(), \"dispatch\");\n @if (dispatchOption && !inputRef.value && !isAdding()) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"dispatchOption!.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ dispatchOption!.truck.truckNumber }}\n </p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatchOption!.trailer) {\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"\n cast(\n selectedOption(),\n 'dispatch'\n )!.trailer?.trailerType?.logoName?.slice(0, -4)\n \"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ dispatchOption!.trailer?.trailerNumber }}\n </p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatchOption!.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" & \" +\n dispatchOption!.coDriver?.firstName\n }}\n </p>\n } @else {\n <cai-avatar\n [driver]=\"dispatchOption!.driver\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" \" +\n dispatchOption!.driver.lastName\n }}\n </p>\n }\n </div>\n <p class=\"selected-end-item\">\n {{ dispatchOption!.payType }}\n </p>\n </div>\n } @else {\n @if (!inputRef.value && this.config().dropdown == \"dispatch\") {\n <p class=\"dropdown-selected\">Unassigned</p>\n }\n }\n</ng-template>\n\n<!-- selected broker -->\n<ng-template #selectedBrokerRef>\n @let brokerOption = cast(selectedOption(), \"broker\");\n @if (brokerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (brokerOption!.fraudCheck) {\n <svg-icon name=\"cai-status-warning-lite\" class=\"fraud-icon\"></svg-icon>\n }\n <p class=\"dropdown-selected-content\">{{ brokerOption!.businessName }}</p>\n <div class=\"selected-end-item\">\n @if (!brokerOption!.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>\n {{ brokerOption!.availableCredit || 0 | currency }}\n </p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).status\n \"\n ></div>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedContactRef>\n @let contactOption = cast(selectedOption(), \"contact\");\n @if (contactOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ contactOption?.contactName }}</p>\n <div class=\"selected-end-item\">\n <p>\n {{ contactOption?.phone }}\n {{\n contactOption?.extensionPhone\n ? \"x\" + contactOption?.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedShipperRef>\n @let shipperOption = cast(selectedOption(), \"shipper\");\n @if (shipperOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ shipperOption?.businessName }}</p>\n <div class=\"selected-end-item selected-end-item-truncate\">\n <p class=\"text-truncate\">{{ shipperOption?.address?.address }}</p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedOwnerRef>\n @let ownerOption = cast(selectedOption(), \"owner\");\n @if (ownerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"owner-ein\">{{ ownerOption?.ein }}</p>\n <p class=\"\">{{ ownerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedFuelcardRef>\n @let fuelcardOption = cast(selectedOption(), \"fuelCard\");\n @if (fuelcardOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"fuelcard-number\">\n {{ fuelcardOption?.number }}\n </p>\n <p class=\"fuelcard-brand\">\n {{ fuelcardOption?.brand }}\n </p>\n <p class=\"\">\n {{ fuelcardOption?.account }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedBankRef>\n @let bankOption = cast(selectedOption(), \"bank\");\n @if (bankOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (bankOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"bankOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ bankOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedProviderRef>\n @let providerOption = cast(selectedOption(), \"provider\");\n @if (providerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedMakeRef>\n @let makeOption = cast(selectedOption(), \"make\");\n @if (makeOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (makeOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"makeOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ makeOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedStateRef>\n @let stateOption = cast(selectedOption(), \"state\");\n @if (stateOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ stateOption?.stateShortName }}\n {{ config().fullState ? \" (\" + stateOption?.stateName + \")\" : \"\" }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDispatcherRef>\n @let dispatcherOption = cast(selectedOption(), \"dispatcher\");\n @if (dispatcherOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ dispatcherOption?.fullName }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDriverOwnerRef>\n @let driverOwnerOption = cast(selectedOption(), \"driverOwner\");\n @if (driverOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ driverOwnerOption?.fullName }}</p>\n <p class=\"selected-end-item driver-type\">\n {{ driverOwnerOption?.driverType | driverTypeLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckOwnerRef>\n @let truckOwnerOption = cast(selectedOption(), \"truckOwner\");\n @if (truckOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p class=\"dropdown-selected-content\">\n {{ truckOwnerOption.truckNumber }}\n @if (truckOwnerOption.model) {\n <span class=\"truck-owner-bullet\">\u2022</span>\n {{ truckOwnerOption.model }}\n }\n </p>\n <p class=\"selected-end-item driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckRef>\n @let truckOption = cast(selectedOption(), \"truckOption\");\n @if (truckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"truckOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ truckOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTrailerRef>\n @let trailerOption = cast(selectedOption(), \"trailerOption\");\n @if (trailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"trailerOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ trailerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedHazardousRef>\n @let hazardousOption = cast(selectedOption(), \"hazardous\");\n @if (hazardousOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"hazard-icon\"\n [name]=\"hazardousOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content dropdown-selected-hazardous\">\n {{ hazardousOption?.description }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedPmRef>\n @let pmOption = cast(selectedOption(), \"pmOption\");\n @if (pmOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"pmOption?.title | remapPmIcons\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ pmOption?.title }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedColorRef>\n @let colorOption = cast(selectedOption(), \"colorOption\");\n @if (colorOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ colorOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTollRef>\n @let tollOption = cast(selectedOption(), \"tollTransponderOption\");\n @if (tollOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">\n {{ tollOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitDriverRef>\n @let splitDriverOption = cast(selectedOption(), \"splitDriver\");\n @if (splitDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem\">\n <cai-avatar [driver]=\"splitDriverOption\" [size]=\"18\"></cai-avatar>\n <p class=\"driver-name\">\n {{ splitDriverOption.firstName + \" \" + splitDriverOption.lastName }}\n </p>\n </div>\n </div>\n\n <p class=\"selected-end-item\">\n {{ splitDriverOption.payTypeValue }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTruckRef>\n @let splitTruckOption = cast(selectedOption(), \"splitTruck\");\n @if (splitTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"splitTruckOption!.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ splitTruckOption!.truckNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTruckOption!.location?.city &&\n splitTruckOption!.location?.stateShortName\n ) {\n {{ splitTruckOption!.location?.city }},\n {{ splitTruckOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTrailerRef>\n @let splitTrailerOption = cast(selectedOption(), \"splitTrailer\");\n @if (splitTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"splitTrailerOption!.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ splitTrailerOption!.trailerNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTrailerOption!.location?.city &&\n splitTrailerOption!.location?.stateShortName\n ) {\n {{ splitTrailerOption!.location?.city }},\n {{ splitTrailerOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentDriverRef>\n @let accidentDriverOption = cast(selectedOption(), \"accidentDriver\");\n @if (accidentDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"accidentDriverOption!\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p>\n {{\n accidentDriverOption!.firstName +\n \" \" +\n accidentDriverOption!.lastName\n }}\n </p>\n </div>\n <p class=\"accident-dob\">\n {{ accidentDriverOption!.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p class=\"accident-cdl-number\">\n {{ accidentDriverOption!.cdlNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentDriverOption!.cdlState?.stateShortName }}</p>\n @if (\n accidentDriverOption!.cdlState?.countryType?.name &&\n accidentDriverOption!.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentDriverOption!.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentDriverOption!.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTruckRef>\n @let accidentTruckOption = cast(selectedOption(), \"accidentTruck\");\n @if (accidentTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTruckOption!.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"accidentTruckOption!.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTruckOption!.truckNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTruckOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTruckOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTruckOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTruckOption!.licenseState?.countryType?.name &&\n accidentTruckOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTruckOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTruckOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTrailerRef>\n @let accidentTrailerOption = cast(selectedOption(), \"accidentTrailer\");\n @if (accidentTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTrailerOption!.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon option-icon\"\n [name]=\"accidentTrailerOption!.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTrailerOption!.trailerNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTrailerOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTrailerOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTrailerOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTrailerOption!.licenseState?.countryType?.name &&\n accidentTrailerOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTrailerOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTrailerOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #passwordTooltip>\n {{ visible() ? \"Hide\" : \"Show\" }}\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (\n (config().errorBehavior === \"floating\" ||\n (config().errorBehavior === \"static\" && hasText()) ||\n config().inTable) &&\n invalid &&\n !dropdown.isOpen()\n ) {\n {{ (ngControl?.errors | errorMessage: config().customErrors : config().numberFormat)[0] }}\n }\n</ng-template>\n\n<!-- #endregion -->\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.app-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;position:relative;border-radius:2px;background-color:var(--color-surface-neutral);color:var(--color-text);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);display:flex}.app-input-container.inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #ffffff;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.app-input-container.inverse:not(.has-error):not(.has-valid) .app-input:focus-visible{color:#2f2f2f}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon,.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon,.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse.has-text:has(.app-input:disabled) .app-input-label{color:#424242!important}.app-input-container.hovered{background-color:var(--color-surface-neutral-hover)}.app-input-container.hovered:not(:has(.app-input:disabled)) .sub-label,.app-input-container.hovered:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}@media(hover:hover){.app-input-container:hover{background-color:var(--color-surface-neutral-hover)}.app-input-container:hover:not(:has(.app-input:disabled)) .sub-label,.app-input-container:hover:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}}.app-input-container.has-text .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container.has-text.fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container.has-text .subcontent{opacity:1!important}.app-input-container.has-text.static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text)}@media(hover:hover){.app-input-container.has-text.is-address:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:hover .bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral-hover)}}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible){background-color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container:has(.app-input:focus-visible) .subcontent{opacity:1!important;color:#ffffffb2;left:unset!important;right:4px!important}.app-input-container:has(.app-input:focus-visible).has-text .subcontent{right:26px!important}.app-input-container:has(.app-input:focus-visible) .sub-label,.app-input-container:has(.app-input:focus-visible) .app-input-label .accident-state{margin-right:44px}.app-input-container:has(.app-input:focus-visible).fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container:has(.app-input:focus-visible).static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text-inverse)!important}.app-input-container:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}.app-input-container:has(.app-input:disabled){background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled).hovered{background-color:var(--color-surface-disable)}@media(hover:hover){.app-input-container:has(.app-input:disabled):hover{background-color:var(--color-surface-disable)}}.app-input-container:has(.app-input:disabled):focus{background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled) .app-input-label{color:var(--color-text-subtle)}.app-input-container:has(.app-input:disabled) .separator{background-color:var(--color-icon-disable)}.app-input-container:has(.app-input:disabled) .dropdown-icon-container{opacity:0;pointer-events:none!important}.app-input-container:has(.app-input:disabled) .dropdown-selected:has(.selected-end-item){width:100%}.app-input-container:has(.app-input:disabled) .driver-type{color:#919191}.app-input-container:has(.app-input:disabled) .icon-container{pointer-events:none!important}.app-input-container:has(.app-input:disabled):not(.disabled-removable) .cancel-button{display:none!important}.app-input-container:has(.app-input:required):not(:has(.app-input:disabled)) .app-input-name:after{content:\" *\";color:var(--color-text-negative)}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .dropdown-icon-container:hover .dropdown-icon{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .hover-icon:hover{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.canceled .app-input-label,.app-input-container.canceled .app-input{color:var(--color-text-subtle)!important}.app-input-container.canceled .icon-container .icon,.app-input-container.canceled .icon-container .icon-sm{color:var(--color-icon-disable)!important}.subcontent{pointer-events:none;position:absolute;left:6px;color:#919191;-webkit-user-select:none;user-select:none;top:50%;transform:translateY(-50%);transition:right .1s ease-in-out,left .1s ease-in-out,transform .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);opacity:0;font-family:Montserrat;font-weight:400;font-style:Regular;font-size:14px;line-height:18px;letter-spacing:0%;height:18px;overflow:hidden}.subcontent .subcontent-hide{opacity:0!important}.app-input-label{position:absolute;display:flex;gap:4px;left:0;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.app-input-label.placeholder-color{color:var(--placeholder-color)!important}.app-input{padding:.25rem 6px;width:100%;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.app-input:focus-visible{color:var(--color-text-inverse)}@media(pointer:coarse){.app-input{font-size:16px;transform:scale(.875);transform-origin:left center;height:26px}}.app-input-error{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;pointer-events:none;-webkit-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text-negative);transform:translateY(-10px)}.app-input-container.has-error{background-color:var(--color-surface-negative)}.app-input-container.has-error:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-error:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-error:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-error.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-error.hovered{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error.hovered.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error.hovered.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}@media(hover:hover){.app-input-container.has-error:hover{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error:hover.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error:hover.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}}.app-input-container.has-error:has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus);color:var(--color-text-inverse)}.app-input-container.has-error:has(.app-input:focus-visible).has-text .button-icon{opacity:1}.app-input-container.has-error:has(.app-input:focus-visible).has-text .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.app-input-container.has-error:has(.app-input:focus-visible).is-empty,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected){background-color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .app-input-error,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .app-input-error{opacity:0}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .bg-icon,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .bg-icon{color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .warning-icon,.app-input-container.has-error.is-empty:has(.app-input:not(:focus-visible)) .warning-icon{opacity:1!important}.app-input-container.has-error .app-input-error{opacity:1;transform:translateY(0);pointer-events:auto}.app-input-container.has-error .app-input::selection{background-color:#ffffff4d}.app-input-container.has-error .icon-container .separator,.app-input-container.has-error .dropdown-icon-container .separator{background-color:var(--color-icon-negative)}.app-input-container.has-error .icon-container .icon,.app-input-container.has-error .icon-container .icon-sm,.app-input-container.has-error .dropdown-icon-container .icon,.app-input-container.has-error .dropdown-icon-container .icon-sm{color:var(--color-icon-negative)}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.has-valid:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-valid:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-valid:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-valid.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-valid.has-text:not(.has-dropdown):not(.in-table),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.in-table),.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.in-table){background-color:var(--color-surface-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible){background-color:var(--color-surface-positive-focus);color:var(--color-text-inverse)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon{opacity:1}.app-input-container.has-valid.has-text:not(.has-dropdown) .app-input::selection,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .app-input::selection,.app-input-container.has-valid.has-multiple-dropdown.has-text .app-input::selection{background-color:#ffffff4d}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .separator,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .separator{background-color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon-sm{color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .password-key{opacity:0;pointer-events:none}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.in-table,.in-table.has-error,.in-table.has-valid.has-text{background-color:transparent}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)) .app-input{color:var(--color-text-negative)}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)):not(.static-placeholder) .app-input-label{color:var(--color-text-negative)}.in-table .dropdown-icon-container{opacity:0}@media(hover:hover){.in-table:hover .dropdown-icon-container{opacity:1}}.in-table:has(.app-input:focus-visible) .dropdown-icon-container{opacity:1}.app-input-icon{position:absolute;right:4px;top:4px;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.button-icon{opacity:0;pointer-events:none}@media(hover:hover){.button-icon:hover{cursor:pointer}}.bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);transform-box:border-box;transform-origin:center;will-change:transform}.bg-icon svg{transition:transform .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.bg-icon:hover{transform:scale(1.2222222222)}.bg-icon:hover svg{transform:scale(.8181818182)}}.bg-icon:active{transform:scale(1)}.round-icon{background-color:#919191;color:#2f2f2f;border-radius:50%;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.positive-icon{color:var(--color-icon-positive);height:18px;width:18px;display:grid;place-items:center;opacity:0}.warning-icon{color:var(--color-icon-negative);height:18px;width:18px;display:grid;place-items:center;opacity:0}.text-color-positive:not(:hover):not(:has(.app-input:focus-visible)) .app-input{color:#3b73ed}.is-plan.has-selected .app-input,.is-plan.has-selected .dropdown-selected-content,.is-plan.has-selected .selected-text{font-weight:700}.is-plan.has-selected:not(:has(.app-input:focus-visible)) .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .selected-text{color:#3b73ed}@media(hover:hover){.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .selected-text{color:#0b49d1}}.floating-error .app-input-error{opacity:0!important}.static-error .app-input-error{pointer-events:none!important;transform:translateY(calc(-100% - 4px))!important;transition:margin .1s ease-in-out,opacity .1s ease-in-out}.static-error.has-icon .app-input-error{margin-right:26px!important}.static-error:has(.app-input:not(:focus-visible)) .app-input-error{opacity:1}.static-error.has-text .app-input-error{opacity:0!important}.static-placeholder .app-input-label{position:relative;white-space:nowrap;font-size:11px;font-weight:600}.static-placeholder .dropdown-selected{overflow:hidden;display:flex!important;justify-content:left!important}.static-placeholder .dropdown-selected .selected-label-hidden{width:max-content;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;pointer-events:none}.static-placeholder .dropdown-selected .selected-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}.static-placeholder .app-input{padding-left:0!important}.static-placeholder.has-dropdown .cancel-button{display:none}.static-placeholder.has-dropdown .dropdown-icon-container .dropdown-icon{opacity:0;pointer-events:none}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container .dropdown-icon{opacity:1!important}@media(hover:hover){.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container .dropdown-icon{opacity:1!important}}.static-placeholder.has-dropdown .dropdown-icon-container{right:4px!important;left:auto!important}.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm{color:var(--color-icon-inverse)!important}.app-input-container.has-icon.colored-icon .icon-container .icon,.app-input-container.has-icon.colored-icon .icon-container .icon-sm,.app-input-container.has-password.colored-icon .icon-container .icon,.app-input-container.has-password.colored-icon .icon-container .icon-sm,.app-input-container.has-dropdown.colored-icon .icon-container .icon,.app-input-container.has-dropdown.colored-icon .icon-container .icon-sm{color:var(--icon-color)}.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm{color:var(--color-icon-disable)!important}.app-input-container.has-icon .positive-icon,.app-input-container.has-icon .warning-icon,.app-input-container.has-password .positive-icon,.app-input-container.has-password .warning-icon,.app-input-container.has-dropdown .positive-icon,.app-input-container.has-dropdown .warning-icon{display:none!important}.app-input-container.has-icon .icon,.app-input-container.has-icon .icon-sm,.app-input-container.has-password .icon,.app-input-container.has-password .icon-sm,.app-input-container.has-dropdown .icon,.app-input-container.has-dropdown .icon-sm{height:18px;width:18px;display:grid;place-items:center;color:var(--color-icon-neutral);transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);opacity:1}.app-input-container.has-icon:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}@media(hover:hover){.app-input-container.has-icon:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}}.icon-sm{height:14px;width:14px}.app-input-container.has-icon .icon-container,.app-input-container.has-password .icon-container{height:26px;display:flex;justify-items:center;align-items:center;gap:4px;padding:.25rem 0 .25rem 6px}@media(hover:hover){.app-input-container.has-icon .icon-container:hover,.app-input-container.has-password .icon-container:hover{cursor:text}}.app-input-container.has-icon .subcontent,.app-input-container.has-password .subcontent{left:32px}.app-input-container.has-icon .app-input-label,.app-input-container.has-password .app-input-label{left:27px}.app-input-container.has-icon .app-input,.app-input-container.has-password .app-input{padding-left:4px}.separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);opacity:40%}.has-password .password-icons{display:grid;place-items:center;position:relative;height:18px;width:18px}.has-password .password-icons .icon,.has-password .password-icons .icon-sm{position:absolute;opacity:0}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-key{opacity:1!important}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-icons{pointer-events:none}.has-password:has(.app-input:disabled) .password-icons{pointer-events:none}.has-password.has-text .password-hidden,.has-password:has(.app-input:focus-visible) .password-hidden{opacity:1!important}@media(hover:hover){.has-password.has-text .password-hidden:hover,.has-password:has(.app-input:focus-visible) .password-hidden:hover{cursor:pointer}}.has-visible.has-text .password-shown,.has-visible:has(.app-input:focus-visible) .password-shown{opacity:1!important}@media(hover:hover){.has-visible.has-text .password-shown:hover,.has-visible:has(.app-input:focus-visible) .password-shown:hover{cursor:pointer}}.has-visible.has-text .password-hidden,.has-visible:has(.app-input:focus-visible) .password-hidden{opacity:0!important;pointer-events:none}.has-number .number-container{position:relative;display:flex;justify-content:center;align-items:center;right:4px;pointer-events:none}.has-number .number-buttons{display:flex;gap:4px;position:absolute;right:0;justify-content:center;align-items:center;opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);pointer-events:none}.has-number .plus-icon,.has-number .minus-icon{cursor:pointer;pointer-events:none}.has-number:has(.app-input:focus-visible){cursor:text}.has-number:has(.app-input:focus-visible) .number-buttons{opacity:1}.has-number:has(.app-input:focus-visible) .plus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .minus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .button-icon{opacity:0!important;pointer-events:none!important}.has-number:has(.app-input:focus-visible) .number-container{width:60px}.has-number:has(.app-input:focus-visible) .subcontent{right:52px!important}.has-number:has(.app-input:focus-visible).has-text .subcontent{right:52px!important}.colored-icon .icon,.colored-icon .icon-sm{color:var(--icon-color)!important}.dropdown-anchor{position:absolute;width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0}.dropdown-infinite-scroll-item{width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0;height:0}.dropdown-menu{min-width:0px!important;width:100%;border:0;margin-top:4px;top:30px;height:var(--unfiltered-height);min-height:var(--unfiltered-height);padding:0!important;overflow:hidden;border-radius:0!important;background:transparent!important}.dropdown-menu.has-stroke .dropdown-menu-content{outline:1px solid #6c6c6c;outline-offset:-1px}.dropdown-menu .dropdown-menu-content{position:absolute;width:100%;background-color:#2f2f2f;border-radius:3px;padding:4px 0 4px 4px;max-height:244px;z-index:1100!important;overflow-y:scroll;margin-top:auto!important;scroll-padding:6px 0}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar{background-color:#2f2f2f;border-radius:0 3px 3px 0;width:4px}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar-thumb{width:4px;background:#2f2f2f;border-left:2px solid #919191;background-clip:padding-box;border-radius:1px 3px 3px 1px}@supports (-moz-appearance: none){.dropdown-menu .dropdown-menu-content{padding-right:4px;scrollbar-width:4px;scrollbar-color:#919191 transparent;scrollbar-gutter:stable!important}@media(hover:hover){.dropdown-menu .dropdown-menu-content:hover{scrollbar-color:#919191 transparent;scrollbar-width:4px!important;scrollbar-gutter:stable!important}}}@-moz-document url-prefix(){.dropdown-menu .dropdown-menu-content{overflow:-moz-scrollbars-vertical;scrollbar-width:4px;scrollbar-color:#919191 transparent}}.option-icon{color:#6c6c6c;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.option-icon.full-size{width:max-content;min-width:100%;height:18px!important;min-height:18px;flex-shrink:0;overflow:hidden}.option-icon.full-size svg{height:18px;width:max-content}.cai-color{color:var(--color)!important;transition:color .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.color-item:hover .cai-color{color:var(--hover-color)!important}}.dropdown-item{color:#fff;font-weight:400;font-size:14px;line-height:18px;height:26px;padding:4px;width:100%;scroll-margin:6px 0;outline:1px solid transparent;outline-offset:-1px;display:flex;align-items:center;justify-content:left;gap:4px;background-color:#2f2f2f;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),outline .1s cubic-bezier(.46,.03,.51,.95);border-radius:2px;position:relative}.dropdown-item.focused{outline:1px solid #6c6c6c!important}.dropdown-item.focused .end-item-base{opacity:0}.dropdown-item.focused .end-item-hover{opacity:1}.dropdown-item.focused .full-icon{color:#ffffffb2}.dropdown-item.focused .truck-trailer-option{opacity:1}.dropdown-item .icon,.dropdown-item .icon-sm{color:#919191}.dropdown-item .dropdown-content-with-icon{max-width:calc(100% - 22px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content-hazardous{max-width:calc(100% - 40px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content{max-width:70%;overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){.dropdown-item:hover:not(.no-hover){background-color:#424242}.dropdown-item:hover:not(.no-hover) .end-item-base{opacity:0}.dropdown-item:hover:not(.no-hover) .end-item-hover{opacity:1}.dropdown-item:hover:not(.no-hover) .full-icon{color:#ffffffb2}.dropdown-item:hover:not(.no-hover) .truck-trailer-option{opacity:1}}.dropdown-item.no-hover{cursor:default;pointer-events:none}.dropdown-item:focus-visible{background-color:#424242;border:0;outline:none}.dropdown-item:not(:first-child){margin-top:4px}.dropdown-item.banned{color:#919191;cursor:default}@media(hover:hover){.dropdown-item.banned:hover{color:#919191;background-color:#2f2f2f}.dropdown-item.banned:hover .end-item-base{opacity:0}.dropdown-item.banned:hover .end-item-hover{opacity:1}}.dropdown-item.dnu .round-icon{background-color:#e66767}.dropdown-item.selected .dispatch-load-count,.dropdown-item.selected .unassigned-ltl,.dropdown-item.selected .unassigned-ltl .icon,.dropdown-item.selected .unassigned-ltl .icon-sm{color:#92b1f5}.dropdown-item:not(:hover):not(.focused):not(.selected) .truck-icon{color:#919191}.dropdown-item:not(:hover):not(.focused):not(.selected) .trailer-icon{color:#919191}@media(hover:hover){.dropdown-avatar:hover{z-index:20}}.no-results{color:#919191;font-weight:700;cursor:default;pointer-events:none}.add-new{color:#92b1f5!important;font-weight:700;font-size:11px}.add-new .dropdown-item-icon{opacity:1}@media(hover:hover){.add-new:hover{background-color:#3b73ed66!important;color:#fff!important}}.selected{font-weight:700}.selected .dropdown-item-icon{opacity:1}.selected .dropdown-item-count{color:#fff;background-color:#3b73ed}.selected .full-icon{color:#fff}.selected .end-item-base,.selected .end-item-hover{font-weight:700;color:#92b1f5}.selected .end-item-base .icon,.selected .end-item-base .icon-sm,.selected .end-item-hover .icon,.selected .end-item-hover .icon-sm{color:#92b1f5}.dropdown-item-icon{opacity:0;color:#92b1f5;width:14px;height:14px;margin-left:auto}.dropdown-item-icon.no-margin{margin-left:0}.dropdown-item-count{position:absolute;right:6px;top:50%;transform:translateY(-50%);padding:2px 5px;border-radius:10px;background-color:#424242;color:#ffffffb2;min-width:18px;line-height:14px;font-weight:600;font-size:11px;text-align:center}.fraud-icon{color:#fab15c!important;height:18px;width:18px}.dropdown-icon-container{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;display:grid;place-items:center;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-icon-container.open .dropdown-icon{transform:rotateX(180deg)}.dropdown-icon{transition:transform .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)!important;transform:rotateX(0);cursor:pointer}.has-dropdown .app-input-icon{right:26px}.has-dropdown:has(.app-input:focus-visible) .subcontent{right:26px!important}.has-dropdown:has(.app-input:focus-visible).has-text .subcontent,.has-dropdown:has(.app-input:focus-visible).has-selected .subcontent{right:48px!important}.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}@media(hover:hover){.has-dropdown:hover:not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}}.has-right .app-input{text-align:right}@media(pointer:coarse){.has-right .app-input{transform-origin:right center}}.has-right .positive-icon,.has-right .app-input-icon{left:4px;right:auto}.has-right .cancel-button{z-index:1}.has-right.has-number .plus-button-container{order:2}.has-right.has-number .minus-button-container{order:1}.has-right.static-placeholder .app-input-icon{right:4px!important;left:auto!important;opacity:0!important}.has-right.static-placeholder:has(.app-input:focus-visible) .cancel-button{opacity:0!important;pointer-events:none!important}.has-right.static-placeholder.removable .cancel-button .bg-icon{background-color:transparent!important}@media(hover:hover){.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon{color:var(--color-icon-positive)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon{color:var(--color-icon-neutral)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon{color:var(--color-icon-negative)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button{opacity:1!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button .bg-icon{opacity:1!important;pointer-events:auto!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon,.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon-sm{opacity:0!important}}@media(hover:hover){.has-right.static-placeholder:hover:not(:has(.app-input:focus-visible)):not(:has(.app-input:disabled)).has-text .cancel-button{opacity:1!important}}.has-right .app-input{order:1}.has-right.has-subcontent .app-input{flex:1;min-width:0;word-break:none}.has-right .dropdown-selected{margin-left:0!important;text-align:right!important;right:0!important;left:0!important;justify-content:flex-end!important;width:100%!important}.has-right .subcontent{position:relative!important;order:1;display:grid;place-items:center;padding-right:4px;height:unset!important;transform:translateY(0)!important;left:0!important;right:unset!important}.has-right .subcontent .subcontent-hide{display:none!important}.has-right.has-text .subcontent{left:0!important;right:unset!important}.has-right:has(.app-input:focus-visible) .subcontent{left:0!important;right:unset!important}.has-right.has-icon .subcontent,.has-right.has-password .subcontent{padding-right:0!important;padding-left:4px}.has-right.has-icon .dropdown-selected,.has-right.has-password .dropdown-selected{width:calc(100% - 24px)!important}.has-right.has-icon .app-input,.has-right.has-password .app-input{padding-right:0!important}.has-right.has-icon .app-input-label,.has-right.has-password .app-input-label{left:0!important}.has-right.has-icon.fade-placeholder .app-input-label,.has-right.has-password.fade-placeholder .app-input-label{left:auto!important;right:24px!important}.has-right.has-icon .icon-container,.has-right.has-password .icon-container{width:30px;padding-left:4px}.has-right.has-icon .icon-container .icon,.has-right.has-icon .icon-container .icon-sm,.has-right.has-password .icon-container .icon,.has-right.has-password .icon-container .icon-sm{order:2}.has-right.has-dropdown .app-input-icon{left:26px}.has-right.has-dropdown .dropdown-icon-container{left:4px}.has-right .warning-icon{display:none!important}.has-right.has-number .separator{order:3}.has-right.has-number .number-buttons{left:0;right:unset}.has-right.has-number .number-container{left:4px;right:unset}.has-right.has-number.app-input-container:has(.app-input:focus-visible) .app-input{padding-left:4px}@media(hover:hover){.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .number-container{width:60px}.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .app-input{padding-left:4px}}.has-right .icon-container{order:2;margin-right:4px}.has-right .icon-container .password-icons{order:2}.has-right.fade-placeholder .app-input-label{right:0!important;left:auto!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:after{content:none!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:before{content:\"* \";color:var(--color-text-negative)}@media(hover:hover){.removable:has(.cancel-button:hover).in-table{background-color:transparent!important}.removable:has(.cancel-button:hover).in-table .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):not(.in-table){background-color:var(--color-surface-negative-hover)!important}.removable:has(.cancel-button:hover):not(.in-table) .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus)!important}.removable:has(.cancel-button:hover):has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}}.no-clear .cancel-button{display:none!important}.is-adding{padding-right:20px}.is-adding .dropdown-icon{opacity:0!important}.is-adding .accept-button{pointer-events:none;opacity:0!important}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.is-adding:has(.app-input:focus-visible){padding-right:48px!important}@media(hover:hover){.is-adding:hover{padding-right:48px!important}}.is-adding.has-right{padding-left:26px}.is-adding.has-right.has-right:has(.app-input:focus-visible){padding-left:40px}@media(hover:hover){.is-adding.has-right.has-right:hover{padding-left:40px}}.is-adding .app-input-icon{right:4px}@media(hover:hover){.is-adding.has-text:hover .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:hover .accept-button{pointer-events:auto;opacity:1!important}}.is-adding.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:has(.app-input:focus-visible) .accept-button{pointer-events:auto;opacity:1!important}.is-adding .cancel-button{opacity:1!important;pointer-events:auto}.is-adding .dropdown-icon-container{pointer-events:none}.is-adding .accept-button{right:26px;pointer-events:auto}.dropdown-selected{-webkit-user-select:none;user-select:none;position:absolute;top:50%;transform:translateY(-50%);left:0;width:calc(100% - 22px);pointer-events:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;word-break:break-all;padding:.25rem 6px;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),width .1s ease-in-out;color:var(--color-text);display:flex;gap:4px}.dropdown-selected .dropdown-selected-content{overflow:hidden;-webkit-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.dropdown-selected .dropdown-selected-hazardous{max-width:calc(100% - 22px)}p.dropdown-selected{-webkit-user-select:none;user-select:none;display:block}.app-input-container:has(.app-input:focus-visible) .dropdown-selected{color:#fff;opacity:.7}.app-input-container:has(.app-input:focus-visible) .dropdown-selected .option-icon{color:#fff!important}.has-icon .positive-icon,.has-icon .warning-icon{display:none}.has-icon .dropdown-selected{left:27px;width:calc(100% - 49px)}@media(hover:hover){.has-icon:hover .dropdown-selected{width:calc(100% - 71px)}}.has-icon.app-input-container:has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 71px)}.hazard-icon{height:18px;width:max-content}.has-dispatch .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.dispatch-load-count{color:#dadada;font-weight:700}.dispatch-separator{color:#919191;font-weight:400}.dispatch-status{font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:14px;letter-spacing:0%;text-transform:uppercase;color:#ffffffb2;border-radius:2px;padding:2px 4px;display:flex;justify-content:center;align-items:center;gap:4px}.dispatch-status.status-available{background-color:#50ac2533}.dispatch-status.status-dispatched{background-color:#3b73ed33}.dispatch-status.status-arrivedpickup,.dispatch-status.status-checkedinpickup,.dispatch-status.status-checkedin,.dispatch-status.status-loading,.dispatch-status.status-loaded{background-color:#259f9433}.dispatch-status.status-arriveddelivery,.dispatch-status.status-checkedindelivery,.dispatch-status.status-offloading,.dispatch-status.status-offloaded,.dispatch-status.status-empty{background-color:#ff704333}.dispatch-status.status-canceled{background-color:#df3c3c33}.dispatch-status.status-off,.dispatch-status.status-deadheading,.dispatch-status.status-break,.dispatch-status.status-split{background-color:#91919133}.dispatch-status.status-towing{background-color:#9e47ec33}.dispatch-status.status-repair,.dispatch-status.status-dispatchedrepair,.dispatch-status.status-loadedrepair{background-color:#865e3a33}.dispatch-status .status-block{border-radius:1px;background-color:#aaa;padding-left:2px;padding-right:2px;font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:12px;text-align:center;color:#2f2f2f;min-width:12px;height:12px}.dispatch-status .status-block.blue{background-color:#6692f1}.dispatch-status .status-block.green{background-color:#56b4ac}.dispatch-status .status-block.orange{background-color:#ff906d}.has-ftl-dispatch,.has-dispatch{min-width:600px}.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon{color:#fff}.dropdown-subitem{display:flex;justify-content:left;align-items:center;gap:4px}.truck-item{width:128px}.trailer-item{width:138px}.truck-trailer-option{opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);margin-left:auto}.truck-trailer-icon-colors.ic_truck_semi-truck,.truck-trailer-icon-colors.ic_truck_semi-wSleeper{color:#92b1f5}.truck-trailer-icon-colors.ic_truck_box-truck,.truck-trailer-icon-colors.ic_truck_reefer,.truck-trailer-icon-colors.ic_truck_cargo-van{color:#fbc88b}.truck-trailer-icon-colors.ic_truck_cement,.truck-trailer-icon-colors.ic_truck_dump,.truck-trailer-icon-colors.ic_truck_garbage{color:#ed9292}.truck-trailer-icon-colors.ic_truck_tow-truck,.truck-trailer-icon-colors.ic_truck_car-hauler,.truck-trailer-icon-colors.ic_truck_spotter{color:#86c9c3}.truck-trailer-icon-colors.ic_trailer_flatbed,.truck-trailer-icon-colors.ic_trailer_low-boy,.truck-trailer-icon-colors.ic_trailer_step-deck{color:#92b1f5}.truck-trailer-icon-colors.ic_trailer_chassis,.truck-trailer-icon-colors.ic_trailer_container{color:#80d6f1}.truck-trailer-icon-colors.ic_trailer_conestoga,.truck-trailer-icon-colors.ic_trailer_side-kit{color:#8785e8}.truck-trailer-icon-colors.ic_trailer_dryvan,.truck-trailer-icon-colors.ic_trailer_reefer{color:#fbc88b}.truck-trailer-icon-colors.ic_trailer_end-dump,.truck-trailer-icon-colors.ic_trailer_bottom-dump,.truck-trailer-icon-colors.ic_trailer_hopper{color:#ed9292}.truck-trailer-icon-colors.ic_trailer_tanker,.truck-trailer-icon-colors.ic_trailer_tanker-pneumatic{color:#ed93bb}.truck-trailer-icon-colors.ic_trailer_carhauler,.truck-trailer-icon-colors.ic_trailer_carhauler-stinger{color:#86c9c3}.sub-label{margin-left:auto;margin-right:22px;opacity:0;transition:margin .1s ease-in-out,opacity .1s ease-in-out;color:#6c6c6c}.app-input-label:has(.sub-label),.app-input-label:has(.accident-state){width:100%}.has-selected .sub-label{opacity:1}.dispatch-icon,.trailer-icon,.truck-icon{color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.truck-icon,.trailer-icon{width:42px}.truck-number{width:80px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.trailer-number{width:90px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.driver-name{max-width:170px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.dropdown-subitem-end{margin-left:auto;position:relative;height:26px;width:auto;display:flex;justify-content:right;align-items:center;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;vertical-align:bottom}.end-item-base{position:absolute;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);text-align:right}.dispatch-ltl{font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.unassigned-ltl{margin-left:auto;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.end-item-hover{position:absolute;display:flex;justify-content:right;align-items:center;gap:4px;width:max-content;opacity:0;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.selected-end-item{margin-left:auto;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;display:flex;justify-content:right;align-items:center;gap:4px}.group-item{font-family:Montserrat;font-weight:700!important;font-size:11px!important;line-height:18px;letter-spacing:0%;vertical-align:middle;text-transform:uppercase;background-color:#2f2f2f;color:#aaa!important}.group-item:not(:first-child){border-top:1px solid #424242}.group-item .group-icon{margin-left:auto;transform:rotate(180deg);transition:transform .1s cubic-bezier(.46,.03,.51,.95)}.group-item.unfolded{color:#fff!important}.group-item.unfolded .group-icon{transform:rotate(0)}.counter{background-color:#424242;padding:1px 4px;border-radius:60px;font-family:Montserrat;font-weight:600;font-size:11px;min-width:18px;line-height:14px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#ffffffb2;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.password-requirement{padding:6px;background-color:#fffffff2!important;box-shadow:0 0 4px #0006;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);overflow-y:hidden}.password-requirement p{font-family:Montserrat;font-weight:600;font-size:11px;line-height:14px;letter-spacing:0%;vertical-align:middle;color:#6c6c6c;font-style:italic}.password-requirement .icon,.password-requirement .icon-sm{width:14px!important;height:14px!important}.password-requirement .icon.checkmark,.password-requirement .checkmark.icon-sm{color:#ccc}.password-requirement .icon.cancel,.password-requirement .cancel.icon-sm{color:#e66767}.password-requirement ul{list-style-type:none;margin:6px 0 0;padding:0}.password-requirement ul li{color:#424242;font-size:11px;font-style:italic;font-weight:500;line-height:14px;display:flex;gap:4px}.password-requirement ul li.valid{color:#919191!important}.password-requirement ul li:not(:first-child){margin-top:6px}@media(hover:hover){.has-end-item:not(:has(.app-input:disabled)):hover .dropdown-selected{width:calc(100% - 44px)}}.has-end-item:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 44px)}.progress-bar{width:24px;height:8px;border-radius:2px;position:relative;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar:after{content:\"\";position:absolute;top:0;width:var(--progress);height:100%;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar.low{background-color:#df3c3c33}.progress-bar.low:after{background-color:#e66767}.progress-bar.medium{background-color:#f89b2e33}.progress-bar.medium:after{background-color:#fab15c}.progress-bar.high{background-color:#56b4ac33}.progress-bar.high:after{background-color:#56b4ac}.progress-bar.disable{background-color:#91919133}.progress-bar.disable:after{display:none}.app-input-container:has(.app-input:focus-visible) .selected-end-item .progress-bar{background-color:#fff!important}.full-icon{color:#919191}.fuelcard-number{width:216px}.fuelcard-brand{width:132px}.owner-ein{width:118px}.accident-name,.accident-unit,.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{flex-shrink:0}.accident-name>p,.accident-unit>p{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-name{width:218px}.accident-unit{width:170px}.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{text-align:right;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-dob{width:134px}.accident-cdl-number{width:140px}.accident-vin{width:182px}.accident-plate{width:140px}.accident-state{margin-left:auto;justify-content:flex-end;text-align:right}.app-input-label .accident-state{margin-right:22px;white-space:nowrap;transition:margin .1s ease-in-out}.has-multiple-dropdown.has-text{border-top-left-radius:0!important;border-top-right-radius:0!important}.multiple-container{display:flex;flex-wrap:wrap;gap:4px;padding:4px;border-top-left-radius:2px;border-top-right-radius:2px;position:relative;transition:background-color .1s ease-in-out;background-color:#e9effd}.multiple-container.hovered{background-color:#bed0f9}.multiple-container.hovered .multiple-selected{background-color:#e9effd}.multiple-container.focused{background-color:#0b49d1}.multiple-container.focused .multiple-selected{background-color:#3b73ed;color:#fff}.multiple-selected{background-color:#bed0f9;color:#2f2f2f;transition:background-color .1s ease-in-out,color .1s ease-in-out;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;padding:2px 4px;-webkit-user-select:none;user-select:none;font-family:Montserrat;font-size:14px;font-weight:400;line-height:18px;width:209px;height:22px;border-radius:1px}.multiple-selected p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media(hover:hover){.multiple-selected:hover{color:#2f2f2f!important;background-color:#fff!important}.multiple-selected:hover .multiple-remove-button{opacity:1}}.multiple-selected .multiple-remove-button{opacity:0;background-color:#6692f1;color:#fff;width:14px;height:14px}.multiple-selected .multiple-remove-button .multiple-remove-icon{width:12px;height:12px}.multiple-label{color:#424242;-webkit-user-select:none;user-select:none;pointer-events:none;font-family:Montserrat;font-size:11px;font-style:normal;font-weight:600;position:absolute;top:0;left:6px;transform:translateY(-14px)}.dropdown-group{border-radius:2px;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),max-height .1s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;margin-top:4px;max-height:var(--max-height);height:var(--max-height);overflow:hidden}.dropdown-group.no-items{cursor:default;pointer-events:none}.dropdown-group .group-item{outline:none;color:#fff!important;font-weight:400!important;font-size:14px!important;display:flex;transition:font-weight .1s ease-in-out,background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);padding-left:6px;padding-right:6px}.dropdown-group .group-item.unfolded .counter{color:#fff}@media(hover:hover){.dropdown-group .group-item:hover .counter{color:#fff}}.dropdown-group .group-item.unfolded{font-weight:700!important}.dropdown-group .group-item .counter{margin-left:auto}.dropdown-group .group-item .group-icon{margin-left:0}.dropdown-group.active{background-color:#424242}@media(hover:hover){.dropdown-group.active .group-item:hover{background-color:#424242}}.dropdown-group.active .dropdown-item{background-color:#424242}@media(hover:hover){.dropdown-group:hover:not(.no-items){background-color:#424242}.dropdown-group:hover:not(.no-items) .group-item:hover{background-color:#424242}.dropdown-group:hover:not(.no-items) .dropdown-item{background-color:#424242}}.dropdown-group.active{padding:4px;padding-top:0!important}.dropdown-group.active .group-item{position:relative!important;padding-left:2px!important;padding-right:2px!important}@media(hover:hover){.dropdown-group .dropdown-item:not(.group-item):hover{background-color:#6c6c6c!important}}.fuel-stop-transaction-store{display:flex;gap:4px}.fuel-stop-transaction-store .fuel-stop-transaction-store-address{font-size:11px;color:#ccc;margin-left:auto}.fuel-stop-transaction-store .favorite-icon{color:#92b1f5;width:14px;height:14px}.fuel-stop-transaction-nostore{padding-left:2px;padding-right:2px}.hide-dropdown{opacity:0;pointer-events:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown) .dropdown-menu-content{transition:max-height .2s cubic-bezier(.46,.03,.51,.95),opacity .2s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;animation:dropdown-menu-opening .2s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown).animate-dropdown .dropdown-menu-content{max-height:var(--max-height);height:var(--max-height)}.closing:not(.hide-dropdown) .dropdown-menu-content{animation:dropdown-menu-closing .2s cubic-bezier(.46,.03,.51,.95);opacity:0;max-height:0}@keyframes dropdown-menu-opening{0%{max-height:0;opacity:0}to{max-height:244px;opacity:1}}@keyframes dropdown-menu-closing{0%{max-height:244px;opacity:1}to{max-height:0;opacity:0}}.app-input-container:has(.app-input:focus-visible).has-dropdown .loader.loading,.app-input-container:has(.app-input:focus-visible).has-text .loader.loading{opacity:1!important}.app-input-container:has(.app-input:focus-visible).has-dropdown.has-text .loader{transform:translate(-48px)}.loader{position:absolute;top:4px;right:0;transform:translate(-26px);pointer-events:none;z-index:1000;width:18px;height:18px;display:flex;align-items:center;justify-content:center;transition:opacity .1s ease-in-out,transform .1s ease-in-out;opacity:0}.loader-icon{width:14px;height:14px;animation:spin .8s ease-in-out infinite;transform-origin:center;display:flex;align-items:center;justify-content:center}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.size-22{height:22px}.size-22 .icon,.size-22 .icon-sm{height:14px!important;width:14px!important}.size-22 .bg-icon{height:14px!important;width:14px!important;padding:2px!important}.size-22 .icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.size-22 .app-input{padding-top:2px;padding-bottom:2px;padding-left:4px}@media(pointer:coarse){.size-22 .app-input{height:22px}}.size-22 .app-input-label{padding-top:2px;padding-bottom:2px;padding-left:4px}.size-22.has-icon .app-input-label{padding-left:0!important}.size-22 .app-input-icon{height:14px!important;width:14px!important}.size-22.has-text .app-input-label,.size-22:has(.app-input:focus-visible) .app-input-label{transform:translateY(-18px)}.size-22 .loader{top:2px;transform:translate(-22px)!important}.strikethrough .app-input,.strikethrough .dropdown-selected-content{text-decoration:line-through}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.split-option>p{max-width:calc(50% - 2px)}.split-option .dropdown-subitem-end{width:calc(50% - 2px)}.split-option .end-item-base,.split-option .end-item-hover{max-width:100%}.selected-end-item-truncate{max-width:50%}.truck-owner-unit{min-width:0}.truck-owner-unit .dropdown-content{max-width:none;min-width:0}.truck-owner-bullet{flex-shrink:0;color:#919191}\n"], dependencies: [{ kind: "directive", type:
|
|
4547
4800
|
// Directives
|
|
4548
|
-
PasswordDirective, selector: "[appPassword]", inputs: ["appPassword", "visible", "account", "reveal", "hide", "appMask", "max"] }, { kind: "directive", type: NumberFormatDirective, selector: "[appNumberFormat]", inputs: ["appNumberFormat", "max", "isNumberFormattingDisabled", "disableDecimals", "prefix", "clampToMax"] }, { kind: "directive", type: MaskDirective, selector: "[appMask]", inputs: ["appMask", "reveal", "hide"] }, { kind: "directive", type: NumberRangeListDirective, selector: "[appNumberRangeList]", inputs: ["appNumberRangeList"] }, { kind: "directive", type: InfiniteScrollDirective, selector: "[caiInfiniteScroll]", inputs: ["scrollThreshold", "debounceTime"], outputs: ["scrolledToBottom"] }, { kind: "directive", type: IntersectionObserverDirective, selector: "[caiIntersectionObserver]", inputs: ["threshold", "rootMargin"], outputs: ["inView"] }, { kind: "ngmodule", type:
|
|
4801
|
+
PasswordDirective, selector: "[appPassword]", inputs: ["appPassword", "visible", "account", "reveal", "hide", "appMask", "max"] }, { kind: "directive", type: NumberFormatDirective, selector: "[appNumberFormat]", inputs: ["appNumberFormat", "max", "isNumberFormattingDisabled", "disableDecimals", "prefix", "clampToMax", "numberFormat"] }, { kind: "directive", type: MaskDirective, selector: "[appMask]", inputs: ["appMask", "reveal", "hide", "phone", "isInternational", "phoneCountries", "defaultDialCode"] }, { kind: "directive", type: NumberRangeListDirective, selector: "[appNumberRangeList]", inputs: ["appNumberRangeList"] }, { kind: "directive", type: InfiniteScrollDirective, selector: "[caiInfiniteScroll]", inputs: ["scrollThreshold", "debounceTime"], outputs: ["scrolledToBottom"] }, { kind: "directive", type: IntersectionObserverDirective, selector: "[caiIntersectionObserver]", inputs: ["threshold", "rootMargin"], outputs: ["inView"] }, { kind: "ngmodule", type:
|
|
4549
4802
|
// Bootstrap
|
|
4550
4803
|
NgbDropdownModule }, { kind: "directive", type: i2.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i2.NgbDropdownAnchor, selector: "[ngbDropdownAnchor]" }, { kind: "directive", type: i2.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type:
|
|
4551
4804
|
// Components
|
|
@@ -4582,7 +4835,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
4582
4835
|
// Components
|
|
4583
4836
|
SvgIconComponent,
|
|
4584
4837
|
AvatarComponent,
|
|
4585
|
-
], template: "<!-- #region Variables -->\n@let valid =\n ngControl?.valid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let invalid =\n ngControl?.invalid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let subcontent =\n config().subcontent ||\n (config().dropdown === \"subcontent\" &&\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![config().optionLabel || \"label\"]);\n\n@let name = config().name;\n@let password = config().type === \"password\" || config().type === \"account\";\n\n@let optionLabel = this.config().optionLabel || \"label\";\n@let dropdownType = this.config().dropdown;\n\n@let focusedOptionIndex = keyboardNavigationState().singleIndex;\n@let groupedNavigationState = keyboardNavigationState().groupedNavigationState;\n\n@let tooltipClass =\n config().inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n<!-- #region Multiple selection -->\n@if (config().dropdown === \"multiple\" && !!multipleSelectedOptions().length) {\n <div\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"toggleHovered(true)\"\n (mouseleave)=\"toggleHovered(false)\"\n class=\"multiple-container\"\n [class]=\"{\n focused: focused(),\n hovered: hovered(),\n }\"\n >\n <label class=\"multiple-label\">{{ name }}</label>\n\n @for (option of multipleSelectedOptions(); track $index) {\n <div class=\"multiple-selected\">\n <p>{{ cast(option, \"dropdownOption\")![optionLabel || \"label\"] }}</p>\n <button\n type=\"button\"\n class=\"\"\n (pointerdown)=\"handleOption(option, $event)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Clear\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n [container]=\"'body'\"\n >\n <svg-icon\n name=\"cai-cancel\"\n class=\"multiple-remove-button multiple-remove-icon bg-icon\"\n ></svg-icon>\n </button>\n </div>\n }\n </div>\n}\n<!-- #endregion -->\n\n@let hasFloatingError =\n invalid &&\n (config().errorBehavior === \"floating\" ||\n (!!config().inTable && config().placeholderBehavior !== \"static\"));\n\n<div\n class=\"app-input-container\"\n [class]=\"\n {\n config: config(),\n hideValidation: hideValidation(),\n isPasswordVisible: visible(),\n isInvalid: !!invalid || forceInvalidStyling(),\n isValid: !!valid && !forceInvalidStyling(),\n isHovered: hovered(),\n hasText: hasText(),\n isAdding: isAdding(),\n selectedOption: selectedOption(),\n } | inputClass\n \"\n ngbDropdown\n [autoClose]=\"false\"\n #dropdown=\"ngbDropdown\"\n dropdownClass=\"cai-dropdown\"\n #containerRef\n [ngbTooltip]=\"errorTooltip\"\n [disableTooltip]=\"!hasFloatingError\"\n [container]=\"'body'\"\n [placement]=\"['bottom', 'top']\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip \"\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"dropdownType === 'multiple' && toggleHovered(true)\"\n (mouseleave)=\"dropdownType === 'multiple' && toggleHovered(false)\"\n>\n @if (config().icon && !password && !config().withButtons) {\n <div\n class=\"icon-container\"\n (pointerdown)=\"focus($event)\"\n [class]=\"{\n 'colored-icon': config().iconColor,\n }\"\n [style.--icon-color]=\"config().iconColor || ''\"\n >\n <svg-icon class=\"icon\" [name]=\"config().icon || ''\"></svg-icon>\n @if (!config().noSeparator) {\n <div class=\"separator\"></div>\n }\n </div>\n }\n @if (password) {\n <div class=\"icon-container\" (pointerdown)=\"toggleVisibility($event)\">\n <div\n class=\"password-icons\"\n [ngbTooltip]=\"passwordTooltip\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [placement]=\"'top'\"\n [openDelay]=\"600\"\n >\n <svg-icon\n class=\"icon password-key hover-icon\"\n name=\"cai-password-key\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-shown hover-icon\"\n name=\"cai-password-shown\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-hidden hover-icon\"\n name=\"cai-password-hidden\"\n ></svg-icon>\n </div>\n <div class=\"separator\"></div>\n </div>\n }\n\n <input\n class=\"app-input\"\n [tabindex]=\"isDisabled() ? '-1' : '0'\"\n [type]=\"\n password && !isPartiallyMasked()\n ? visible()\n ? 'text'\n : 'password'\n : 'text'\n \"\n [required]=\"config().required\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (blur)=\"dispatchOnBlur()\"\n [id]=\"id()\"\n [attr.aria-label]=\"config().label\"\n [attr.name]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n [placeholder]=\"config()?.placeholder || ''\"\n [autocomplete]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n #inputRef\n [appPassword]=\"password\"\n [appMask]=\"config().mask || ''\"\n [appNumberRangeList]=\"config().numberRangeList || false\"\n [reveal]=\"config().reveal || 0\"\n [hide]=\"config().hide || 0\"\n [account]=\"config().type === 'account'\"\n [visible]=\"visible()\"\n [appNumberFormat]=\"config().type === 'number'\"\n [isNumberFormattingDisabled]=\"config().isNumberFormattingDisabled || false\"\n [disableDecimals]=\"config().disableDecimals || false\"\n [prefix]=\"config().prefix || ''\"\n [max]=\"config().max\"\n [clampToMax]=\"config().clampToMax || false\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus($event)\"\n />\n @if (\n !(dropdownType === \"multiple\" && !!multipleSelectedOptions().length) &&\n config().placeholderBehavior !== \"hidden\"\n ) {\n <label\n class=\"app-input-label\"\n [class.placeholder-color]=\"this.config().placeholderColor\"\n [style.--placeholder-color]=\"this.config().placeholderColor || ''\"\n (click)=\"focus($event)\"\n >\n <!-- Truck Trailer Driver Dropdown label -->\n @if (dropdownType === \"dispatch\" || dropdownType === \"ftl-dispatch\") {\n <p class=\"truck-item app-input-name\">Truck</p>\n <p class=\"trailer-item\">Trailer</p>\n <p>Driver</p>\n <p class=\"sub-label\">Rate</p>\n }\n <!-- Split Load -->\n @else if (dropdownType === \"split-driver\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Rate</p>\n } @else if (\n dropdownType === \"split-truck\" || dropdownType === \"split-trailer\"\n ) {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Location</p>\n }\n <!-- Dropdown variants -->\n @else if (dropdownType === \"broker\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Credit</p>\n } @else if (dropdownType === \"contact\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Phone</p>\n } @else if (dropdownType === \"shipper\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Address</p>\n } @else if (dropdownType === \"owner\") {\n <p class=\"owner-ein app-input-name\">EIN</p>\n <p class=\"app-input-name\">Company Name</p>\n } @else if (dropdownType === \"fuelcard\") {\n <p class=\"fuelcard-number app-input-name\">Card No.</p>\n <p class=\"fuelcard-brand app-input-name\">Provider</p>\n <p class=\"app-input-name\">Nickname</p>\n }\n <!-- Accident -->\n @else if (dropdownType === \"accident-driver\") {\n <p class=\"accident-name app-input-name\">{{ name }}</p>\n <p class=\"accident-dob app-input-name\">DOB</p>\n <p class=\"accident-cdl-number app-input-name\">CDL No.</p>\n <p class=\"accident-state app-input-name\">CDL State</p>\n } @else if (\n dropdownType === \"accident-truck\" || dropdownType === \"accident-trailer\"\n ) {\n <p class=\"accident-unit app-input-name\">{{ name }}</p>\n <p class=\"accident-vin app-input-name\">VIN</p>\n <p class=\"accident-plate app-input-name\">Lic. Plate No.</p>\n <p class=\"accident-state app-input-name\">Lic. State</p>\n }\n <!-- Default Dropdown label -->\n @else {\n <span class=\"app-input-name\">{{ name }}</span>\n }\n </label>\n }\n @if (config().type === \"number\" && config().withButtons) {\n <div class=\"number-container\">\n <div class=\"number-buttons\">\n <div class=\"separator\"></div>\n <div\n class=\"plus-button-container\"\n ngbTooltip=\"Add\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n (pointerdown)=\"increment($event)\"\n >\n <svg-icon name=\"cai-plus\" class=\"bg-icon plus-icon\"></svg-icon>\n </div>\n <div\n class=\"minus-button-container\"\n ngbTooltip=\"Remove\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n (pointerdown)=\"decrement($event)\"\n >\n <svg-icon name=\"cai-minus\" class=\"bg-icon minus-icon\"></svg-icon>\n </div>\n </div>\n </div>\n }\n @if (!config().inTable) {\n @if (!dropdownType) {\n <svg-icon\n name=\"cai-checkmark\"\n class=\"app-input-icon positive-icon\"\n ></svg-icon>\n <svg-icon\n name=\"cai-status-warning\"\n class=\"app-input-icon warning-icon\"\n ></svg-icon>\n }\n }\n\n @if (\n invalid &&\n config().errorBehavior !== \"hidden\" &&\n (ngControl?.errors | errorMessage: config().customErrors)[0] &&\n !(config().inTable && config().placeholderBehavior !== \"static\")\n ) {\n <div class=\"app-input-error\">\n {{ (ngControl?.errors | errorMessage: config().customErrors)[0] }}\n </div>\n }\n\n <!-- Accept button -->\n @if ((config().add && isAdding()) || config().isEdit) {\n <button\n type=\"button\"\n class=\"app-input-icon button-icon accept-button\"\n (pointerdown)=\"addOption()\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Confirm\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n >\n <svg-icon class=\"bg-icon\" name=\"cai-checkmark\"></svg-icon>\n </button>\n }\n\n <!-- Cancel button -->\n <button\n type=\"button\"\n class=\"app-input-icon button-icon cancel-button\"\n (pointerdown)=\"reset($event)\"\n (mouseenter)=\"onClearHover(true)\"\n (mouseleave)=\"onClearHover(false)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"{{\n hasText()\n | clearTooltip\n : isAdding()\n : config().isEdit || false\n : config().placeholderBehavior || 'dynamic'\n : dropdownType === 'multiple'\n : config().hasResetButton\n : canTooltipBeVisible()\n }}\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n >\n @let iconName =\n config().hasResetButton\n ? \"cai-reset\"\n : config().removable\n ? \"cai-delete\"\n : \"cai-cancel\";\n <svg-icon class=\"bg-icon\" [name]=\"iconName\"></svg-icon>\n </button>\n\n <div class=\"dropdown-anchor\" ngbDropdownAnchor></div>\n <!-- Dropdown menu -->\n\n @let hasLoader = isLoading() !== undefined;\n\n @if (hasLoader) {\n <div class=\"loader\" [class.loading]=\"isLoading()\">\n <svg-icon name=\"cai-loader\" class=\"loader-icon\"></svg-icon>\n </div>\n }\n\n @if (dropdownType) {\n @let maxHeight =\n ((dropdownOptions()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n @let animateDropdown =\n dropdownType !== \"toll\" &&\n dropdownType !== \"fuel-stop-transaction\" &&\n dropdownType !== \"dispatch\" &&\n dropdownType !== \"ftl-dispatch\" &&\n dropdownType !== \"split-driver\" &&\n dropdownType !== \"split-truck\" &&\n dropdownType !== \"split-trailer\";\n\n @let unfilteredHeight =\n dropdownType === \"contact\" || !animateDropdown\n ? 244\n : ((options()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n <div\n ngbDropdownMenu\n class=\"dropdown-menu input-dropdown-menu\"\n [class]=\"{\n 'hide-dropdown':\n config().dropdownAutocomplete &&\n !dropdownOptions()?.length &&\n !(showNoResults() && value()),\n 'animate-dropdown': animateDropdown,\n 'size-22': config().size === 22,\n 'has-stroke': config().hasStroke,\n }\"\n [class.closing]=\"closing()\"\n [style.--unfiltered-height]=\"\n unfilteredHeight > 244 ? '244px' : unfilteredHeight + 'px'\n \"\n [style.--max-height]=\"maxHeight > 244 ? '244px' : maxHeight + 'px'\"\n [style.width.px]=\"containerWidth()\"\n [tabindex]=\"-1\"\n (pointerdown)=\"onDropdownBackgroundClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <div\n class=\"dropdown-menu-content\"\n [tabindex]=\"-1\"\n caiInfiniteScroll\n [scrollThreshold]=\"50\"\n (scrolledToBottom)=\"onDropdownScrolledToBottom()\"\n >\n @if (config().add) {\n <button\n class=\"dropdown-item add-new\"\n [class.focused]=\"\n focusedOptionIndex === -1 ||\n groupedNavigationState?.groupIndex === -1\n \"\n (click)=\"handleAddingOption($event)\"\n >\n <p>ADD NEW</p>\n <svg-icon name=\"cai-plus\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"dropdownMenuRef\"></ng-container>\n </div>\n </div>\n\n @if (!config().dropdownAutocomplete) {\n <div\n class=\"dropdown-icon-container\"\n [class.open]=\"dropdown.isOpen() && !closing()\"\n (pointerdown)=\"onDropdownIconClick($event)\"\n >\n <svg-icon\n name=\"cai-arrow-secondary-down\"\n class=\"dropdown-icon icon\"\n ></svg-icon>\n </div>\n }\n @let specialDropdown =\n dropdownType === \"dispatch\" ||\n dropdownType === \"ftl-dispatch\" ||\n dropdownType === \"broker\" ||\n dropdownType === \"contact\" ||\n dropdownType === \"shipper\" ||\n dropdownType === \"bank\" ||\n dropdownType === \"dispatcher\" ||\n dropdownType === \"driver-owner\" ||\n dropdownType === \"truck-owner\" ||\n dropdownType === \"truck\" ||\n dropdownType === \"trailer\" ||\n dropdownType === \"hazardous\" ||\n dropdownType === \"state\" ||\n dropdownType === \"owner\" ||\n dropdownType === \"fuelcard\" ||\n dropdownType === \"pm\" ||\n dropdownType === \"color\" ||\n dropdownType === \"make\" ||\n dropdownType === \"toll\" ||\n dropdownType === \"provider\" ||\n dropdownType === \"split-driver\" ||\n dropdownType === \"split-truck\" ||\n dropdownType === \"split-trailer\" ||\n dropdownType === \"accident-driver\" ||\n dropdownType === \"accident-truck\" ||\n dropdownType === \"accident-trailer\";\n <!-- Placeholder -->\n @if (specialDropdown) {\n <ng-container *ngTemplateOutlet=\"selectedOptionRef\"></ng-container>\n } @else if (\n (config().add || config().search) &&\n !inputRef.value &&\n !this.isAdding() &&\n dropdownType !== \"subcontent\"\n ) {\n <div class=\"dropdown-selected\">\n @if (config().placeholderBehavior === \"static\") {\n <p class=\"selected-label-hidden\">\n {{ name + (config().required ? \" *\" : \"\") }}\n </p>\n <p class=\"selected-text\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n @if (\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ] === \"Hazardous\"\n ) {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n }\n }\n </div>\n }\n } @else if (config().isEdit && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ name }}</p>\n </div>\n }\n @if (config().passwordRequirements) {\n <div\n class=\"dropdown-menu password-requirement\"\n ngbDropdownMenu\n [style.width.px]=\"containerWidth()\"\n [class.closing]=\"closing()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <ng-container *ngTemplateOutlet=\"passwordRequirementsRef\"></ng-container>\n </div>\n }\n @if (subcontent) {\n <p class=\"subcontent\">\n @if (!(config().alignment === \"right\")) {\n <span class=\"subcontent-hide\"\n >{{\n config().search\n ? selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n : inputRef.value\n }}\n </span>\n }\n {{ subcontent }}\n </p>\n }\n</div>\n\n<!-- #region Templates -->\n\n<!-- #region Password requirements -->\n<ng-template #passwordRequirementsRef>\n @let isMinLengthValid =\n !this.ngControl?.errors?.[\"minlength\"] && this.value();\n @let isHasNumberValid =\n !this.ngControl?.errors?.[\"hasNumber\"] && this.value();\n @let isHasSymbolValid =\n !this.ngControl?.errors?.[\"hasSymbol\"] && this.value();\n @let isHasUppercaseValid =\n !this.ngControl?.errors?.[\"hasUppercase\"] && this.value();\n\n <p>Strong Password Requirement</p>\n <ul>\n <li [class.valid]=\"isMinLengthValid\">\n <svg-icon\n [name]=\"isMinLengthValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isMinLengthValid ? 'checkmark' : 'cancel'\"\n class=\"icon\"\n ></svg-icon\n ><span>Minimum 8 characters</span>\n </li>\n <li [class.valid]=\"isHasNumberValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasNumberValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasNumberValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One number</span>\n </li>\n <li [class.valid]=\"isHasSymbolValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasSymbolValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasSymbolValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One symbol</span>\n </li>\n <li [class.valid]=\"isHasUppercaseValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasUppercaseValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasUppercaseValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One upper-case letter</span>\n </li>\n </ul>\n</ng-template>\n<!-- #endregion -->\n@let search = config().search;\n\n<ng-template #dropdownMenuRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"dispatchesRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"ftlDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"brokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"contactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"shipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"bankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"dispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"driverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"truckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"trailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"truckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"hazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"stateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"ownerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"fuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"pmRef\"></ng-container>\n }\n @case (\"multiple\") {\n <ng-container *ngTemplateOutlet=\"multipleRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"makeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"tollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"colorRef\"></ng-container>\n }\n @case (\"fuel-stop-transaction\") {\n <ng-container *ngTemplateOutlet=\"fuelStopTransactionRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"providerRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"splitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"splitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"splitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container *ngTemplateOutlet=\"accidentDriverRef\"></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"accidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container *ngTemplateOutlet=\"accidentTrailerRef\"></ng-container>\n }\n @case (\"subcontent\") {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n }\n</ng-template>\n\n<ng-template #selectedOptionRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"selectedBrokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"selectedContactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"selectedShipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"selectedBankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedDriverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedTrailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"selectedHazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"selectedStateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"selectedOwnerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"selectedFuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"selectedPmRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"selectedMakeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"selectedTollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"selectedColorRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"selectedProviderRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentDriverRef\"\n ></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedAccidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentTrailerRef\"\n ></ng-container>\n }\n }\n</ng-template>\n\n<!-- Standard dropdown -->\n<ng-template #dropdownOptionsRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dropdownOption')?.id === dropdownOption.id,\n focused: focusedOptionIndex === index,\n }\"\n (click)=\"handleOption(dropdownOption, $event)\"\n >\n @if (dropdownOption[optionLabel] === \"Hazardous\") {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n }\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #multipleRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n (click)=\"handleOption(dropdownOption, $event)\"\n [class]=\"{\n selected: isSelectedOption(dropdownOption),\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #bankRef>\n @if (dropdownOptions().length) {\n @for (bank of dropdownOptions(); track $index; let index = $index) {\n @let bankOption = cast(bank, \"bank\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ bankOption.id }}\"\n (click)=\"handleOption(bankOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'bank')?.id === bankOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (bankOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"bankOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (bankOption.name || '' | highlightSearch: value())\n : bankOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #makeRef>\n @if (dropdownOptions().length) {\n @for (make of dropdownOptions(); track $index; let index = $index) {\n @let makeOption = cast(make, \"make\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ makeOption.id }}\"\n (click)=\"handleOption(makeOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'make')?.id === makeOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (makeOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"makeOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (makeOption.name || '' | highlightSearch: value())\n : makeOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Broker -->\n<ng-template #brokerRef>\n @if (dropdownOptions().length) {\n @for (broker of dropdownOptions(); track $index; let index = $index) {\n @let brokerOption = cast(broker, \"broker\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"broker-{{ brokerOption.id }}\"\n (click)=\"\n !(brokerOption.dnu || brokerOption.ban) &&\n handleOption(brokerOption, $event)\n \"\n [class]=\"{\n selected: cast(selectedOption(), 'broker')?.id === brokerOption.id,\n focused: focusedOptionIndex === index,\n banned: brokerOption.dnu || brokerOption.ban,\n dnu: brokerOption.dnu,\n }\"\n >\n @if (brokerOption?.dnu || brokerOption?.ban) {\n <svg-icon name=\"cai-minus\" class=\"round-icon\"></svg-icon>\n } @else if (brokerOption?.fraudCheck) {\n <svg-icon\n name=\"cai-status-warning-lite\"\n class=\"fraud-icon\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (brokerOption.businessName || '' | highlightSearch: value())\n : brokerOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n @if (!brokerOption.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>{{ brokerOption.availableCredit || 0 | currency }}</p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).status\n \"\n ></div>\n }\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ brokerOption.loadsCount }} |\n {{ brokerOption.availableCredit || 0 | currency }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Contact dropdown -->\n<ng-template #contactRef>\n @if (dropdownOptions().length) {\n @for (contact of dropdownOptions(); track $index; let index = $index) {\n @let contactOption = cast(contact, \"contact\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"contact-{{ contact.id }}\"\n (click)=\"handleOption(contact, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'contact')?.id === contact.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (contactOption.contactName || '' | highlightSearch: value())\n : contactOption.contactName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p class=\"text-truncate\">{{ contactOption.department?.name }}</p>\n </div>\n <div class=\"end-item-hover\">\n <p class=\"text-truncate\">\n {{ contactOption.phone }}\n {{\n contactOption.extensionPhone\n ? \"x\" + contactOption.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Owner dropdown -->\n<ng-template #ownerRef>\n @if (dropdownOptions().length) {\n @for (owner of dropdownOptions(); track $index; let index = $index) {\n @let ownerOption = cast(owner, \"owner\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"owner-{{ ownerOption?.id }}\"\n (click)=\"handleOption(ownerOption!, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'owner')?.id === ownerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"owner-ein\"\n [innerHTML]=\"\n search\n ? (ownerOption?.ein || '' | highlightSearch: value())\n : ownerOption?.ein\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (ownerOption?.name || '' | highlightSearch: value())\n : ownerOption?.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Fuelcard dropdown -->\n<ng-template #fuelcardRef>\n @if (dropdownOptions().length) {\n @for (fuelcard of dropdownOptions(); track $index; let index = $index) {\n @let fuelcardOption = cast(fuelcard, \"fuelCard\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"fuelcard-{{ fuelcardOption?.id }}\"\n (click)=\"handleOption(fuelcardOption!, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'fuelCard')?.id === fuelcardOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"fuelcard-number\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.number || '' | highlightSearch: value())\n : fuelcardOption?.number\n \"\n ></p>\n <p\n class=\"fuelcard-brand\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.brand || '' | highlightSearch: value())\n : fuelcardOption?.brand\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (fuelcardOption?.account || '' | highlightSearch: value())\n : fuelcardOption?.account\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident driver dropdown -->\n<ng-template #accidentDriverRef>\n @if (dropdownOptions().length) {\n @for (driver of dropdownOptions(); track $index; let index = $index) {\n @let driverOption = cast(driver, \"accidentDriver\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-driver-{{ driverOption.id }}\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentDriver')?.id === driverOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <p class=\"accident-dob\">\n {{ driverOption.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p\n class=\"accident-cdl-number\"\n [innerHTML]=\"driverOption.cdlNumber || '' | highlightSearch: value()\"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n driverOption.cdlState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n driverOption.cdlState?.countryType?.name &&\n driverOption.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n driverOption.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n driverOption.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident truck dropdown -->\n<ng-template #accidentTruckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"accidentTruck\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-truck-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTruck')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (truckOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n [name]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"truckOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n truckOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n truckOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n truckOption.licenseState?.countryType?.name &&\n truckOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n truckOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n truckOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident trailer dropdown -->\n<ng-template #accidentTrailerRef>\n @if (dropdownOptions().length) {\n @for (trailer of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(trailer, \"accidentTrailer\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-trailer-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTrailer')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (trailerOption.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n [name]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"trailerOption.trailerNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"trailerOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n trailerOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n trailerOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n trailerOption.licenseState?.countryType?.name &&\n trailerOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n trailerOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n trailerOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Shipper dropdown -->\n<ng-template #shipperRef>\n @if (dropdownOptions().length) {\n @for (shipper of dropdownOptions(); track $index; let index = $index) {\n @let shipperOption = cast(shipper, \"shipper\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"shipper-{{ shipperOption.id }}\"\n (click)=\"handleOption(shipperOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'shipper')?.id === shipperOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.businessName || '' | highlightSearch: value())\n : shipperOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.address?.address || ''\n | highlightSearch: value())\n : shipperOption.address?.address\n \"\n ></p>\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ shipperOption.pickupCount }} Pickup |\n {{ shipperOption.deliveryCount }} Delivery\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatch dropdown -->\n<ng-template #dispatchesRef>\n @if (dropdownOptions().length) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"resetSelection()\"\n [class]=\"{\n selected: !selectedOption(),\n }\"\n >\n <p>Unassigned</p>\n <div class=\"unassigned-ltl\">\n <p>{{ unassignedCount() }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </button>\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n <!-- Temporary variant since BE doesn't support boards -->\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base dispatch-ltl\">\n <p>{{ dispatch.numberOfSingleLtlLoads }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- ftl dispatch dropdown -->\n<ng-template #ftlDispatchRef>\n @if (dropdownOptions().length) {\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <!-- Load Status -->\n @let dispatchStatus = dispatch.status | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (dispatch.status?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ dispatch.status?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ dispatch?.pendingLoadCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitDriverRef>\n @if (dropdownOptions().length) {\n @for (splitDriverBoard of dropdownOptions(); track splitDriverBoard.id) {\n @let driverBoard = cast(splitDriverBoard, \"splitDriverBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(driverBoard.id, $event)\"\n [class]=\"{\n unfolded: (driverBoard.drivers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n driverBoard.isTeamBoard ? \"Team Board\" : driverBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ driverBoard.drivers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (driver of driverBoard.drivers || []; track driver.id) {\n @let driverOption = cast(driver, \"splitDriver\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitDriver')?.id === driverOption.id,\n }\"\n >\n <div class=\"dropdown-subitem\">\n <div class=\"dropdown-avatar\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n </div>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n driverOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (driverOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ driverOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ driverOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ driverOption.payTypeValue }}</p>\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTruckRef>\n @if (dropdownOptions().length) {\n @for (splitTruckBoard of dropdownOptions(); track splitTruckBoard.id) {\n @let truckBoard = cast(splitTruckBoard, \"splitTruckBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(truckBoard.id, $event)\"\n [class]=\"{\n unfolded: (truckBoard.trucks?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n truckBoard.isTeamBoard ? \"Team Board\" : truckBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ truckBoard.trucks?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (truck of truckBoard.trucks || []; track truck.id) {\n @let truckOption = cast(truck, \"splitTruck\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTruck')?.id === truckOption.id,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [style.--truck-color]=\"truckOption.color?.code || ''\"\n [name]=\"truckOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus = truckOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (truckOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ truckOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ truckOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n truckOption.location?.city &&\n truckOption.location?.stateShortName\n ) {\n <p>\n {{ truckOption.location?.city }},\n {{ truckOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTrailerRef>\n @if (dropdownOptions().length) {\n @for (splitTrailerBoard of dropdownOptions(); track splitTrailerBoard.id) {\n @let trailerBoard = cast(splitTrailerBoard, \"splitTrailerBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(trailerBoard.id, $event)\"\n [class]=\"{\n unfolded: (trailerBoard.trailers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n trailerBoard.isTeamBoard\n ? \"Team Board\"\n : trailerBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ trailerBoard.trailers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (trailer of trailerBoard.trailers || []; track trailer.id) {\n @let trailerOption = cast(trailer, \"splitTrailer\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTrailer')?.id === trailerOption.id,\n }\"\n >\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [style.--trailer-color]=\"trailerOption.color?.code || ''\"\n [name]=\"trailerOption.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n trailerOption.trailerNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n trailerOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (trailerOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ trailerOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ trailerOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n trailerOption.location?.city &&\n trailerOption.location?.stateShortName\n ) {\n <p>\n {{ trailerOption.location?.city }},\n {{ trailerOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #tollRef>\n @if (dropdownOptions().length) {\n @for (toll of dropdownOptions(); track $index; let groupIndex = $index) {\n @let tollOption = cast(toll, \"tollOption\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item pe-none\"\n [class]=\"{\n unfolded: tollOption.tollTransponders?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{ tollOption.groupName }}\n </p>\n </button>\n @let tollTransponders = tollOption.tollTransponders || [];\n @for (\n tollTransponder of tollTransponders;\n track tollTransponder.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(tollTransponder, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'tollTransponderOption')?.id ===\n tollTransponder.id,\n focused: isOptionFocused,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (tollTransponder.name || '' | highlightSearch: value())\n : tollTransponder.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatcher dropdown -->\n\n<ng-template #dispatcherRef>\n @if (dropdownOptions().length) {\n @for (dispatcher of dropdownOptions(); track $index; let index = $index) {\n @let dispatcherOption = cast(dispatcher, \"dispatcher\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dispatcherOption.id }}\"\n (click)=\"handleOption(dispatcherOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatcher')?.id === dispatcherOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (dispatcherOption.fullName || '' | highlightSearch: value())\n : dispatcherOption.fullName\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Driver Owner dropdown -->\n\n<ng-template #driverOwnerRef>\n @if (dropdownOptions().length) {\n @for (driverOwner of dropdownOptions(); track $index; let index = $index) {\n @let driverOwnerOption = cast(driverOwner, \"driverOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ driverOwnerOption.id }}\"\n (click)=\"handleOption(driverOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'driverOwner')?.id === driverOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (driverOwnerOption.fullName || '' | highlightSearch: value())\n : driverOwnerOption.fullName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ driverOwnerOption.driverType | driverTypeLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Truck Owner dropdown -->\n\n<ng-template #truckOwnerRef>\n @if (dropdownOptions().length) {\n @for (truckOwner of dropdownOptions(); track $index; let index = $index) {\n @let truckOwnerOption = cast(truckOwner, \"truckOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOwnerOption.id }}\"\n (click)=\"handleOption(truckOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOwner')?.id === truckOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem truck-owner-unit\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.truckNumber || ''\n | highlightSearch: value())\n : truckOwnerOption.truckNumber\n \"\n ></p>\n @if (truckOwnerOption.model) {\n <p class=\"truck-owner-bullet\">\u2022</p>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.model | highlightSearch: value())\n : truckOwnerOption.model\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #truckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"truckOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOption')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (truckOption.name || '' | highlightSearch: value())\n : truckOption.name\n \"\n ></p>\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"truckOption.logoName.slice(0, -4)\"\n [name]=\"truckOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #trailerRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(truck, \"trailerOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'trailerOption')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (trailerOption.name || '' | highlightSearch: value())\n : trailerOption.name\n \"\n ></p>\n\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"trailerOption.logoName.slice(0, -4)\"\n [name]=\"trailerOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #providerRef>\n @if (dropdownOptions().length) {\n @for (provider of dropdownOptions(); track $index; let index = $index) {\n @let providerOption = cast(provider, \"provider\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ providerOption?.id }}\"\n (click)=\"handleOption(providerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'provider')?.id === providerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"full-icon\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Hazardous dropdown -->\n<ng-template #hazardousRef>\n @if (dropdownOptions().length) {\n @for (hazardous of dropdownOptions(); track $index; let index = $index) {\n @let hazardousOption = cast(hazardous, \"hazardous\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ hazardousOption.id }}\"\n (click)=\"handleOption(hazardousOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'hazardous')?.id === hazardousOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon [name]=\"hazardousOption.logoName?.slice(0, -4)\"></svg-icon>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (hazardousOption.description || '' | highlightSearch: value())\n : hazardousOption.description\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #pmRef>\n @if (dropdownOptions().length) {\n @for (pm of dropdownOptions(); track $index; let index = $index) {\n @let pmOption = cast(pm, \"pmOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ pmOption.id }}\"\n (click)=\"handleOption(pmOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'pmOption')?.id === pmOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"pmOption.title | remapPmIcons\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (pmOption.title || '' | highlightSearch: value())\n : pmOption.title\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #colorRef>\n @if (dropdownOptions().length) {\n @for (color of dropdownOptions(); track $index; let index = $index) {\n @let colorOption = cast(color, \"colorOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item color-item\"\n id=\"option-{{ colorOption.id }}\"\n (click)=\"handleOption(colorOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'colorOption')?.id === colorOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (colorOption.name || '' | highlightSearch: value())\n : colorOption.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #stateRef>\n @if (dropdownOptions().length) {\n @for (state of dropdownOptions(); track $index; let index = $index) {\n @let stateOption = cast(state, \"state\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ stateOption.id }}\"\n (click)=\"handleOption(stateOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'state')?.id === stateOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (stateOption.stateShortName +\n ' ' +\n (config().fullState\n ? ' (' + stateOption?.stateName + ')'\n : '') || '' | highlightSearch: value())\n : stateOption.stateShortName +\n ' ' +\n (config().fullState ? ' (' + stateOption?.stateName + ')' : '')\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #fuelStopTransactionRef>\n @if (dropdownOptions().length) {\n @for (\n franchise of dropdownOptions();\n track franchise.id;\n let groupIndex = $index\n ) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let franchiseOption = cast(franchise, \"franchise\")!;\n @if (franchiseOption?.count !== null) {\n <div\n class=\"dropdown-group\"\n [class.no-items]=\"!franchiseOption?.count\"\n [class]=\"{\n active: openGroup() === franchiseOption.id,\n }\"\n [style.--max-height]=\"\n openGroup() === franchiseOption.id\n ? 30 * ((franchiseOption.fuelStopStores?.length || 0) + 1) + 'px'\n : '26px'\n \"\n >\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(franchiseOption.id, $event, franchiseOption)\"\n [class]=\"{\n unfolded: openGroup() === franchiseOption.id,\n focused: isGroupFocused,\n }\"\n >\n <p\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n <p class=\"counter\">{{ franchiseOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @if (openGroup() === franchiseOption.id) {\n @if (franchiseOption.fuelStopStores?.length || 0 > 0) {\n @for (\n fuelStopStore of franchiseOption.fuelStopStores;\n track fuelStopStore.id\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === $index + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item fuel-stop-transaction-store\"\n [class]=\"{\n focused: isOptionFocused,\n }\"\n (click)=\"handleOption(fuelStopStore, $event)\"\n >\n <p\n [innerHTML]=\"\n fuelStopStore?.store ?? '' | highlightSearch: value()\n \"\n ></p>\n @let city = fuelStopStore?.address?.city ?? \"\";\n @let state = fuelStopStore?.address?.stateShortName ?? \"\";\n @let zip = fuelStopStore?.address?.zipCode ?? \"\";\n <p\n class=\"fuel-stop-transaction-store-address\"\n [innerHTML]=\"\n city + (state || zip ? ', ' : '') + state + ' ' + zip\n | highlightSearch: value()\n \"\n ></p>\n\n @if (fuelStopStore?.[\"favourite\"]) {\n <svg-icon\n name=\"cai-favorite\"\n class=\"favorite-icon\"\n ></svg-icon>\n }\n </button>\n }\n <!-- Infinite scroll trigger - emits event when item comes into view -->\n <div\n class=\"dropdown-infinite-scroll-item\"\n caiIntersectionObserver\n [threshold]=\"0.1\"\n (inView)=\"onDropdownScrolledToBottom(true)\"\n ></div>\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n </div>\n } @else {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n [class.focused]=\"\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0\n \"\n (click)=\"handleOption(franchiseOption, $event)\"\n >\n <p\n class=\"fuel-stop-transaction-nostore\"\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- #endregion -->\n\n<!-- #region Selected options -->\n\n<!-- selected dispatch -->\n<ng-template #selectedDispatchRef>\n @let dispatchOption = cast(selectedOption(), \"dispatch\");\n @if (dispatchOption && !inputRef.value && !isAdding()) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"dispatchOption!.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ dispatchOption!.truck.truckNumber }}\n </p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatchOption!.trailer) {\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"\n cast(\n selectedOption(),\n 'dispatch'\n )!.trailer?.trailerType?.logoName?.slice(0, -4)\n \"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ dispatchOption!.trailer?.trailerNumber }}\n </p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatchOption!.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" & \" +\n dispatchOption!.coDriver?.firstName\n }}\n </p>\n } @else {\n <cai-avatar\n [driver]=\"dispatchOption!.driver\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" \" +\n dispatchOption!.driver.lastName\n }}\n </p>\n }\n </div>\n <p class=\"selected-end-item\">\n {{ dispatchOption!.payType }}\n </p>\n </div>\n } @else {\n @if (!inputRef.value && this.config().dropdown == \"dispatch\") {\n <p class=\"dropdown-selected\">Unassigned</p>\n }\n }\n</ng-template>\n\n<!-- selected broker -->\n<ng-template #selectedBrokerRef>\n @let brokerOption = cast(selectedOption(), \"broker\");\n @if (brokerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (brokerOption!.fraudCheck) {\n <svg-icon name=\"cai-status-warning-lite\" class=\"fraud-icon\"></svg-icon>\n }\n <p class=\"dropdown-selected-content\">{{ brokerOption!.businessName }}</p>\n <div class=\"selected-end-item\">\n @if (!brokerOption!.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>\n {{ brokerOption!.availableCredit || 0 | currency }}\n </p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).status\n \"\n ></div>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedContactRef>\n @let contactOption = cast(selectedOption(), \"contact\");\n @if (contactOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ contactOption?.contactName }}</p>\n <div class=\"selected-end-item\">\n <p>\n {{ contactOption?.phone }}\n {{\n contactOption?.extensionPhone\n ? \"x\" + contactOption?.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedShipperRef>\n @let shipperOption = cast(selectedOption(), \"shipper\");\n @if (shipperOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ shipperOption?.businessName }}</p>\n <div class=\"selected-end-item selected-end-item-truncate\">\n <p class=\"text-truncate\">{{ shipperOption?.address?.address }}</p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedOwnerRef>\n @let ownerOption = cast(selectedOption(), \"owner\");\n @if (ownerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"owner-ein\">{{ ownerOption?.ein }}</p>\n <p class=\"\">{{ ownerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedFuelcardRef>\n @let fuelcardOption = cast(selectedOption(), \"fuelCard\");\n @if (fuelcardOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"fuelcard-number\">\n {{ fuelcardOption?.number }}\n </p>\n <p class=\"fuelcard-brand\">\n {{ fuelcardOption?.brand }}\n </p>\n <p class=\"\">\n {{ fuelcardOption?.account }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedBankRef>\n @let bankOption = cast(selectedOption(), \"bank\");\n @if (bankOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (bankOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"bankOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ bankOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedProviderRef>\n @let providerOption = cast(selectedOption(), \"provider\");\n @if (providerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedMakeRef>\n @let makeOption = cast(selectedOption(), \"make\");\n @if (makeOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (makeOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"makeOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ makeOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedStateRef>\n @let stateOption = cast(selectedOption(), \"state\");\n @if (stateOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ stateOption?.stateShortName }}\n {{ config().fullState ? \" (\" + stateOption?.stateName + \")\" : \"\" }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDispatcherRef>\n @let dispatcherOption = cast(selectedOption(), \"dispatcher\");\n @if (dispatcherOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ dispatcherOption?.fullName }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDriverOwnerRef>\n @let driverOwnerOption = cast(selectedOption(), \"driverOwner\");\n @if (driverOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ driverOwnerOption?.fullName }}</p>\n <p class=\"selected-end-item driver-type\">\n {{ driverOwnerOption?.driverType | driverTypeLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckOwnerRef>\n @let truckOwnerOption = cast(selectedOption(), \"truckOwner\");\n @if (truckOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p class=\"dropdown-selected-content\">\n {{ truckOwnerOption.truckNumber }}\n @if (truckOwnerOption.model) {\n <span class=\"truck-owner-bullet\">\u2022</span>\n {{ truckOwnerOption.model }}\n }\n </p>\n <p class=\"selected-end-item driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckRef>\n @let truckOption = cast(selectedOption(), \"truckOption\");\n @if (truckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"truckOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ truckOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTrailerRef>\n @let trailerOption = cast(selectedOption(), \"trailerOption\");\n @if (trailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"trailerOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ trailerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedHazardousRef>\n @let hazardousOption = cast(selectedOption(), \"hazardous\");\n @if (hazardousOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"hazard-icon\"\n [name]=\"hazardousOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content dropdown-selected-hazardous\">\n {{ hazardousOption?.description }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedPmRef>\n @let pmOption = cast(selectedOption(), \"pmOption\");\n @if (pmOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"pmOption?.title | remapPmIcons\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ pmOption?.title }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedColorRef>\n @let colorOption = cast(selectedOption(), \"colorOption\");\n @if (colorOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ colorOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTollRef>\n @let tollOption = cast(selectedOption(), \"tollTransponderOption\");\n @if (tollOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">\n {{ tollOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitDriverRef>\n @let splitDriverOption = cast(selectedOption(), \"splitDriver\");\n @if (splitDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem\">\n <cai-avatar [driver]=\"splitDriverOption\" [size]=\"18\"></cai-avatar>\n <p class=\"driver-name\">\n {{ splitDriverOption.firstName + \" \" + splitDriverOption.lastName }}\n </p>\n </div>\n </div>\n\n <p class=\"selected-end-item\">\n {{ splitDriverOption.payTypeValue }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTruckRef>\n @let splitTruckOption = cast(selectedOption(), \"splitTruck\");\n @if (splitTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"splitTruckOption!.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ splitTruckOption!.truckNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTruckOption!.location?.city &&\n splitTruckOption!.location?.stateShortName\n ) {\n {{ splitTruckOption!.location?.city }},\n {{ splitTruckOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTrailerRef>\n @let splitTrailerOption = cast(selectedOption(), \"splitTrailer\");\n @if (splitTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"splitTrailerOption!.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ splitTrailerOption!.trailerNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTrailerOption!.location?.city &&\n splitTrailerOption!.location?.stateShortName\n ) {\n {{ splitTrailerOption!.location?.city }},\n {{ splitTrailerOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentDriverRef>\n @let accidentDriverOption = cast(selectedOption(), \"accidentDriver\");\n @if (accidentDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"accidentDriverOption!\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p>\n {{\n accidentDriverOption!.firstName +\n \" \" +\n accidentDriverOption!.lastName\n }}\n </p>\n </div>\n <p class=\"accident-dob\">\n {{ accidentDriverOption!.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p class=\"accident-cdl-number\">\n {{ accidentDriverOption!.cdlNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentDriverOption!.cdlState?.stateShortName }}</p>\n @if (\n accidentDriverOption!.cdlState?.countryType?.name &&\n accidentDriverOption!.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentDriverOption!.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentDriverOption!.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTruckRef>\n @let accidentTruckOption = cast(selectedOption(), \"accidentTruck\");\n @if (accidentTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTruckOption!.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"accidentTruckOption!.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTruckOption!.truckNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTruckOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTruckOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTruckOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTruckOption!.licenseState?.countryType?.name &&\n accidentTruckOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTruckOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTruckOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTrailerRef>\n @let accidentTrailerOption = cast(selectedOption(), \"accidentTrailer\");\n @if (accidentTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTrailerOption!.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon option-icon\"\n [name]=\"accidentTrailerOption!.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTrailerOption!.trailerNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTrailerOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTrailerOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTrailerOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTrailerOption!.licenseState?.countryType?.name &&\n accidentTrailerOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTrailerOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTrailerOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #passwordTooltip>\n {{ visible() ? \"Hide\" : \"Show\" }}\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (\n (config().errorBehavior === \"floating\" ||\n (config().errorBehavior === \"static\" && hasText()) ||\n config().inTable) &&\n invalid &&\n !dropdown.isOpen()\n ) {\n {{ (ngControl?.errors | errorMessage: config().customErrors)[0] }}\n }\n</ng-template>\n\n<!-- #endregion -->\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.app-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;position:relative;border-radius:2px;background-color:var(--color-surface-neutral);color:var(--color-text);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);display:flex}.app-input-container.inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #ffffff;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.app-input-container.inverse:not(.has-error):not(.has-valid) .app-input:focus-visible{color:#2f2f2f}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon,.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon,.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse.has-text:has(.app-input:disabled) .app-input-label{color:#424242!important}.app-input-container.hovered{background-color:var(--color-surface-neutral-hover)}.app-input-container.hovered:not(:has(.app-input:disabled)) .sub-label,.app-input-container.hovered:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}@media(hover:hover){.app-input-container:hover{background-color:var(--color-surface-neutral-hover)}.app-input-container:hover:not(:has(.app-input:disabled)) .sub-label,.app-input-container:hover:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}}.app-input-container.has-text .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container.has-text.fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container.has-text .subcontent{opacity:1!important}.app-input-container.has-text.static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text)}@media(hover:hover){.app-input-container.has-text.is-address:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:hover .bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral-hover)}}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible){background-color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container:has(.app-input:focus-visible) .subcontent{opacity:1!important;color:#ffffffb2;left:unset!important;right:4px!important}.app-input-container:has(.app-input:focus-visible).has-text .subcontent{right:26px!important}.app-input-container:has(.app-input:focus-visible) .sub-label,.app-input-container:has(.app-input:focus-visible) .app-input-label .accident-state{margin-right:44px}.app-input-container:has(.app-input:focus-visible).fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container:has(.app-input:focus-visible).static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text-inverse)!important}.app-input-container:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}.app-input-container:has(.app-input:disabled){background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled).hovered{background-color:var(--color-surface-disable)}@media(hover:hover){.app-input-container:has(.app-input:disabled):hover{background-color:var(--color-surface-disable)}}.app-input-container:has(.app-input:disabled):focus{background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled) .app-input-label{color:var(--color-text-subtle)}.app-input-container:has(.app-input:disabled) .separator{background-color:var(--color-icon-disable)}.app-input-container:has(.app-input:disabled) .dropdown-icon-container{opacity:0;pointer-events:none!important}.app-input-container:has(.app-input:disabled) .dropdown-selected:has(.selected-end-item){width:100%}.app-input-container:has(.app-input:disabled) .driver-type{color:#919191}.app-input-container:has(.app-input:disabled) .icon-container{pointer-events:none!important}.app-input-container:has(.app-input:disabled):not(.disabled-removable) .cancel-button{display:none!important}.app-input-container:has(.app-input:required):not(:has(.app-input:disabled)) .app-input-name:after{content:\" *\";color:var(--color-text-negative)}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .dropdown-icon-container:hover .dropdown-icon{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .hover-icon:hover{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.canceled .app-input-label,.app-input-container.canceled .app-input{color:var(--color-text-subtle)!important}.app-input-container.canceled .icon-container .icon,.app-input-container.canceled .icon-container .icon-sm{color:var(--color-icon-disable)!important}.subcontent{pointer-events:none;position:absolute;left:6px;color:#919191;-webkit-user-select:none;user-select:none;top:50%;transform:translateY(-50%);transition:right .1s ease-in-out,left .1s ease-in-out,transform .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);opacity:0;font-family:Montserrat;font-weight:400;font-style:Regular;font-size:14px;line-height:18px;letter-spacing:0%;height:18px;overflow:hidden}.subcontent .subcontent-hide{opacity:0!important}.app-input-label{position:absolute;display:flex;gap:4px;left:0;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.app-input-label.placeholder-color{color:var(--placeholder-color)!important}.app-input{padding:.25rem 6px;width:100%;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.app-input:focus-visible{color:var(--color-text-inverse)}@media(pointer:coarse){.app-input{font-size:16px;transform:scale(.875);transform-origin:left center;height:26px}}.app-input-error{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;pointer-events:none;-webkit-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text-negative);transform:translateY(-10px)}.app-input-container.has-error{background-color:var(--color-surface-negative)}.app-input-container.has-error:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-error:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-error:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-error.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-error.hovered{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error.hovered.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error.hovered.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}@media(hover:hover){.app-input-container.has-error:hover{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error:hover.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error:hover.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}}.app-input-container.has-error:has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus);color:var(--color-text-inverse)}.app-input-container.has-error:has(.app-input:focus-visible).has-text .button-icon{opacity:1}.app-input-container.has-error:has(.app-input:focus-visible).has-text .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.app-input-container.has-error:has(.app-input:focus-visible).is-empty,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected){background-color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .app-input-error,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .app-input-error{opacity:0}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .bg-icon,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .bg-icon{color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .warning-icon,.app-input-container.has-error.is-empty:has(.app-input:not(:focus-visible)) .warning-icon{opacity:1!important}.app-input-container.has-error .app-input-error{opacity:1;transform:translateY(0);pointer-events:auto}.app-input-container.has-error .app-input::selection{background-color:#ffffff4d}.app-input-container.has-error .icon-container .separator,.app-input-container.has-error .dropdown-icon-container .separator{background-color:var(--color-icon-negative)}.app-input-container.has-error .icon-container .icon,.app-input-container.has-error .icon-container .icon-sm,.app-input-container.has-error .dropdown-icon-container .icon,.app-input-container.has-error .dropdown-icon-container .icon-sm{color:var(--color-icon-negative)}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.has-valid:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-valid:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-valid:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-valid.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-valid.has-text:not(.has-dropdown):not(.in-table),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.in-table),.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.in-table){background-color:var(--color-surface-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible){background-color:var(--color-surface-positive-focus);color:var(--color-text-inverse)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon{opacity:1}.app-input-container.has-valid.has-text:not(.has-dropdown) .app-input::selection,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .app-input::selection,.app-input-container.has-valid.has-multiple-dropdown.has-text .app-input::selection{background-color:#ffffff4d}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .separator,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .separator{background-color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon-sm{color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .password-key{opacity:0;pointer-events:none}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.in-table,.in-table.has-error,.in-table.has-valid.has-text{background-color:transparent}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)) .app-input{color:var(--color-text-negative)}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)):not(.static-placeholder) .app-input-label{color:var(--color-text-negative)}.in-table .dropdown-icon-container{opacity:0}@media(hover:hover){.in-table:hover .dropdown-icon-container{opacity:1}}.in-table:has(.app-input:focus-visible) .dropdown-icon-container{opacity:1}.app-input-icon{position:absolute;right:4px;top:4px;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.button-icon{opacity:0;pointer-events:none}@media(hover:hover){.button-icon:hover{cursor:pointer}}.bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);transform-box:border-box;transform-origin:center;will-change:transform}.bg-icon svg{transition:transform .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.bg-icon:hover{transform:scale(1.2222222222)}.bg-icon:hover svg{transform:scale(.8181818182)}}.bg-icon:active{transform:scale(1)}.round-icon{background-color:#919191;color:#2f2f2f;border-radius:50%;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.positive-icon{color:var(--color-icon-positive);height:18px;width:18px;display:grid;place-items:center;opacity:0}.warning-icon{color:var(--color-icon-negative);height:18px;width:18px;display:grid;place-items:center;opacity:0}.text-color-positive:not(:hover):not(:has(.app-input:focus-visible)) .app-input{color:#3b73ed}.is-plan.has-selected .app-input,.is-plan.has-selected .dropdown-selected-content,.is-plan.has-selected .selected-text{font-weight:700}.is-plan.has-selected:not(:has(.app-input:focus-visible)) .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .selected-text{color:#3b73ed}@media(hover:hover){.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .selected-text{color:#0b49d1}}.floating-error .app-input-error{opacity:0!important}.static-error .app-input-error{pointer-events:none!important;transform:translateY(calc(-100% - 4px))!important;transition:margin .1s ease-in-out,opacity .1s ease-in-out}.static-error.has-icon .app-input-error{margin-right:26px!important}.static-error:has(.app-input:not(:focus-visible)) .app-input-error{opacity:1}.static-error.has-text .app-input-error{opacity:0!important}.static-placeholder .app-input-label{position:relative;white-space:nowrap;font-size:11px;font-weight:600}.static-placeholder .dropdown-selected{overflow:hidden;display:flex!important;justify-content:left!important}.static-placeholder .dropdown-selected .selected-label-hidden{width:max-content;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;pointer-events:none}.static-placeholder .dropdown-selected .selected-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}.static-placeholder .app-input{padding-left:0!important}.static-placeholder.has-dropdown .cancel-button{display:none}.static-placeholder.has-dropdown .dropdown-icon-container .dropdown-icon{opacity:0;pointer-events:none}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container .dropdown-icon{opacity:1!important}@media(hover:hover){.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container .dropdown-icon{opacity:1!important}}.static-placeholder.has-dropdown .dropdown-icon-container{right:4px!important;left:auto!important}.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm{color:var(--color-icon-inverse)!important}.app-input-container.has-icon.colored-icon .icon-container .icon,.app-input-container.has-icon.colored-icon .icon-container .icon-sm,.app-input-container.has-password.colored-icon .icon-container .icon,.app-input-container.has-password.colored-icon .icon-container .icon-sm,.app-input-container.has-dropdown.colored-icon .icon-container .icon,.app-input-container.has-dropdown.colored-icon .icon-container .icon-sm{color:var(--icon-color)}.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm{color:var(--color-icon-disable)!important}.app-input-container.has-icon .positive-icon,.app-input-container.has-icon .warning-icon,.app-input-container.has-password .positive-icon,.app-input-container.has-password .warning-icon,.app-input-container.has-dropdown .positive-icon,.app-input-container.has-dropdown .warning-icon{display:none!important}.app-input-container.has-icon .icon,.app-input-container.has-icon .icon-sm,.app-input-container.has-password .icon,.app-input-container.has-password .icon-sm,.app-input-container.has-dropdown .icon,.app-input-container.has-dropdown .icon-sm{height:18px;width:18px;display:grid;place-items:center;color:var(--color-icon-neutral);transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);opacity:1}.app-input-container.has-icon:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}@media(hover:hover){.app-input-container.has-icon:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}}.icon-sm{height:14px;width:14px}.app-input-container.has-icon .icon-container,.app-input-container.has-password .icon-container{height:26px;display:flex;justify-items:center;align-items:center;gap:4px;padding:.25rem 0 .25rem 6px}@media(hover:hover){.app-input-container.has-icon .icon-container:hover,.app-input-container.has-password .icon-container:hover{cursor:text}}.app-input-container.has-icon .subcontent,.app-input-container.has-password .subcontent{left:32px}.app-input-container.has-icon .app-input-label,.app-input-container.has-password .app-input-label{left:27px}.app-input-container.has-icon .app-input,.app-input-container.has-password .app-input{padding-left:4px}.separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);opacity:40%}.has-password .password-icons{display:grid;place-items:center;position:relative;height:18px;width:18px}.has-password .password-icons .icon,.has-password .password-icons .icon-sm{position:absolute;opacity:0}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-key{opacity:1!important}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-icons{pointer-events:none}.has-password:has(.app-input:disabled) .password-icons{pointer-events:none}.has-password.has-text .password-hidden,.has-password:has(.app-input:focus-visible) .password-hidden{opacity:1!important}@media(hover:hover){.has-password.has-text .password-hidden:hover,.has-password:has(.app-input:focus-visible) .password-hidden:hover{cursor:pointer}}.has-visible.has-text .password-shown,.has-visible:has(.app-input:focus-visible) .password-shown{opacity:1!important}@media(hover:hover){.has-visible.has-text .password-shown:hover,.has-visible:has(.app-input:focus-visible) .password-shown:hover{cursor:pointer}}.has-visible.has-text .password-hidden,.has-visible:has(.app-input:focus-visible) .password-hidden{opacity:0!important;pointer-events:none}.has-number .number-container{position:relative;display:flex;justify-content:center;align-items:center;right:4px;pointer-events:none}.has-number .number-buttons{display:flex;gap:4px;position:absolute;right:0;justify-content:center;align-items:center;opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);pointer-events:none}.has-number .plus-icon,.has-number .minus-icon{cursor:pointer;pointer-events:none}.has-number:has(.app-input:focus-visible){cursor:text}.has-number:has(.app-input:focus-visible) .number-buttons{opacity:1}.has-number:has(.app-input:focus-visible) .plus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .minus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .button-icon{opacity:0!important;pointer-events:none!important}.has-number:has(.app-input:focus-visible) .number-container{width:60px}.has-number:has(.app-input:focus-visible) .subcontent{right:52px!important}.has-number:has(.app-input:focus-visible).has-text .subcontent{right:52px!important}.colored-icon .icon,.colored-icon .icon-sm{color:var(--icon-color)!important}.dropdown-anchor{position:absolute;width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0}.dropdown-infinite-scroll-item{width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0;height:0}.dropdown-menu{min-width:0px!important;width:100%;border:0;margin-top:4px;top:30px;height:var(--unfiltered-height);min-height:var(--unfiltered-height);padding:0!important;overflow:hidden;border-radius:0!important;background:transparent!important}.dropdown-menu.has-stroke .dropdown-menu-content{outline:1px solid #6c6c6c;outline-offset:-1px}.dropdown-menu .dropdown-menu-content{position:absolute;width:100%;background-color:#2f2f2f;border-radius:3px;padding:4px 0 4px 4px;max-height:244px;z-index:1100!important;overflow-y:scroll;margin-top:auto!important;scroll-padding:6px 0}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar{background-color:#2f2f2f;border-radius:0 3px 3px 0;width:4px}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar-thumb{width:4px;background:#2f2f2f;border-left:2px solid #919191;background-clip:padding-box;border-radius:1px 3px 3px 1px}@supports (-moz-appearance: none){.dropdown-menu .dropdown-menu-content{padding-right:4px;scrollbar-width:4px;scrollbar-color:#919191 transparent;scrollbar-gutter:stable!important}@media(hover:hover){.dropdown-menu .dropdown-menu-content:hover{scrollbar-color:#919191 transparent;scrollbar-width:4px!important;scrollbar-gutter:stable!important}}}@-moz-document url-prefix(){.dropdown-menu .dropdown-menu-content{overflow:-moz-scrollbars-vertical;scrollbar-width:4px;scrollbar-color:#919191 transparent}}.option-icon{color:#6c6c6c;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.option-icon.full-size{width:max-content;min-width:100%;height:18px!important;min-height:18px;flex-shrink:0;overflow:hidden}.option-icon.full-size svg{height:18px;width:max-content}.cai-color{color:var(--color)!important;transition:color .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.color-item:hover .cai-color{color:var(--hover-color)!important}}.dropdown-item{color:#fff;font-weight:400;font-size:14px;line-height:18px;height:26px;padding:4px;width:100%;scroll-margin:6px 0;outline:1px solid transparent;outline-offset:-1px;display:flex;align-items:center;justify-content:left;gap:4px;background-color:#2f2f2f;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),outline .1s cubic-bezier(.46,.03,.51,.95);border-radius:2px;position:relative}.dropdown-item.focused{outline:1px solid #6c6c6c!important}.dropdown-item.focused .end-item-base{opacity:0}.dropdown-item.focused .end-item-hover{opacity:1}.dropdown-item.focused .full-icon{color:#ffffffb2}.dropdown-item.focused .truck-trailer-option{opacity:1}.dropdown-item .icon,.dropdown-item .icon-sm{color:#919191}.dropdown-item .dropdown-content-with-icon{max-width:calc(100% - 22px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content-hazardous{max-width:calc(100% - 40px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content{max-width:70%;overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){.dropdown-item:hover:not(.no-hover){background-color:#424242}.dropdown-item:hover:not(.no-hover) .end-item-base{opacity:0}.dropdown-item:hover:not(.no-hover) .end-item-hover{opacity:1}.dropdown-item:hover:not(.no-hover) .full-icon{color:#ffffffb2}.dropdown-item:hover:not(.no-hover) .truck-trailer-option{opacity:1}}.dropdown-item.no-hover{cursor:default;pointer-events:none}.dropdown-item:focus-visible{background-color:#424242;border:0;outline:none}.dropdown-item:not(:first-child){margin-top:4px}.dropdown-item.banned{color:#919191;cursor:default}@media(hover:hover){.dropdown-item.banned:hover{color:#919191;background-color:#2f2f2f}.dropdown-item.banned:hover .end-item-base{opacity:0}.dropdown-item.banned:hover .end-item-hover{opacity:1}}.dropdown-item.dnu .round-icon{background-color:#e66767}.dropdown-item.selected .dispatch-load-count,.dropdown-item.selected .unassigned-ltl,.dropdown-item.selected .unassigned-ltl .icon,.dropdown-item.selected .unassigned-ltl .icon-sm{color:#92b1f5}.dropdown-item:not(:hover):not(.focused):not(.selected) .truck-icon{color:#919191}.dropdown-item:not(:hover):not(.focused):not(.selected) .trailer-icon{color:#919191}@media(hover:hover){.dropdown-avatar:hover{z-index:20}}.no-results{color:#919191;font-weight:700;cursor:default;pointer-events:none}.add-new{color:#92b1f5!important;font-weight:700;font-size:11px}.add-new .dropdown-item-icon{opacity:1}@media(hover:hover){.add-new:hover{background-color:#3b73ed66!important;color:#fff!important}}.selected{font-weight:700}.selected .dropdown-item-icon{opacity:1}.selected .dropdown-item-count{color:#fff;background-color:#3b73ed}.selected .full-icon{color:#fff}.selected .end-item-base,.selected .end-item-hover{font-weight:700;color:#92b1f5}.selected .end-item-base .icon,.selected .end-item-base .icon-sm,.selected .end-item-hover .icon,.selected .end-item-hover .icon-sm{color:#92b1f5}.dropdown-item-icon{opacity:0;color:#92b1f5;width:14px;height:14px;margin-left:auto}.dropdown-item-icon.no-margin{margin-left:0}.dropdown-item-count{position:absolute;right:6px;top:50%;transform:translateY(-50%);padding:2px 5px;border-radius:10px;background-color:#424242;color:#ffffffb2;min-width:18px;line-height:14px;font-weight:600;font-size:11px;text-align:center}.fraud-icon{color:#fab15c!important;height:18px;width:18px}.dropdown-icon-container{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;display:grid;place-items:center;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-icon-container.open .dropdown-icon{transform:rotateX(180deg)}.dropdown-icon{transition:transform .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)!important;transform:rotateX(0);cursor:pointer}.has-dropdown .app-input-icon{right:26px}.has-dropdown:has(.app-input:focus-visible) .subcontent{right:26px!important}.has-dropdown:has(.app-input:focus-visible).has-text .subcontent,.has-dropdown:has(.app-input:focus-visible).has-selected .subcontent{right:48px!important}.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}@media(hover:hover){.has-dropdown:hover:not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}}.has-right .app-input{text-align:right}@media(pointer:coarse){.has-right .app-input{transform-origin:right center}}.has-right .positive-icon,.has-right .app-input-icon{left:4px;right:auto}.has-right .cancel-button{z-index:1}.has-right.has-number .plus-button-container{order:2}.has-right.has-number .minus-button-container{order:1}.has-right.static-placeholder .app-input-icon{right:4px!important;left:auto!important;opacity:0!important}.has-right.static-placeholder:has(.app-input:focus-visible) .cancel-button{opacity:0!important;pointer-events:none!important}.has-right.static-placeholder.removable .cancel-button .bg-icon{background-color:transparent!important}@media(hover:hover){.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon{color:var(--color-icon-positive)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon{color:var(--color-icon-neutral)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon{color:var(--color-icon-negative)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button{opacity:1!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button .bg-icon{opacity:1!important;pointer-events:auto!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon,.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon-sm{opacity:0!important}}@media(hover:hover){.has-right.static-placeholder:hover:not(:has(.app-input:focus-visible)):not(:has(.app-input:disabled)).has-text .cancel-button{opacity:1!important}}.has-right .app-input{order:1}.has-right.has-subcontent .app-input{flex:1;min-width:0;word-break:none}.has-right .dropdown-selected{margin-left:0!important;text-align:right!important;right:0!important;left:0!important;justify-content:flex-end!important;width:100%!important}.has-right .subcontent{position:relative!important;order:1;display:grid;place-items:center;padding-right:4px;height:unset!important;transform:translateY(0)!important;left:0!important;right:unset!important}.has-right .subcontent .subcontent-hide{display:none!important}.has-right.has-text .subcontent{left:0!important;right:unset!important}.has-right:has(.app-input:focus-visible) .subcontent{left:0!important;right:unset!important}.has-right.has-icon .subcontent,.has-right.has-password .subcontent{padding-right:0!important;padding-left:4px}.has-right.has-icon .dropdown-selected,.has-right.has-password .dropdown-selected{width:calc(100% - 24px)!important}.has-right.has-icon .app-input,.has-right.has-password .app-input{padding-right:0!important}.has-right.has-icon .app-input-label,.has-right.has-password .app-input-label{left:0!important}.has-right.has-icon.fade-placeholder .app-input-label,.has-right.has-password.fade-placeholder .app-input-label{left:auto!important;right:24px!important}.has-right.has-icon .icon-container,.has-right.has-password .icon-container{width:30px;padding-left:4px}.has-right.has-icon .icon-container .icon,.has-right.has-icon .icon-container .icon-sm,.has-right.has-password .icon-container .icon,.has-right.has-password .icon-container .icon-sm{order:2}.has-right.has-dropdown .app-input-icon{left:26px}.has-right.has-dropdown .dropdown-icon-container{left:4px}.has-right .warning-icon{display:none!important}.has-right.has-number .separator{order:3}.has-right.has-number .number-buttons{left:0;right:unset}.has-right.has-number .number-container{left:4px;right:unset}.has-right.has-number.app-input-container:has(.app-input:focus-visible) .app-input{padding-left:4px}@media(hover:hover){.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .number-container{width:60px}.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .app-input{padding-left:4px}}.has-right .icon-container{order:2;margin-right:4px}.has-right .icon-container .password-icons{order:2}.has-right.fade-placeholder .app-input-label{right:0!important;left:auto!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:after{content:none!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:before{content:\"* \";color:var(--color-text-negative)}@media(hover:hover){.removable:has(.cancel-button:hover).in-table{background-color:transparent!important}.removable:has(.cancel-button:hover).in-table .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):not(.in-table){background-color:var(--color-surface-negative-hover)!important}.removable:has(.cancel-button:hover):not(.in-table) .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus)!important}.removable:has(.cancel-button:hover):has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}}.no-clear .cancel-button{display:none!important}.is-adding{padding-right:20px}.is-adding .dropdown-icon{opacity:0!important}.is-adding .accept-button{pointer-events:none;opacity:0!important}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.is-adding:has(.app-input:focus-visible){padding-right:48px!important}@media(hover:hover){.is-adding:hover{padding-right:48px!important}}.is-adding.has-right{padding-left:26px}.is-adding.has-right.has-right:has(.app-input:focus-visible){padding-left:40px}@media(hover:hover){.is-adding.has-right.has-right:hover{padding-left:40px}}.is-adding .app-input-icon{right:4px}@media(hover:hover){.is-adding.has-text:hover .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:hover .accept-button{pointer-events:auto;opacity:1!important}}.is-adding.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:has(.app-input:focus-visible) .accept-button{pointer-events:auto;opacity:1!important}.is-adding .cancel-button{opacity:1!important;pointer-events:auto}.is-adding .dropdown-icon-container{pointer-events:none}.is-adding .accept-button{right:26px;pointer-events:auto}.dropdown-selected{-webkit-user-select:none;user-select:none;position:absolute;top:50%;transform:translateY(-50%);left:0;width:calc(100% - 22px);pointer-events:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;word-break:break-all;padding:.25rem 6px;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),width .1s ease-in-out;color:var(--color-text);display:flex;gap:4px}.dropdown-selected .dropdown-selected-content{overflow:hidden;-webkit-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.dropdown-selected .dropdown-selected-hazardous{max-width:calc(100% - 22px)}p.dropdown-selected{-webkit-user-select:none;user-select:none;display:block}.app-input-container:has(.app-input:focus-visible) .dropdown-selected{color:#fff;opacity:.7}.app-input-container:has(.app-input:focus-visible) .dropdown-selected .option-icon{color:#fff!important}.has-icon .positive-icon,.has-icon .warning-icon{display:none}.has-icon .dropdown-selected{left:27px;width:calc(100% - 49px)}@media(hover:hover){.has-icon:hover .dropdown-selected{width:calc(100% - 71px)}}.has-icon.app-input-container:has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 71px)}.hazard-icon{height:18px;width:max-content}.has-dispatch .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.dispatch-load-count{color:#dadada;font-weight:700}.dispatch-separator{color:#919191;font-weight:400}.dispatch-status{font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:14px;letter-spacing:0%;text-transform:uppercase;color:#ffffffb2;border-radius:2px;padding:2px 4px;display:flex;justify-content:center;align-items:center;gap:4px}.dispatch-status.status-available{background-color:#50ac2533}.dispatch-status.status-dispatched{background-color:#3b73ed33}.dispatch-status.status-arrivedpickup,.dispatch-status.status-checkedinpickup,.dispatch-status.status-checkedin,.dispatch-status.status-loading,.dispatch-status.status-loaded{background-color:#259f9433}.dispatch-status.status-arriveddelivery,.dispatch-status.status-checkedindelivery,.dispatch-status.status-offloading,.dispatch-status.status-offloaded,.dispatch-status.status-empty{background-color:#ff704333}.dispatch-status.status-canceled{background-color:#df3c3c33}.dispatch-status.status-off,.dispatch-status.status-deadheading,.dispatch-status.status-break,.dispatch-status.status-split{background-color:#91919133}.dispatch-status.status-towing{background-color:#9e47ec33}.dispatch-status.status-repair,.dispatch-status.status-dispatchedrepair,.dispatch-status.status-loadedrepair{background-color:#865e3a33}.dispatch-status .status-block{border-radius:1px;background-color:#aaa;padding-left:2px;padding-right:2px;font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:12px;text-align:center;color:#2f2f2f;min-width:12px;height:12px}.dispatch-status .status-block.blue{background-color:#6692f1}.dispatch-status .status-block.green{background-color:#56b4ac}.dispatch-status .status-block.orange{background-color:#ff906d}.has-ftl-dispatch,.has-dispatch{min-width:600px}.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon{color:#fff}.dropdown-subitem{display:flex;justify-content:left;align-items:center;gap:4px}.truck-item{width:128px}.trailer-item{width:138px}.truck-trailer-option{opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);margin-left:auto}.truck-trailer-icon-colors.ic_truck_semi-truck,.truck-trailer-icon-colors.ic_truck_semi-wSleeper{color:#92b1f5}.truck-trailer-icon-colors.ic_truck_box-truck,.truck-trailer-icon-colors.ic_truck_reefer,.truck-trailer-icon-colors.ic_truck_cargo-van{color:#fbc88b}.truck-trailer-icon-colors.ic_truck_cement,.truck-trailer-icon-colors.ic_truck_dump,.truck-trailer-icon-colors.ic_truck_garbage{color:#ed9292}.truck-trailer-icon-colors.ic_truck_tow-truck,.truck-trailer-icon-colors.ic_truck_car-hauler,.truck-trailer-icon-colors.ic_truck_spotter{color:#86c9c3}.truck-trailer-icon-colors.ic_trailer_flatbed,.truck-trailer-icon-colors.ic_trailer_low-boy,.truck-trailer-icon-colors.ic_trailer_step-deck{color:#92b1f5}.truck-trailer-icon-colors.ic_trailer_chassis,.truck-trailer-icon-colors.ic_trailer_container{color:#80d6f1}.truck-trailer-icon-colors.ic_trailer_conestoga,.truck-trailer-icon-colors.ic_trailer_side-kit{color:#8785e8}.truck-trailer-icon-colors.ic_trailer_dryvan,.truck-trailer-icon-colors.ic_trailer_reefer{color:#fbc88b}.truck-trailer-icon-colors.ic_trailer_end-dump,.truck-trailer-icon-colors.ic_trailer_bottom-dump,.truck-trailer-icon-colors.ic_trailer_hopper{color:#ed9292}.truck-trailer-icon-colors.ic_trailer_tanker,.truck-trailer-icon-colors.ic_trailer_tanker-pneumatic{color:#ed93bb}.truck-trailer-icon-colors.ic_trailer_carhauler,.truck-trailer-icon-colors.ic_trailer_carhauler-stinger{color:#86c9c3}.sub-label{margin-left:auto;margin-right:22px;opacity:0;transition:margin .1s ease-in-out,opacity .1s ease-in-out;color:#6c6c6c}.app-input-label:has(.sub-label),.app-input-label:has(.accident-state){width:100%}.has-selected .sub-label{opacity:1}.dispatch-icon,.trailer-icon,.truck-icon{color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.truck-icon,.trailer-icon{width:42px}.truck-number{width:80px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.trailer-number{width:90px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.driver-name{max-width:170px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.dropdown-subitem-end{margin-left:auto;position:relative;height:26px;width:auto;display:flex;justify-content:right;align-items:center;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;vertical-align:bottom}.end-item-base{position:absolute;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);text-align:right}.dispatch-ltl{font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.unassigned-ltl{margin-left:auto;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.end-item-hover{position:absolute;display:flex;justify-content:right;align-items:center;gap:4px;width:max-content;opacity:0;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.selected-end-item{margin-left:auto;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;display:flex;justify-content:right;align-items:center;gap:4px}.group-item{font-family:Montserrat;font-weight:700!important;font-size:11px!important;line-height:18px;letter-spacing:0%;vertical-align:middle;text-transform:uppercase;background-color:#2f2f2f;color:#aaa!important}.group-item:not(:first-child){border-top:1px solid #424242}.group-item .group-icon{margin-left:auto;transform:rotate(180deg);transition:transform .1s cubic-bezier(.46,.03,.51,.95)}.group-item.unfolded{color:#fff!important}.group-item.unfolded .group-icon{transform:rotate(0)}.counter{background-color:#424242;padding:1px 4px;border-radius:60px;font-family:Montserrat;font-weight:600;font-size:11px;min-width:18px;line-height:14px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#ffffffb2;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.password-requirement{padding:6px;background-color:#fffffff2!important;box-shadow:0 0 4px #0006;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);overflow-y:hidden}.password-requirement p{font-family:Montserrat;font-weight:600;font-size:11px;line-height:14px;letter-spacing:0%;vertical-align:middle;color:#6c6c6c;font-style:italic}.password-requirement .icon,.password-requirement .icon-sm{width:14px!important;height:14px!important}.password-requirement .icon.checkmark,.password-requirement .checkmark.icon-sm{color:#ccc}.password-requirement .icon.cancel,.password-requirement .cancel.icon-sm{color:#e66767}.password-requirement ul{list-style-type:none;margin:6px 0 0;padding:0}.password-requirement ul li{color:#424242;font-size:11px;font-style:italic;font-weight:500;line-height:14px;display:flex;gap:4px}.password-requirement ul li.valid{color:#919191!important}.password-requirement ul li:not(:first-child){margin-top:6px}@media(hover:hover){.has-end-item:not(:has(.app-input:disabled)):hover .dropdown-selected{width:calc(100% - 44px)}}.has-end-item:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 44px)}.progress-bar{width:24px;height:8px;border-radius:2px;position:relative;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar:after{content:\"\";position:absolute;top:0;width:var(--progress);height:100%;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar.low{background-color:#df3c3c33}.progress-bar.low:after{background-color:#e66767}.progress-bar.medium{background-color:#f89b2e33}.progress-bar.medium:after{background-color:#fab15c}.progress-bar.high{background-color:#56b4ac33}.progress-bar.high:after{background-color:#56b4ac}.progress-bar.disable{background-color:#91919133}.progress-bar.disable:after{display:none}.app-input-container:has(.app-input:focus-visible) .selected-end-item .progress-bar{background-color:#fff!important}.full-icon{color:#919191}.fuelcard-number{width:216px}.fuelcard-brand{width:132px}.owner-ein{width:118px}.accident-name,.accident-unit,.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{flex-shrink:0}.accident-name>p,.accident-unit>p{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-name{width:218px}.accident-unit{width:170px}.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{text-align:right;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-dob{width:134px}.accident-cdl-number{width:140px}.accident-vin{width:182px}.accident-plate{width:140px}.accident-state{margin-left:auto;justify-content:flex-end;text-align:right}.app-input-label .accident-state{margin-right:22px;white-space:nowrap;transition:margin .1s ease-in-out}.has-multiple-dropdown.has-text{border-top-left-radius:0!important;border-top-right-radius:0!important}.multiple-container{display:flex;flex-wrap:wrap;gap:4px;padding:4px;border-top-left-radius:2px;border-top-right-radius:2px;position:relative;transition:background-color .1s ease-in-out;background-color:#e9effd}.multiple-container.hovered{background-color:#bed0f9}.multiple-container.hovered .multiple-selected{background-color:#e9effd}.multiple-container.focused{background-color:#0b49d1}.multiple-container.focused .multiple-selected{background-color:#3b73ed;color:#fff}.multiple-selected{background-color:#bed0f9;color:#2f2f2f;transition:background-color .1s ease-in-out,color .1s ease-in-out;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;padding:2px 4px;-webkit-user-select:none;user-select:none;font-family:Montserrat;font-size:14px;font-weight:400;line-height:18px;width:209px;height:22px;border-radius:1px}.multiple-selected p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media(hover:hover){.multiple-selected:hover{color:#2f2f2f!important;background-color:#fff!important}.multiple-selected:hover .multiple-remove-button{opacity:1}}.multiple-selected .multiple-remove-button{opacity:0;background-color:#6692f1;color:#fff;width:14px;height:14px}.multiple-selected .multiple-remove-button .multiple-remove-icon{width:12px;height:12px}.multiple-label{color:#424242;-webkit-user-select:none;user-select:none;pointer-events:none;font-family:Montserrat;font-size:11px;font-style:normal;font-weight:600;position:absolute;top:0;left:6px;transform:translateY(-14px)}.dropdown-group{border-radius:2px;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),max-height .1s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;margin-top:4px;max-height:var(--max-height);height:var(--max-height);overflow:hidden}.dropdown-group.no-items{cursor:default;pointer-events:none}.dropdown-group .group-item{outline:none;color:#fff!important;font-weight:400!important;font-size:14px!important;display:flex;transition:font-weight .1s ease-in-out,background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);padding-left:6px;padding-right:6px}.dropdown-group .group-item.unfolded .counter{color:#fff}@media(hover:hover){.dropdown-group .group-item:hover .counter{color:#fff}}.dropdown-group .group-item.unfolded{font-weight:700!important}.dropdown-group .group-item .counter{margin-left:auto}.dropdown-group .group-item .group-icon{margin-left:0}.dropdown-group.active{background-color:#424242}@media(hover:hover){.dropdown-group.active .group-item:hover{background-color:#424242}}.dropdown-group.active .dropdown-item{background-color:#424242}@media(hover:hover){.dropdown-group:hover:not(.no-items){background-color:#424242}.dropdown-group:hover:not(.no-items) .group-item:hover{background-color:#424242}.dropdown-group:hover:not(.no-items) .dropdown-item{background-color:#424242}}.dropdown-group.active{padding:4px;padding-top:0!important}.dropdown-group.active .group-item{position:relative!important;padding-left:2px!important;padding-right:2px!important}@media(hover:hover){.dropdown-group .dropdown-item:not(.group-item):hover{background-color:#6c6c6c!important}}.fuel-stop-transaction-store{display:flex;gap:4px}.fuel-stop-transaction-store .fuel-stop-transaction-store-address{font-size:11px;color:#ccc;margin-left:auto}.fuel-stop-transaction-store .favorite-icon{color:#92b1f5;width:14px;height:14px}.fuel-stop-transaction-nostore{padding-left:2px;padding-right:2px}.hide-dropdown{opacity:0;pointer-events:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown) .dropdown-menu-content{transition:max-height .2s cubic-bezier(.46,.03,.51,.95),opacity .2s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;animation:dropdown-menu-opening .2s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown).animate-dropdown .dropdown-menu-content{max-height:var(--max-height);height:var(--max-height)}.closing:not(.hide-dropdown) .dropdown-menu-content{animation:dropdown-menu-closing .2s cubic-bezier(.46,.03,.51,.95);opacity:0;max-height:0}@keyframes dropdown-menu-opening{0%{max-height:0;opacity:0}to{max-height:244px;opacity:1}}@keyframes dropdown-menu-closing{0%{max-height:244px;opacity:1}to{max-height:0;opacity:0}}.app-input-container:has(.app-input:focus-visible).has-dropdown .loader.loading,.app-input-container:has(.app-input:focus-visible).has-text .loader.loading{opacity:1!important}.app-input-container:has(.app-input:focus-visible).has-dropdown.has-text .loader{transform:translate(-48px)}.loader{position:absolute;top:4px;right:0;transform:translate(-26px);pointer-events:none;z-index:1000;width:18px;height:18px;display:flex;align-items:center;justify-content:center;transition:opacity .1s ease-in-out,transform .1s ease-in-out;opacity:0}.loader-icon{width:14px;height:14px;animation:spin .8s ease-in-out infinite;transform-origin:center;display:flex;align-items:center;justify-content:center}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.size-22{height:22px}.size-22 .icon,.size-22 .icon-sm{height:14px!important;width:14px!important}.size-22 .bg-icon{height:14px!important;width:14px!important;padding:2px!important}.size-22 .icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.size-22 .app-input{padding-top:2px;padding-bottom:2px;padding-left:4px}@media(pointer:coarse){.size-22 .app-input{height:22px}}.size-22 .app-input-label{padding-top:2px;padding-bottom:2px;padding-left:4px}.size-22.has-icon .app-input-label{padding-left:0!important}.size-22 .app-input-icon{height:14px!important;width:14px!important}.size-22.has-text .app-input-label,.size-22:has(.app-input:focus-visible) .app-input-label{transform:translateY(-18px)}.size-22 .loader{top:2px;transform:translate(-22px)!important}.strikethrough .app-input,.strikethrough .dropdown-selected-content{text-decoration:line-through}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.split-option>p{max-width:calc(50% - 2px)}.split-option .dropdown-subitem-end{width:calc(50% - 2px)}.split-option .end-item-base,.split-option .end-item-hover{max-width:100%}.selected-end-item-truncate{max-width:50%}.truck-owner-unit{min-width:0}.truck-owner-unit .dropdown-content{max-width:none;min-width:0}.truck-owner-bullet{flex-shrink:0;color:#919191}\n"] }]
|
|
4838
|
+
], template: "<!-- #region Variables -->\n@let valid =\n ngControl?.valid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let invalid =\n ngControl?.invalid &&\n (ngControl?.touched || ngControl?.dirty) &&\n !isAdding() &&\n !isDisabled();\n@let subcontent =\n config().subcontent ||\n (config().dropdown === \"subcontent\" &&\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![config().optionLabel || \"label\"]);\n\n@let name = config().name;\n@let password = config().type === \"password\" || config().type === \"account\";\n\n@let optionLabel = this.config().optionLabel || \"label\";\n@let dropdownType = this.config().dropdown;\n\n@let focusedOptionIndex = keyboardNavigationState().singleIndex;\n@let groupedNavigationState = keyboardNavigationState().groupedNavigationState;\n\n@let tooltipClass =\n config().inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n<!-- #region Multiple selection -->\n@if (config().dropdown === \"multiple\" && !!multipleSelectedOptions().length) {\n <div\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"toggleHovered(true)\"\n (mouseleave)=\"toggleHovered(false)\"\n class=\"multiple-container\"\n [class]=\"{\n focused: focused(),\n hovered: hovered(),\n }\"\n >\n <label class=\"multiple-label\">{{ name }}</label>\n\n @for (option of multipleSelectedOptions(); track $index) {\n <div class=\"multiple-selected\">\n <p>{{ cast(option, \"dropdownOption\")![optionLabel || \"label\"] }}</p>\n <button\n type=\"button\"\n class=\"\"\n (pointerdown)=\"handleOption(option, $event)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Clear\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n [container]=\"'body'\"\n >\n <svg-icon\n name=\"cai-cancel\"\n class=\"multiple-remove-button multiple-remove-icon bg-icon\"\n ></svg-icon>\n </button>\n </div>\n }\n </div>\n}\n<!-- #endregion -->\n\n@let hasFloatingError =\n invalid &&\n (config().errorBehavior === \"floating\" ||\n (!!config().inTable && config().placeholderBehavior !== \"static\"));\n\n<div\n class=\"app-input-container\"\n [class]=\"\n {\n config: config(),\n hideValidation: hideValidation(),\n isPasswordVisible: visible(),\n isInvalid: !!invalid || forceInvalidStyling(),\n isValid: !!valid && !forceInvalidStyling(),\n isHovered: hovered(),\n hasText: hasText(),\n isAdding: isAdding(),\n selectedOption: selectedOption(),\n } | inputClass\n \"\n ngbDropdown\n [autoClose]=\"false\"\n #dropdown=\"ngbDropdown\"\n dropdownClass=\"cai-dropdown\"\n #containerRef\n [ngbTooltip]=\"errorTooltip\"\n [disableTooltip]=\"!hasFloatingError\"\n [container]=\"'body'\"\n [placement]=\"['bottom', 'top']\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip \"\n (pointerdown)=\"focus($event)\"\n (mouseenter)=\"dropdownType === 'multiple' && toggleHovered(true)\"\n (mouseleave)=\"dropdownType === 'multiple' && toggleHovered(false)\"\n>\n @if (config().icon && !password && !config().withButtons) {\n <div\n class=\"icon-container\"\n (pointerdown)=\"focus($event)\"\n [class]=\"{\n 'colored-icon': config().iconColor,\n }\"\n [style.--icon-color]=\"config().iconColor || ''\"\n >\n <svg-icon class=\"icon\" [name]=\"config().icon || ''\"></svg-icon>\n @if (!config().noSeparator) {\n <div class=\"separator\"></div>\n }\n </div>\n }\n @if (password) {\n <div class=\"icon-container\" (pointerdown)=\"toggleVisibility($event)\">\n <div\n class=\"password-icons\"\n [ngbTooltip]=\"passwordTooltip\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [placement]=\"'top'\"\n [openDelay]=\"600\"\n >\n <svg-icon\n class=\"icon password-key hover-icon\"\n name=\"cai-password-key\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-shown hover-icon\"\n name=\"cai-password-shown\"\n ></svg-icon>\n <svg-icon\n class=\"icon password-hidden hover-icon\"\n name=\"cai-password-hidden\"\n ></svg-icon>\n </div>\n <div class=\"separator\"></div>\n </div>\n }\n\n <input\n class=\"app-input\"\n [tabindex]=\"isDisabled() ? '-1' : '0'\"\n [type]=\"\n password && !isPartiallyMasked()\n ? visible()\n ? 'text'\n : 'password'\n : 'text'\n \"\n [required]=\"config().required\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (blur)=\"dispatchOnBlur()\"\n [id]=\"id()\"\n [attr.aria-label]=\"config().label\"\n [attr.name]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n [placeholder]=\"config()?.placeholder || ''\"\n [autocomplete]=\"\n config().autocomplete ? config().autocomplete : randomAutocomplete()\n \"\n #inputRef\n [appPassword]=\"password\"\n [appMask]=\"config().mask || ''\"\n [phone]=\"config().type === 'phone'\"\n [isInternational]=\"config().isInternational || false\"\n [phoneCountries]=\"config().phoneCountries\"\n [defaultDialCode]=\"config().defaultDialCode\"\n [attr.inputmode]=\"config().type === 'phone' ? 'tel' : null\"\n [appNumberRangeList]=\"config().numberRangeList || false\"\n [reveal]=\"config().reveal || 0\"\n [hide]=\"config().hide || 0\"\n [account]=\"config().type === 'account'\"\n [visible]=\"visible()\"\n [appNumberFormat]=\"config().type === 'number'\"\n [isNumberFormattingDisabled]=\"config().isNumberFormattingDisabled || false\"\n [numberFormat]=\"config().numberFormat\"\n [disableDecimals]=\"config().disableDecimals || false\"\n [prefix]=\"config().prefix || ''\"\n [max]=\"config().max\"\n [clampToMax]=\"config().clampToMax || false\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus($event)\"\n />\n @if (\n !(dropdownType === \"multiple\" && !!multipleSelectedOptions().length) &&\n config().placeholderBehavior !== \"hidden\"\n ) {\n <label\n class=\"app-input-label\"\n [class.placeholder-color]=\"this.config().placeholderColor\"\n [style.--placeholder-color]=\"this.config().placeholderColor || ''\"\n (click)=\"focus($event)\"\n >\n <!-- Truck Trailer Driver Dropdown label -->\n @if (dropdownType === \"dispatch\" || dropdownType === \"ftl-dispatch\") {\n <p class=\"truck-item app-input-name\">Truck</p>\n <p class=\"trailer-item\">Trailer</p>\n <p>Driver</p>\n <p class=\"sub-label\">Rate</p>\n }\n <!-- Split Load -->\n @else if (dropdownType === \"split-driver\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Rate</p>\n } @else if (\n dropdownType === \"split-truck\" || dropdownType === \"split-trailer\"\n ) {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Location</p>\n }\n <!-- Dropdown variants -->\n @else if (dropdownType === \"broker\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Credit</p>\n } @else if (dropdownType === \"contact\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Phone</p>\n } @else if (dropdownType === \"shipper\") {\n <p class=\"app-input-name\">{{ name }}</p>\n <p class=\"sub-label\">Address</p>\n } @else if (dropdownType === \"owner\") {\n <p class=\"owner-ein app-input-name\">EIN</p>\n <p class=\"app-input-name\">Company Name</p>\n } @else if (dropdownType === \"fuelcard\") {\n <p class=\"fuelcard-number app-input-name\">Card No.</p>\n <p class=\"fuelcard-brand app-input-name\">Provider</p>\n <p class=\"app-input-name\">Nickname</p>\n }\n <!-- Accident -->\n @else if (dropdownType === \"accident-driver\") {\n <p class=\"accident-name app-input-name\">{{ name }}</p>\n <p class=\"accident-dob app-input-name\">DOB</p>\n <p class=\"accident-cdl-number app-input-name\">CDL No.</p>\n <p class=\"accident-state app-input-name\">CDL State</p>\n } @else if (\n dropdownType === \"accident-truck\" || dropdownType === \"accident-trailer\"\n ) {\n <p class=\"accident-unit app-input-name\">{{ name }}</p>\n <p class=\"accident-vin app-input-name\">VIN</p>\n <p class=\"accident-plate app-input-name\">Lic. Plate No.</p>\n <p class=\"accident-state app-input-name\">Lic. State</p>\n }\n <!-- Default Dropdown label -->\n @else {\n <span class=\"app-input-name\">{{ name }}</span>\n }\n </label>\n }\n @if (config().type === \"number\" && config().withButtons) {\n <div class=\"number-container\">\n <div class=\"number-buttons\">\n <div class=\"separator\"></div>\n <div\n class=\"plus-button-container\"\n ngbTooltip=\"Add\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n (pointerdown)=\"increment($event)\"\n >\n <svg-icon name=\"cai-plus\" class=\"bg-icon plus-icon\"></svg-icon>\n </div>\n <div\n class=\"minus-button-container\"\n ngbTooltip=\"Remove\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [tooltipClass]=\"tooltipClass\"\n [autoClose]=\"true\"\n [openDelay]=\"600\"\n (pointerdown)=\"decrement($event)\"\n >\n <svg-icon name=\"cai-minus\" class=\"bg-icon minus-icon\"></svg-icon>\n </div>\n </div>\n </div>\n }\n @if (!config().inTable) {\n @if (!dropdownType) {\n <svg-icon\n name=\"cai-checkmark\"\n class=\"app-input-icon positive-icon\"\n ></svg-icon>\n <svg-icon\n name=\"cai-status-warning\"\n class=\"app-input-icon warning-icon\"\n ></svg-icon>\n }\n }\n\n @if (\n invalid &&\n config().errorBehavior !== \"hidden\" &&\n (ngControl?.errors | errorMessage: config().customErrors : config().numberFormat)[0] &&\n !(config().inTable && config().placeholderBehavior !== \"static\")\n ) {\n <div class=\"app-input-error\">\n {{ (ngControl?.errors | errorMessage: config().customErrors : config().numberFormat)[0] }}\n </div>\n }\n\n <!-- Accept button -->\n @if ((config().add && isAdding()) || config().isEdit) {\n <button\n type=\"button\"\n class=\"app-input-icon button-icon accept-button\"\n (pointerdown)=\"addOption()\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"Confirm\"\n [openDelay]=\"600\"\n [placement]=\"'top'\"\n [tooltipClass]=\"tooltipClass\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n >\n <svg-icon class=\"bg-icon\" name=\"cai-checkmark\"></svg-icon>\n </button>\n }\n\n <!-- Cancel button -->\n <button\n type=\"button\"\n class=\"app-input-icon button-icon cancel-button\"\n (pointerdown)=\"reset($event)\"\n (mouseenter)=\"onClearHover(true)\"\n (mouseleave)=\"onClearHover(false)\"\n [tabIndex]=\"-1\"\n ngbTooltip=\"{{\n hasText()\n | clearTooltip\n : isAdding()\n : config().isEdit || false\n : config().placeholderBehavior || 'dynamic'\n : dropdownType === 'multiple'\n : config().hasResetButton\n : canTooltipBeVisible()\n }}\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #closeTooltip=\"ngbTooltip\"\n >\n @let iconName =\n config().hasResetButton\n ? \"cai-reset\"\n : config().removable\n ? \"cai-delete\"\n : \"cai-cancel\";\n <svg-icon class=\"bg-icon\" [name]=\"iconName\"></svg-icon>\n </button>\n\n <div class=\"dropdown-anchor\" ngbDropdownAnchor></div>\n <!-- Dropdown menu -->\n\n @let hasLoader = isLoading() !== undefined;\n\n @if (hasLoader) {\n <div class=\"loader\" [class.loading]=\"isLoading()\">\n <svg-icon name=\"cai-loader\" class=\"loader-icon\"></svg-icon>\n </div>\n }\n\n @if (dropdownType) {\n @let maxHeight =\n ((dropdownOptions()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n @let animateDropdown =\n dropdownType !== \"toll\" &&\n dropdownType !== \"fuel-stop-transaction\" &&\n dropdownType !== \"dispatch\" &&\n dropdownType !== \"ftl-dispatch\" &&\n dropdownType !== \"split-driver\" &&\n dropdownType !== \"split-truck\" &&\n dropdownType !== \"split-trailer\";\n\n @let unfilteredHeight =\n dropdownType === \"contact\" || !animateDropdown\n ? 244\n : ((options()?.length || (showNoResults() ? 1 : 0)) +\n (config().add ? 1 : 0)) *\n 30 +\n 4;\n\n <div\n ngbDropdownMenu\n class=\"dropdown-menu input-dropdown-menu\"\n [class]=\"{\n 'hide-dropdown':\n config().dropdownAutocomplete &&\n !dropdownOptions()?.length &&\n !(showNoResults() && value()),\n 'animate-dropdown': animateDropdown,\n 'size-22': config().size === 22,\n 'has-stroke': config().hasStroke,\n }\"\n [class.closing]=\"closing()\"\n [style.--unfiltered-height]=\"\n unfilteredHeight > 244 ? '244px' : unfilteredHeight + 'px'\n \"\n [style.--max-height]=\"maxHeight > 244 ? '244px' : maxHeight + 'px'\"\n [style.width.px]=\"containerWidth()\"\n [tabindex]=\"-1\"\n (pointerdown)=\"onDropdownBackgroundClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <div\n class=\"dropdown-menu-content\"\n [tabindex]=\"-1\"\n caiInfiniteScroll\n [scrollThreshold]=\"50\"\n (scrolledToBottom)=\"onDropdownScrolledToBottom()\"\n >\n @if (config().add) {\n <button\n class=\"dropdown-item add-new\"\n [class.focused]=\"\n focusedOptionIndex === -1 ||\n groupedNavigationState?.groupIndex === -1\n \"\n (click)=\"handleAddingOption($event)\"\n >\n <p>ADD NEW</p>\n <svg-icon name=\"cai-plus\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"dropdownMenuRef\"></ng-container>\n </div>\n </div>\n\n @if (!config().dropdownAutocomplete) {\n <div\n class=\"dropdown-icon-container\"\n [class.open]=\"dropdown.isOpen() && !closing()\"\n (pointerdown)=\"onDropdownIconClick($event)\"\n >\n <svg-icon\n name=\"cai-arrow-secondary-down\"\n class=\"dropdown-icon icon\"\n ></svg-icon>\n </div>\n }\n @let specialDropdown =\n dropdownType === \"dispatch\" ||\n dropdownType === \"ftl-dispatch\" ||\n dropdownType === \"broker\" ||\n dropdownType === \"contact\" ||\n dropdownType === \"shipper\" ||\n dropdownType === \"bank\" ||\n dropdownType === \"dispatcher\" ||\n dropdownType === \"driver-owner\" ||\n dropdownType === \"truck-owner\" ||\n dropdownType === \"truck\" ||\n dropdownType === \"trailer\" ||\n dropdownType === \"hazardous\" ||\n dropdownType === \"state\" ||\n dropdownType === \"owner\" ||\n dropdownType === \"fuelcard\" ||\n dropdownType === \"pm\" ||\n dropdownType === \"color\" ||\n dropdownType === \"make\" ||\n dropdownType === \"toll\" ||\n dropdownType === \"provider\" ||\n dropdownType === \"split-driver\" ||\n dropdownType === \"split-truck\" ||\n dropdownType === \"split-trailer\" ||\n dropdownType === \"accident-driver\" ||\n dropdownType === \"accident-truck\" ||\n dropdownType === \"accident-trailer\";\n <!-- Placeholder -->\n @if (specialDropdown) {\n <ng-container *ngTemplateOutlet=\"selectedOptionRef\"></ng-container>\n } @else if (\n (config().add || config().search) &&\n !inputRef.value &&\n !this.isAdding() &&\n dropdownType !== \"subcontent\"\n ) {\n <div class=\"dropdown-selected\">\n @if (config().placeholderBehavior === \"static\") {\n <p class=\"selected-label-hidden\">\n {{ name + (config().required ? \" *\" : \"\") }}\n </p>\n <p class=\"selected-text\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n @if (\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ] === \"Hazardous\"\n ) {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n } @else {\n <p class=\"dropdown-selected-content\">\n {{\n selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n }}\n </p>\n }\n }\n </div>\n }\n } @else if (config().isEdit && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ name }}</p>\n </div>\n }\n @if (config().passwordRequirements) {\n <div\n class=\"dropdown-menu password-requirement\"\n ngbDropdownMenu\n [style.width.px]=\"containerWidth()\"\n [class.closing]=\"closing()\"\n (pointerup)=\"stopEventPropagation($event)\"\n (mouseup)=\"stopEventPropagation($event)\"\n (click)=\"stopEventPropagation($event)\"\n >\n <ng-container *ngTemplateOutlet=\"passwordRequirementsRef\"></ng-container>\n </div>\n }\n @if (subcontent) {\n <p class=\"subcontent\">\n @if (!(config().alignment === \"right\")) {\n <span class=\"subcontent-hide\"\n >{{\n config().search\n ? selectedOption() &&\n cast(selectedOption(), \"dropdownOption\")![\n optionLabel || \"label\"\n ]\n : inputRef.value\n }}\n </span>\n }\n {{ subcontent }}\n </p>\n }\n</div>\n\n<!-- #region Templates -->\n\n<!-- #region Password requirements -->\n<ng-template #passwordRequirementsRef>\n @let isMinLengthValid =\n !this.ngControl?.errors?.[\"minlength\"] && this.value();\n @let isHasNumberValid =\n !this.ngControl?.errors?.[\"hasNumber\"] && this.value();\n @let isHasSymbolValid =\n !this.ngControl?.errors?.[\"hasSymbol\"] && this.value();\n @let isHasUppercaseValid =\n !this.ngControl?.errors?.[\"hasUppercase\"] && this.value();\n\n <p>Strong Password Requirement</p>\n <ul>\n <li [class.valid]=\"isMinLengthValid\">\n <svg-icon\n [name]=\"isMinLengthValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isMinLengthValid ? 'checkmark' : 'cancel'\"\n class=\"icon\"\n ></svg-icon\n ><span>Minimum 8 characters</span>\n </li>\n <li [class.valid]=\"isHasNumberValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasNumberValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasNumberValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One number</span>\n </li>\n <li [class.valid]=\"isHasSymbolValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasSymbolValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasSymbolValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One symbol</span>\n </li>\n <li [class.valid]=\"isHasUppercaseValid\">\n <svg-icon\n class=\"icon\"\n [name]=\"isHasUppercaseValid ? 'cai-checkmark' : 'cai-cancel'\"\n [class]=\"isHasUppercaseValid ? 'checkmark' : 'cancel'\"\n ></svg-icon\n ><span>One upper-case letter</span>\n </li>\n </ul>\n</ng-template>\n<!-- #endregion -->\n@let search = config().search;\n\n<ng-template #dropdownMenuRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"dispatchesRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"ftlDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"brokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"contactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"shipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"bankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"dispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"driverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"truckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"trailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"truckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"hazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"stateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"ownerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"fuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"pmRef\"></ng-container>\n }\n @case (\"multiple\") {\n <ng-container *ngTemplateOutlet=\"multipleRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"makeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"tollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"colorRef\"></ng-container>\n }\n @case (\"fuel-stop-transaction\") {\n <ng-container *ngTemplateOutlet=\"fuelStopTransactionRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"providerRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"splitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"splitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"splitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container *ngTemplateOutlet=\"accidentDriverRef\"></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"accidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container *ngTemplateOutlet=\"accidentTrailerRef\"></ng-container>\n }\n @case (\"subcontent\") {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"dropdownOptionsRef\"></ng-container>\n }\n }\n</ng-template>\n\n<ng-template #selectedOptionRef>\n @switch (dropdownType) {\n @case (\"dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"ftl-dispatch\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatchRef\"></ng-container>\n }\n @case (\"broker\") {\n <ng-container *ngTemplateOutlet=\"selectedBrokerRef\"></ng-container>\n }\n @case (\"contact\") {\n <ng-container *ngTemplateOutlet=\"selectedContactRef\"></ng-container>\n }\n @case (\"shipper\") {\n <ng-container *ngTemplateOutlet=\"selectedShipperRef\"></ng-container>\n }\n @case (\"bank\") {\n <ng-container *ngTemplateOutlet=\"selectedBankRef\"></ng-container>\n }\n @case (\"dispatcher\") {\n <ng-container *ngTemplateOutlet=\"selectedDispatcherRef\"></ng-container>\n }\n @case (\"driver-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedDriverOwnerRef\"></ng-container>\n }\n @case (\"truck-owner\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckOwnerRef\"></ng-container>\n }\n @case (\"trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedTrailerRef\"></ng-container>\n }\n @case (\"truck\") {\n <ng-container *ngTemplateOutlet=\"selectedTruckRef\"></ng-container>\n }\n @case (\"hazardous\") {\n <ng-container *ngTemplateOutlet=\"selectedHazardousRef\"></ng-container>\n }\n @case (\"state\") {\n <ng-container *ngTemplateOutlet=\"selectedStateRef\"></ng-container>\n }\n @case (\"owner\") {\n <ng-container *ngTemplateOutlet=\"selectedOwnerRef\"></ng-container>\n }\n @case (\"fuelcard\") {\n <ng-container *ngTemplateOutlet=\"selectedFuelcardRef\"></ng-container>\n }\n @case (\"pm\") {\n <ng-container *ngTemplateOutlet=\"selectedPmRef\"></ng-container>\n }\n @case (\"make\") {\n <ng-container *ngTemplateOutlet=\"selectedMakeRef\"></ng-container>\n }\n @case (\"toll\") {\n <ng-container *ngTemplateOutlet=\"selectedTollRef\"></ng-container>\n }\n @case (\"color\") {\n <ng-container *ngTemplateOutlet=\"selectedColorRef\"></ng-container>\n }\n @case (\"provider\") {\n <ng-container *ngTemplateOutlet=\"selectedProviderRef\"></ng-container>\n }\n @case (\"split-driver\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitDriverRef\"></ng-container>\n }\n @case (\"split-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTruckRef\"></ng-container>\n }\n @case (\"split-trailer\") {\n <ng-container *ngTemplateOutlet=\"selectedSplitTrailerRef\"></ng-container>\n }\n @case (\"accident-driver\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentDriverRef\"\n ></ng-container>\n }\n @case (\"accident-truck\") {\n <ng-container *ngTemplateOutlet=\"selectedAccidentTruckRef\"></ng-container>\n }\n @case (\"accident-trailer\") {\n <ng-container\n *ngTemplateOutlet=\"selectedAccidentTrailerRef\"\n ></ng-container>\n }\n }\n</ng-template>\n\n<!-- Standard dropdown -->\n<ng-template #dropdownOptionsRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dropdownOption')?.id === dropdownOption.id,\n focused: focusedOptionIndex === index,\n }\"\n (click)=\"handleOption(dropdownOption, $event)\"\n >\n @if (dropdownOption[optionLabel] === \"Hazardous\") {\n <svg-icon name=\"cai-violation-hazmat\" class=\"icon\"></svg-icon>\n }\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #multipleRef>\n @if (dropdownOptions().length) {\n @for (option of dropdownOptions(); track $index; let index = $index) {\n @let dropdownOption = cast(option, \"dropdownOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dropdownOption.id }}\"\n (click)=\"handleOption(dropdownOption, $event)\"\n [class]=\"{\n selected: isSelectedOption(dropdownOption),\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (dropdownOption[optionLabel] | highlightSearch: value())\n : dropdownOption[optionLabel]\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #bankRef>\n @if (dropdownOptions().length) {\n @for (bank of dropdownOptions(); track $index; let index = $index) {\n @let bankOption = cast(bank, \"bank\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ bankOption.id }}\"\n (click)=\"handleOption(bankOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'bank')?.id === bankOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (bankOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"bankOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (bankOption.name || '' | highlightSearch: value())\n : bankOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #makeRef>\n @if (dropdownOptions().length) {\n @for (make of dropdownOptions(); track $index; let index = $index) {\n @let makeOption = cast(make, \"make\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ makeOption.id }}\"\n (click)=\"handleOption(makeOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'make')?.id === makeOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n @if (makeOption.logoName) {\n <svg-icon\n class=\"full-icon\"\n [name]=\"makeOption.logoName.slice(0, -4)\"\n ></svg-icon>\n } @else {\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (makeOption.name || '' | highlightSearch: value())\n : makeOption.name\n \"\n ></p>\n }\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Broker -->\n<ng-template #brokerRef>\n @if (dropdownOptions().length) {\n @for (broker of dropdownOptions(); track $index; let index = $index) {\n @let brokerOption = cast(broker, \"broker\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"broker-{{ brokerOption.id }}\"\n (click)=\"\n !(brokerOption.dnu || brokerOption.ban) &&\n handleOption(brokerOption, $event)\n \"\n [class]=\"{\n selected: cast(selectedOption(), 'broker')?.id === brokerOption.id,\n focused: focusedOptionIndex === index,\n banned: brokerOption.dnu || brokerOption.ban,\n dnu: brokerOption.dnu,\n }\"\n >\n @if (brokerOption?.dnu || brokerOption?.ban) {\n <svg-icon name=\"cai-minus\" class=\"round-icon\"></svg-icon>\n } @else if (brokerOption?.fraudCheck) {\n <svg-icon\n name=\"cai-status-warning-lite\"\n class=\"fraud-icon\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (brokerOption.businessName || '' | highlightSearch: value())\n : brokerOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n @if (!brokerOption.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>{{ brokerOption.availableCredit || 0 | currency }}</p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption\n | brokerProgress: brokerOption.dnu || brokerOption.ban\n ).status\n \"\n ></div>\n }\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ brokerOption.loadsCount }} |\n {{ brokerOption.availableCredit || 0 | currency }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Contact dropdown -->\n<ng-template #contactRef>\n @if (dropdownOptions().length) {\n @for (contact of dropdownOptions(); track $index; let index = $index) {\n @let contactOption = cast(contact, \"contact\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"contact-{{ contact.id }}\"\n (click)=\"handleOption(contact, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'contact')?.id === contact.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (contactOption.contactName || '' | highlightSearch: value())\n : contactOption.contactName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p class=\"text-truncate\">{{ contactOption.department?.name }}</p>\n </div>\n <div class=\"end-item-hover\">\n <p class=\"text-truncate\">\n {{ contactOption.phone }}\n {{\n contactOption.extensionPhone\n ? \"x\" + contactOption.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Owner dropdown -->\n<ng-template #ownerRef>\n @if (dropdownOptions().length) {\n @for (owner of dropdownOptions(); track $index; let index = $index) {\n @let ownerOption = cast(owner, \"owner\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"owner-{{ ownerOption?.id }}\"\n (click)=\"handleOption(ownerOption!, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'owner')?.id === ownerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"owner-ein\"\n [innerHTML]=\"\n search\n ? (ownerOption?.ein || '' | highlightSearch: value())\n : ownerOption?.ein\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (ownerOption?.name || '' | highlightSearch: value())\n : ownerOption?.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Fuelcard dropdown -->\n<ng-template #fuelcardRef>\n @if (dropdownOptions().length) {\n @for (fuelcard of dropdownOptions(); track $index; let index = $index) {\n @let fuelcardOption = cast(fuelcard, \"fuelCard\");\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"fuelcard-{{ fuelcardOption?.id }}\"\n (click)=\"handleOption(fuelcardOption!, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'fuelCard')?.id === fuelcardOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"fuelcard-number\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.number || '' | highlightSearch: value())\n : fuelcardOption?.number\n \"\n ></p>\n <p\n class=\"fuelcard-brand\"\n [innerHTML]=\"\n search\n ? (fuelcardOption?.brand || '' | highlightSearch: value())\n : fuelcardOption?.brand\n \"\n ></p>\n <p\n [innerHTML]=\"\n search\n ? (fuelcardOption?.account || '' | highlightSearch: value())\n : fuelcardOption?.account\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident driver dropdown -->\n<ng-template #accidentDriverRef>\n @if (dropdownOptions().length) {\n @for (driver of dropdownOptions(); track $index; let index = $index) {\n @let driverOption = cast(driver, \"accidentDriver\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-driver-{{ driverOption.id }}\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentDriver')?.id === driverOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <p class=\"accident-dob\">\n {{ driverOption.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p\n class=\"accident-cdl-number\"\n [innerHTML]=\"driverOption.cdlNumber || '' | highlightSearch: value()\"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n driverOption.cdlState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n driverOption.cdlState?.countryType?.name &&\n driverOption.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n driverOption.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n driverOption.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident truck dropdown -->\n<ng-template #accidentTruckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"accidentTruck\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-truck-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTruck')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (truckOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n [name]=\"truckOption.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"truckOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n truckOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n truckOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n truckOption.licenseState?.countryType?.name &&\n truckOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n truckOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n truckOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Accident trailer dropdown -->\n<ng-template #accidentTrailerRef>\n @if (dropdownOptions().length) {\n @for (trailer of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(trailer, \"accidentTrailer\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"accident-trailer-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'accidentTrailer')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem accident-unit\">\n @if (trailerOption.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n [name]=\"trailerOption.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n [innerHTML]=\"trailerOption.trailerNumber | highlightSearch: value()\"\n ></p>\n </div>\n <p\n class=\"accident-vin\"\n [innerHTML]=\"trailerOption.vin || '' | highlightSearch: value()\"\n ></p>\n <p\n class=\"accident-plate\"\n [innerHTML]=\"\n trailerOption.licensePlateNumber || '' | highlightSearch: value()\n \"\n ></p>\n <div class=\"dropdown-subitem accident-state\">\n <p\n [innerHTML]=\"\n trailerOption.licenseState?.stateShortName || ''\n | highlightSearch: value()\n \"\n ></p>\n @if (\n trailerOption.licenseState?.countryType?.name &&\n trailerOption.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n trailerOption.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n trailerOption.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Shipper dropdown -->\n<ng-template #shipperRef>\n @if (dropdownOptions().length) {\n @for (shipper of dropdownOptions(); track $index; let index = $index) {\n @let shipperOption = cast(shipper, \"shipper\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item split-option\"\n id=\"shipper-{{ shipperOption.id }}\"\n (click)=\"handleOption(shipperOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'shipper')?.id === shipperOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.businessName || '' | highlightSearch: value())\n : shipperOption.businessName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-base\">\n <p\n class=\"text-truncate\"\n [innerHTML]=\"\n search\n ? (shipperOption.address?.address || ''\n | highlightSearch: value())\n : shipperOption.address?.address\n \"\n ></p>\n </div>\n <div class=\"end-item-hover\">\n <p>\n {{ shipperOption.pickupCount }} Pickup |\n {{ shipperOption.deliveryCount }} Delivery\n </p>\n <svg-icon name=\"cai-load\" class=\"icon\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatch dropdown -->\n<ng-template #dispatchesRef>\n @if (dropdownOptions().length) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"resetSelection()\"\n [class]=\"{\n selected: !selectedOption(),\n }\"\n >\n <p>Unassigned</p>\n <div class=\"unassigned-ltl\">\n <p>{{ unassignedCount() }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </button>\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n <!-- Temporary variant since BE doesn't support boards -->\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base dispatch-ltl\">\n <p>{{ dispatch.numberOfSingleLtlLoads }}</p>\n <svg-icon name=\"cai-ltl-single\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- ftl dispatch dropdown -->\n<ng-template #ftlDispatchRef>\n @if (dropdownOptions().length) {\n @for (\n dispatchBoard of dropdownOptions();\n track dispatchBoard.id;\n let groupIndex = $index\n ) {\n @let dispatchBoardOption = cast(dispatchBoard, \"dispatchBoard\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let isNoBoardsVariant =\n dispatchBoardOption.dispatcher === \"NOBOARDSVARIANT\";\n @if (dispatchBoardOption.count > 0) {\n @if (!isNoBoardsVariant) {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(dispatchBoardOption.id, $event)\"\n [class]=\"{\n unfolded: dispatchBoardOption.dispatches?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{\n dispatchBoardOption.teamBoard\n ? \"Team Board\"\n : dispatchBoardOption.dispatcher\n }}\n </p>\n <p class=\"counter\">{{ dispatchBoardOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n }\n @if (\n dispatchBoardOption.dispatches &&\n dispatchBoardOption.dispatches.length > 0\n ) {\n @for (\n dispatch of dispatchBoardOption.dispatches;\n track dispatch.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(dispatch, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatch')?.id === dispatch.id,\n focused: isOptionFocused,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n [name]=\"dispatch.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"\n dispatch.truck.truckNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatch.trailer) {\n <svg-icon\n class=\"trailer-icon truck-trailer-icon-colors\"\n [class]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n [name]=\"dispatch.trailer.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n dispatch.trailer.trailerNumber | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatch.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName +\n ' & ' +\n dispatch.coDriver.firstName | highlightSearch: value()\n \"\n ></p>\n } @else {\n <cai-avatar\n [driver]=\"dispatch.driver\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n dispatch.driver.firstName + ' ' + dispatch.driver.lastName\n | highlightSearch: value()\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n <!-- Load Status -->\n @let dispatchStatus = dispatch.status | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (dispatch.status?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ dispatch.status?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ dispatch?.pendingLoadCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ dispatch.payType }}</p>\n <svg-icon name=\"cai-driver\" class=\"icon-sm\"></svg-icon>\n </div>\n </div>\n </button>\n }\n } @else if (isNoBoardsVariant) {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitDriverRef>\n @if (dropdownOptions().length) {\n @for (splitDriverBoard of dropdownOptions(); track splitDriverBoard.id) {\n @let driverBoard = cast(splitDriverBoard, \"splitDriverBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(driverBoard.id, $event)\"\n [class]=\"{\n unfolded: (driverBoard.drivers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n driverBoard.isTeamBoard ? \"Team Board\" : driverBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ driverBoard.drivers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (driver of driverBoard.drivers || []; track driver.id) {\n @let driverOption = cast(driver, \"splitDriver\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(driverOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitDriver')?.id === driverOption.id,\n }\"\n >\n <div class=\"dropdown-subitem\">\n <div class=\"dropdown-avatar\">\n <cai-avatar\n [driver]=\"driverOption\"\n [size]=\"18\"\n [inverse]=\"true\"\n [hover]=\"false\"\n ></cai-avatar>\n </div>\n <p\n class=\"driver-name\"\n [innerHTML]=\"\n driverOption.firstName + ' ' + driverOption.lastName\n | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n driverOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (driverOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ driverOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ driverOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n <p>{{ driverOption.payTypeValue }}</p>\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTruckRef>\n @if (dropdownOptions().length) {\n @for (splitTruckBoard of dropdownOptions(); track splitTruckBoard.id) {\n @let truckBoard = cast(splitTruckBoard, \"splitTruckBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(truckBoard.id, $event)\"\n [class]=\"{\n unfolded: (truckBoard.trucks?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n truckBoard.isTeamBoard ? \"Team Board\" : truckBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ truckBoard.trucks?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (truck of truckBoard.trucks || []; track truck.id) {\n @let truckOption = cast(truck, \"splitTruck\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTruck')?.id === truckOption.id,\n }\"\n >\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [style.--truck-color]=\"truckOption.color?.code || ''\"\n [name]=\"truckOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"truck-number\"\n [innerHTML]=\"truckOption.truckNumber | highlightSearch: value()\"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus = truckOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (truckOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ truckOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ truckOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n truckOption.location?.city &&\n truckOption.location?.stateShortName\n ) {\n <p>\n {{ truckOption.location?.city }},\n {{ truckOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #splitTrailerRef>\n @if (dropdownOptions().length) {\n @for (splitTrailerBoard of dropdownOptions(); track splitTrailerBoard.id) {\n @let trailerBoard = cast(splitTrailerBoard, \"splitTrailerBoard\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(trailerBoard.id, $event)\"\n [class]=\"{\n unfolded: (trailerBoard.trailers?.length ?? 0) > 0,\n }\"\n >\n <p>\n {{\n trailerBoard.isTeamBoard\n ? \"Team Board\"\n : trailerBoard.dispatcherName\n }}\n </p>\n <!-- TODO: Change to count once BE is fixed -->\n <p class=\"counter\">{{ trailerBoard.trailers?.length || 0 }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @for (trailer of trailerBoard.trailers || []; track trailer.id) {\n @let trailerOption = cast(trailer, \"splitTrailer\")!;\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'splitTrailer')?.id === trailerOption.id,\n }\"\n >\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [style.--trailer-color]=\"trailerOption.color?.code || ''\"\n [name]=\"trailerOption.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p\n class=\"trailer-number\"\n [innerHTML]=\"\n trailerOption.trailerNumber | highlightSearch: value()\n \"\n ></p>\n </div>\n <div class=\"dropdown-subitem-end\">\n <div class=\"end-item-hover\">\n @let dispatchStatus =\n trailerOption.dispatchStatus | dispatchStatus;\n @if (dispatchStatus) {\n <div\n class=\"dispatch-status\"\n [class]=\"dispatchStatus.statusClass\"\n >\n @if (dispatchStatus.badge) {\n <p\n class=\"status-block\"\n [class]=\"dispatchStatus.badge.color\"\n >\n {{ dispatchStatus.badge.text }}\n </p>\n }\n {{ dispatchStatus.label }}\n @if (trailerOption.dispatchStatus?.statusCheckInNumber) {\n <p class=\"status-block\">\n {{ trailerOption.dispatchStatus?.statusCheckInNumber }}\n </p>\n }\n </div>\n <p class=\"dispatch-separator\">|</p>\n }\n <p class=\"dispatch-load-count\">\n {{ trailerOption.pendingLoadsCount }}\n </p>\n <svg-icon name=\"cai-load\" class=\"icon-sm\"></svg-icon>\n </div>\n <div class=\"end-item-base\">\n @if (\n trailerOption.location?.city &&\n trailerOption.location?.stateShortName\n ) {\n <p>\n {{ trailerOption.location?.city }},\n {{ trailerOption.location?.stateShortName }}\n </p>\n }\n </div>\n </div>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #tollRef>\n @if (dropdownOptions().length) {\n @for (toll of dropdownOptions(); track $index; let groupIndex = $index) {\n @let tollOption = cast(toll, \"tollOption\")!;\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item pe-none\"\n [class]=\"{\n unfolded: tollOption.tollTransponders?.length || 0 > 0,\n focused: isGroupFocused,\n }\"\n >\n <p>\n {{ tollOption.groupName }}\n </p>\n </button>\n @let tollTransponders = tollOption.tollTransponders || [];\n @for (\n tollTransponder of tollTransponders;\n track tollTransponder.id;\n let optionIndex = $index\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === optionIndex + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n class=\"dropdown-item\"\n (click)=\"handleOption(tollTransponder, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'tollTransponderOption')?.id ===\n tollTransponder.id,\n focused: isOptionFocused,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (tollTransponder.name || '' | highlightSearch: value())\n : tollTransponder.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Dispatcher dropdown -->\n\n<ng-template #dispatcherRef>\n @if (dropdownOptions().length) {\n @for (dispatcher of dropdownOptions(); track $index; let index = $index) {\n @let dispatcherOption = cast(dispatcher, \"dispatcher\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ dispatcherOption.id }}\"\n (click)=\"handleOption(dispatcherOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'dispatcher')?.id === dispatcherOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (dispatcherOption.fullName || '' | highlightSearch: value())\n : dispatcherOption.fullName\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Driver Owner dropdown -->\n\n<ng-template #driverOwnerRef>\n @if (dropdownOptions().length) {\n @for (driverOwner of dropdownOptions(); track $index; let index = $index) {\n @let driverOwnerOption = cast(driverOwner, \"driverOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ driverOwnerOption.id }}\"\n (click)=\"handleOption(driverOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'driverOwner')?.id === driverOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n [hover]=\"false\"\n ></cai-avatar>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (driverOwnerOption.fullName || '' | highlightSearch: value())\n : driverOwnerOption.fullName\n \"\n ></p>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ driverOwnerOption.driverType | driverTypeLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Truck Owner dropdown -->\n\n<ng-template #truckOwnerRef>\n @if (dropdownOptions().length) {\n @for (truckOwner of dropdownOptions(); track $index; let index = $index) {\n @let truckOwnerOption = cast(truckOwner, \"truckOwner\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOwnerOption.id }}\"\n (click)=\"handleOption(truckOwnerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOwner')?.id === truckOwnerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <div class=\"dropdown-subitem truck-owner-unit\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon truck-trailer-icon-colors\"\n [class]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.truckNumber || ''\n | highlightSearch: value())\n : truckOwnerOption.truckNumber\n \"\n ></p>\n @if (truckOwnerOption.model) {\n <p class=\"truck-owner-bullet\">\u2022</p>\n <p\n class=\"dropdown-content\"\n [innerHTML]=\"\n search\n ? (truckOwnerOption.model | highlightSearch: value())\n : truckOwnerOption.model\n \"\n ></p>\n }\n </div>\n <div class=\"dropdown-subitem-end\">\n <p class=\"driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #truckRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let truckOption = cast(truck, \"truckOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ truckOption.id }}\"\n (click)=\"handleOption(truckOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'truckOption')?.id === truckOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (truckOption.name || '' | highlightSearch: value())\n : truckOption.name\n \"\n ></p>\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"truckOption.logoName.slice(0, -4)\"\n [name]=\"truckOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #trailerRef>\n @if (dropdownOptions().length) {\n @for (truck of dropdownOptions(); track $index; let index = $index) {\n @let trailerOption = cast(truck, \"trailerOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ trailerOption.id }}\"\n (click)=\"handleOption(trailerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'trailerOption')?.id === trailerOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (trailerOption.name || '' | highlightSearch: value())\n : trailerOption.name\n \"\n ></p>\n\n <svg-icon\n class=\"truck-trailer-option truck-trailer-icon-colors\"\n [class]=\"trailerOption.logoName.slice(0, -4)\"\n [name]=\"trailerOption.logoName.slice(0, -4)\"\n ></svg-icon>\n <svg-icon\n name=\"cai-checkmark\"\n class=\"dropdown-item-icon no-margin\"\n ></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #providerRef>\n @if (dropdownOptions().length) {\n @for (provider of dropdownOptions(); track $index; let index = $index) {\n @let providerOption = cast(provider, \"provider\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ providerOption?.id }}\"\n (click)=\"handleOption(providerOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'provider')?.id === providerOption?.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"full-icon\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- Hazardous dropdown -->\n<ng-template #hazardousRef>\n @if (dropdownOptions().length) {\n @for (hazardous of dropdownOptions(); track $index; let index = $index) {\n @let hazardousOption = cast(hazardous, \"hazardous\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ hazardousOption.id }}\"\n (click)=\"handleOption(hazardousOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'hazardous')?.id === hazardousOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon [name]=\"hazardousOption.logoName?.slice(0, -4)\"></svg-icon>\n <p\n class=\"dropdown-content-hazardous\"\n [innerHTML]=\"\n search\n ? (hazardousOption.description || '' | highlightSearch: value())\n : hazardousOption.description\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #pmRef>\n @if (dropdownOptions().length) {\n @for (pm of dropdownOptions(); track $index; let index = $index) {\n @let pmOption = cast(pm, \"pmOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ pmOption.id }}\"\n (click)=\"handleOption(pmOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'pmOption')?.id === pmOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"pmOption.title | remapPmIcons\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (pmOption.title || '' | highlightSearch: value())\n : pmOption.title\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #colorRef>\n @if (dropdownOptions().length) {\n @for (color of dropdownOptions(); track $index; let index = $index) {\n @let colorOption = cast(color, \"colorOption\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item color-item\"\n id=\"option-{{ colorOption.id }}\"\n (click)=\"handleOption(colorOption, $event)\"\n [class]=\"{\n selected:\n cast(selectedOption(), 'colorOption')?.id === colorOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (colorOption.name || '' | highlightSearch: value())\n : colorOption.name\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #stateRef>\n @if (dropdownOptions().length) {\n @for (state of dropdownOptions(); track $index; let index = $index) {\n @let stateOption = cast(state, \"state\")!;\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n id=\"option-{{ stateOption.id }}\"\n (click)=\"handleOption(stateOption, $event)\"\n [class]=\"{\n selected: cast(selectedOption(), 'state')?.id === stateOption.id,\n focused: focusedOptionIndex === index,\n }\"\n >\n <svg-icon\n class=\"icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p\n class=\"dropdown-content-with-icon\"\n [innerHTML]=\"\n search\n ? (stateOption.stateShortName +\n ' ' +\n (config().fullState\n ? ' (' + stateOption?.stateName + ')'\n : '') || '' | highlightSearch: value())\n : stateOption.stateShortName +\n ' ' +\n (config().fullState ? ' (' + stateOption?.stateName + ')' : '')\n \"\n ></p>\n <svg-icon name=\"cai-checkmark\" class=\"dropdown-item-icon\"></svg-icon>\n </button>\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<ng-template #fuelStopTransactionRef>\n @if (dropdownOptions().length) {\n @for (\n franchise of dropdownOptions();\n track franchise.id;\n let groupIndex = $index\n ) {\n @let isGroupFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0;\n @let franchiseOption = cast(franchise, \"franchise\")!;\n @if (franchiseOption?.count !== null) {\n <div\n class=\"dropdown-group\"\n [class.no-items]=\"!franchiseOption?.count\"\n [class]=\"{\n active: openGroup() === franchiseOption.id,\n }\"\n [style.--max-height]=\"\n openGroup() === franchiseOption.id\n ? 30 * ((franchiseOption.fuelStopStores?.length || 0) + 1) + 'px'\n : '26px'\n \"\n >\n <button\n tabindex=\"-1\"\n class=\"dropdown-item group-item\"\n (click)=\"fold(franchiseOption.id, $event, franchiseOption)\"\n [class]=\"{\n unfolded: openGroup() === franchiseOption.id,\n focused: isGroupFocused,\n }\"\n >\n <p\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n <p class=\"counter\">{{ franchiseOption.count }}</p>\n <svg-icon\n name=\"cai-arrow-primary-up\"\n class=\"group-icon icon\"\n ></svg-icon>\n </button>\n @if (openGroup() === franchiseOption.id) {\n @if (franchiseOption.fuelStopStores?.length || 0 > 0) {\n @for (\n fuelStopStore of franchiseOption.fuelStopStores;\n track fuelStopStore.id\n ) {\n @let isOptionFocused =\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === $index + 1;\n <!-- +1 since optionIndex is 0 for the group item header -->\n <button\n tabindex=\"-1\"\n class=\"dropdown-item fuel-stop-transaction-store\"\n [class]=\"{\n focused: isOptionFocused,\n }\"\n (click)=\"handleOption(fuelStopStore, $event)\"\n >\n <p\n [innerHTML]=\"\n fuelStopStore?.store ?? '' | highlightSearch: value()\n \"\n ></p>\n @let city = fuelStopStore?.address?.city ?? \"\";\n @let state = fuelStopStore?.address?.stateShortName ?? \"\";\n @let zip = fuelStopStore?.address?.zipCode ?? \"\";\n <p\n class=\"fuel-stop-transaction-store-address\"\n [innerHTML]=\"\n city + (state || zip ? ', ' : '') + state + ' ' + zip\n | highlightSearch: value()\n \"\n ></p>\n\n @if (fuelStopStore?.[\"favourite\"]) {\n <svg-icon\n name=\"cai-favorite\"\n class=\"favorite-icon\"\n ></svg-icon>\n }\n </button>\n }\n <!-- Infinite scroll trigger - emits event when item comes into view -->\n <div\n class=\"dropdown-infinite-scroll-item\"\n caiIntersectionObserver\n [threshold]=\"0.1\"\n (inView)=\"onDropdownScrolledToBottom(true)\"\n ></div>\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n }\n </div>\n } @else {\n <button\n tabindex=\"-1\"\n class=\"dropdown-item\"\n [class.focused]=\"\n groupedNavigationState?.groupIndex === groupIndex &&\n groupedNavigationState?.optionIndex === 0\n \"\n (click)=\"handleOption(franchiseOption, $event)\"\n >\n <p\n class=\"fuel-stop-transaction-nostore\"\n [innerHTML]=\"\n franchiseOption?.businessName || '' | highlightSearch: value()\n \"\n ></p>\n </button>\n }\n }\n } @else {\n <p class=\"dropdown-item no-results\">No results</p>\n }\n</ng-template>\n\n<!-- #endregion -->\n\n<!-- #region Selected options -->\n\n<!-- selected dispatch -->\n<ng-template #selectedDispatchRef>\n @let dispatchOption = cast(selectedOption(), \"dispatch\");\n @if (dispatchOption && !inputRef.value && !isAdding()) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"dispatchOption!.truck.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ dispatchOption!.truck.truckNumber }}\n </p>\n </div>\n <div class=\"dropdown-subitem trailer-item\">\n @if (dispatchOption!.trailer) {\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"\n cast(\n selectedOption(),\n 'dispatch'\n )!.trailer?.trailerType?.logoName?.slice(0, -4)\n \"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ dispatchOption!.trailer?.trailerNumber }}\n </p>\n }\n </div>\n <div class=\"dropdown-subitem\">\n @if (dispatchOption!.coDriver) {\n <svg-icon class=\"dispatch-icon\" name=\"cai-people\"></svg-icon>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" & \" +\n dispatchOption!.coDriver?.firstName\n }}\n </p>\n } @else {\n <cai-avatar\n [driver]=\"dispatchOption!.driver\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p class=\"driver-name\">\n {{\n dispatchOption!.driver.firstName +\n \" \" +\n dispatchOption!.driver.lastName\n }}\n </p>\n }\n </div>\n <p class=\"selected-end-item\">\n {{ dispatchOption!.payType }}\n </p>\n </div>\n } @else {\n @if (!inputRef.value && this.config().dropdown == \"dispatch\") {\n <p class=\"dropdown-selected\">Unassigned</p>\n }\n }\n</ng-template>\n\n<!-- selected broker -->\n<ng-template #selectedBrokerRef>\n @let brokerOption = cast(selectedOption(), \"broker\");\n @if (brokerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (brokerOption!.fraudCheck) {\n <svg-icon name=\"cai-status-warning-lite\" class=\"fraud-icon\"></svg-icon>\n }\n <p class=\"dropdown-selected-content\">{{ brokerOption!.businessName }}</p>\n <div class=\"selected-end-item\">\n @if (!brokerOption!.creditLimit) {\n <p>Unlimited</p>\n } @else {\n <p>\n {{ brokerOption!.availableCredit || 0 | currency }}\n </p>\n <div\n class=\"progress-bar\"\n [style.--progress]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).activePercentageOfPaid + '%'\n \"\n [class]=\"\n (\n brokerOption!\n | brokerProgress: brokerOption!.dnu || brokerOption!.ban\n ).status\n \"\n ></div>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedContactRef>\n @let contactOption = cast(selectedOption(), \"contact\");\n @if (contactOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ contactOption?.contactName }}</p>\n <div class=\"selected-end-item\">\n <p>\n {{ contactOption?.phone }}\n {{\n contactOption?.extensionPhone\n ? \"x\" + contactOption?.extensionPhone\n : \"\"\n }}\n </p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedShipperRef>\n @let shipperOption = cast(selectedOption(), \"shipper\");\n @if (shipperOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">{{ shipperOption?.businessName }}</p>\n <div class=\"selected-end-item selected-end-item-truncate\">\n <p class=\"text-truncate\">{{ shipperOption?.address?.address }}</p>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedOwnerRef>\n @let ownerOption = cast(selectedOption(), \"owner\");\n @if (ownerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"owner-ein\">{{ ownerOption?.ein }}</p>\n <p class=\"\">{{ ownerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedFuelcardRef>\n @let fuelcardOption = cast(selectedOption(), \"fuelCard\");\n @if (fuelcardOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"fuelcard-number\">\n {{ fuelcardOption?.number }}\n </p>\n <p class=\"fuelcard-brand\">\n {{ fuelcardOption?.brand }}\n </p>\n <p class=\"\">\n {{ fuelcardOption?.account }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedBankRef>\n @let bankOption = cast(selectedOption(), \"bank\");\n @if (bankOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (bankOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"bankOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ bankOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedProviderRef>\n @let providerOption = cast(selectedOption(), \"provider\");\n @if (providerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"'cai-' + providerOption?.name?.toLowerCase()\"\n ></svg-icon>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedMakeRef>\n @let makeOption = cast(selectedOption(), \"make\");\n @if (makeOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (makeOption?.logoName) {\n <svg-icon\n class=\"option-icon full-size\"\n [name]=\"makeOption?.logoName?.slice(0, -4) || ''\"\n ></svg-icon>\n } @else {\n <p class=\"dropdown-selected-content\">{{ makeOption?.name }}</p>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #selectedStateRef>\n @let stateOption = cast(selectedOption(), \"state\");\n @if (stateOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"\n 'cai-' +\n stateOption?.countryType?.name?.toLowerCase() +\n '-' +\n stateOption?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ stateOption?.stateShortName }}\n {{ config().fullState ? \" (\" + stateOption?.stateName + \")\" : \"\" }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDispatcherRef>\n @let dispatcherOption = cast(selectedOption(), \"dispatcher\");\n @if (dispatcherOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: dispatcherOption?.id || 0,\n firstName: (dispatcherOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (dispatcherOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: dispatcherOption?.avatarFile,\n colorFlag: dispatcherOption?.colorFlag,\n }\"\n [rounded]=\"!config().squareAvatar\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ dispatcherOption?.fullName }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedDriverOwnerRef>\n @let driverOwnerOption = cast(selectedOption(), \"driverOwner\");\n @if (driverOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <cai-avatar\n [driver]=\"{\n id: driverOwnerOption?.id || 0,\n firstName: (driverOwnerOption?.fullName || ' ').split(' ')[0] || '',\n lastName: (driverOwnerOption?.fullName || ' ').split(' ')[1] || '',\n avatarFile: driverOwnerOption?.avatarFile,\n colorFlag: driverOwnerOption?.colorFlag,\n owner: driverOwnerOption?.driverType === 'OwnerOperator',\n driverType: {\n id: 0,\n name: (driverOwnerOption?.driverType | driverTypeLabel),\n },\n }\"\n [rounded]=\"false\"\n ></cai-avatar>\n <p class=\"dropdown-selected-content\">{{ driverOwnerOption?.fullName }}</p>\n <p class=\"selected-end-item driver-type\">\n {{ driverOwnerOption?.driverType | driverTypeLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckOwnerRef>\n @let truckOwnerOption = cast(selectedOption(), \"truckOwner\");\n @if (truckOwnerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n @if (truckOwnerOption.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"truckOwnerOption.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p class=\"dropdown-selected-content\">\n {{ truckOwnerOption.truckNumber }}\n @if (truckOwnerOption.model) {\n <span class=\"truck-owner-bullet\">\u2022</span>\n {{ truckOwnerOption.model }}\n }\n </p>\n <p class=\"selected-end-item driver-type\">\n {{ truckOwnerOption.driverType | truckOwnershipLabel }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTruckRef>\n @let truckOption = cast(selectedOption(), \"truckOption\");\n @if (truckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"truckOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ truckOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTrailerRef>\n @let trailerOption = cast(selectedOption(), \"trailerOption\");\n @if (trailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"trailerOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">{{ trailerOption?.name }}</p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedHazardousRef>\n @let hazardousOption = cast(selectedOption(), \"hazardous\");\n @if (hazardousOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"hazard-icon\"\n [name]=\"hazardousOption?.logoName?.slice(0, -4)\"\n ></svg-icon>\n <p class=\"dropdown-selected-content dropdown-selected-hazardous\">\n {{ hazardousOption?.description }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedPmRef>\n @let pmOption = cast(selectedOption(), \"pmOption\");\n @if (pmOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon\"\n [name]=\"pmOption?.title | remapPmIcons\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ pmOption?.title }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedColorRef>\n @let colorOption = cast(selectedOption(), \"colorOption\");\n @if (colorOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <svg-icon\n class=\"option-icon cai-color\"\n [name]=\"'cai-color'\"\n [style.--color]=\"colorOption?.code\"\n [style.--hover-color]=\"colorOption?.hoverCode\"\n ></svg-icon>\n <p class=\"dropdown-selected-content\">\n {{ colorOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedTollRef>\n @let tollOption = cast(selectedOption(), \"tollTransponderOption\");\n @if (tollOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <p class=\"dropdown-selected-content\">\n {{ tollOption?.name }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitDriverRef>\n @let splitDriverOption = cast(selectedOption(), \"splitDriver\");\n @if (splitDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem\">\n <cai-avatar [driver]=\"splitDriverOption\" [size]=\"18\"></cai-avatar>\n <p class=\"driver-name\">\n {{ splitDriverOption.firstName + \" \" + splitDriverOption.lastName }}\n </p>\n </div>\n </div>\n\n <p class=\"selected-end-item\">\n {{ splitDriverOption.payTypeValue }}\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTruckRef>\n @let splitTruckOption = cast(selectedOption(), \"splitTruck\");\n @if (splitTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem trailer-item\">\n <svg-icon\n class=\"trailer-icon\"\n [name]=\"splitTruckOption!.truckType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"trailer-number\">\n {{ splitTruckOption!.truckNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTruckOption!.location?.city &&\n splitTruckOption!.location?.stateShortName\n ) {\n {{ splitTruckOption!.location?.city }},\n {{ splitTruckOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedSplitTrailerRef>\n @let splitTrailerOption = cast(selectedOption(), \"splitTrailer\");\n @if (splitTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-selected-content\">\n <div class=\"dropdown-subitem truck-item\">\n <svg-icon\n class=\"truck-icon\"\n [name]=\"splitTrailerOption!.trailerType.logoName.slice(0, -4)\"\n ></svg-icon>\n <p class=\"truck-number\">\n {{ splitTrailerOption!.trailerNumber }}\n </p>\n </div>\n </div>\n <p class=\"selected-end-item\">\n @if (\n splitTrailerOption!.location?.city &&\n splitTrailerOption!.location?.stateShortName\n ) {\n {{ splitTrailerOption!.location?.city }},\n {{ splitTrailerOption!.location?.stateShortName }}\n }\n </p>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentDriverRef>\n @let accidentDriverOption = cast(selectedOption(), \"accidentDriver\");\n @if (accidentDriverOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-name\">\n <cai-avatar\n [driver]=\"accidentDriverOption!\"\n [size]=\"18\"\n [hover]=\"false\"\n ></cai-avatar>\n <p>\n {{\n accidentDriverOption!.firstName +\n \" \" +\n accidentDriverOption!.lastName\n }}\n </p>\n </div>\n <p class=\"accident-dob\">\n {{ accidentDriverOption!.dateOfBirth | date: \"MM/dd/yy\" }}\n </p>\n <p class=\"accident-cdl-number\">\n {{ accidentDriverOption!.cdlNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentDriverOption!.cdlState?.stateShortName }}</p>\n @if (\n accidentDriverOption!.cdlState?.countryType?.name &&\n accidentDriverOption!.cdlState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentDriverOption!.cdlState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentDriverOption!.cdlState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTruckRef>\n @let accidentTruckOption = cast(selectedOption(), \"accidentTruck\");\n @if (accidentTruckOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTruckOption!.truckType?.logoName) {\n <svg-icon\n class=\"truck-icon option-icon\"\n [name]=\"accidentTruckOption!.truckType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTruckOption!.truckNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTruckOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTruckOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTruckOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTruckOption!.licenseState?.countryType?.name &&\n accidentTruckOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTruckOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTruckOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #selectedAccidentTrailerRef>\n @let accidentTrailerOption = cast(selectedOption(), \"accidentTrailer\");\n @if (accidentTrailerOption && !inputRef.value) {\n <div class=\"dropdown-selected\">\n <div class=\"dropdown-subitem accident-unit\">\n @if (accidentTrailerOption!.trailerType?.logoName) {\n <svg-icon\n class=\"trailer-icon option-icon\"\n [name]=\"accidentTrailerOption!.trailerType!.logoName.slice(0, -4)\"\n ></svg-icon>\n }\n <p>{{ accidentTrailerOption!.trailerNumber }}</p>\n </div>\n <p class=\"accident-vin\">{{ accidentTrailerOption!.vin }}</p>\n <p class=\"accident-plate\">\n {{ accidentTrailerOption!.licensePlateNumber }}\n </p>\n <div class=\"dropdown-subitem accident-state\">\n <p>{{ accidentTrailerOption!.licenseState?.stateShortName }}</p>\n @if (\n accidentTrailerOption!.licenseState?.countryType?.name &&\n accidentTrailerOption!.licenseState?.stateShortName\n ) {\n <svg-icon\n class=\"icon option-icon\"\n [name]=\"\n 'cai-' +\n accidentTrailerOption!.licenseState?.countryType?.name?.toLowerCase() +\n '-' +\n accidentTrailerOption!.licenseState?.stateShortName?.toLowerCase()\n \"\n ></svg-icon>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #passwordTooltip>\n {{ visible() ? \"Hide\" : \"Show\" }}\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (\n (config().errorBehavior === \"floating\" ||\n (config().errorBehavior === \"static\" && hasText()) ||\n config().inTable) &&\n invalid &&\n !dropdown.isOpen()\n ) {\n {{ (ngControl?.errors | errorMessage: config().customErrors : config().numberFormat)[0] }}\n }\n</ng-template>\n\n<!-- #endregion -->\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.app-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;position:relative;border-radius:2px;background-color:var(--color-surface-neutral);color:var(--color-text);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);display:flex}.app-input-container.inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #ffffff;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.app-input-container.inverse:not(.has-error):not(.has-valid) .app-input:focus-visible{color:#2f2f2f}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon,.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon,.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .icon-sm{color:#919191!important}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .bg-icon{background-color:#919191!important;color:#dadada}.app-input-container.inverse.is-empty:has(.app-input:focus-visible) .separator{background-color:#919191!important}.app-input-container.inverse.has-text:has(.app-input:disabled) .app-input-label{color:#424242!important}.app-input-container.hovered{background-color:var(--color-surface-neutral-hover)}.app-input-container.hovered:not(:has(.app-input:disabled)) .sub-label,.app-input-container.hovered:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}@media(hover:hover){.app-input-container:hover{background-color:var(--color-surface-neutral-hover)}.app-input-container:hover:not(:has(.app-input:disabled)) .sub-label,.app-input-container:hover:not(:has(.app-input:disabled)) .app-input-label .accident-state{margin-right:44px}}.app-input-container.has-text .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container.has-text.fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container.has-text .subcontent{opacity:1!important}.app-input-container.has-text.static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text)}@media(hover:hover){.app-input-container.has-text.is-address:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:hover .bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral-hover)}}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-text.is-address:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible){background-color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.app-input-container:has(.app-input:focus-visible) .subcontent{opacity:1!important;color:#ffffffb2;left:unset!important;right:4px!important}.app-input-container:has(.app-input:focus-visible).has-text .subcontent{right:26px!important}.app-input-container:has(.app-input:focus-visible) .sub-label,.app-input-container:has(.app-input:focus-visible) .app-input-label .accident-state{margin-right:44px}.app-input-container:has(.app-input:focus-visible).fade-placeholder .app-input-label{transform:translateY(0);opacity:0}.app-input-container:has(.app-input:focus-visible).static-placeholder .app-input-label{transform:translateY(0);opacity:1;color:var(--color-text-inverse)!important}.app-input-container:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.app-input-container:has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}.app-input-container:has(.app-input:disabled){background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled).hovered{background-color:var(--color-surface-disable)}@media(hover:hover){.app-input-container:has(.app-input:disabled):hover{background-color:var(--color-surface-disable)}}.app-input-container:has(.app-input:disabled):focus{background-color:var(--color-surface-disable)}.app-input-container:has(.app-input:disabled) .app-input-label{color:var(--color-text-subtle)}.app-input-container:has(.app-input:disabled) .separator{background-color:var(--color-icon-disable)}.app-input-container:has(.app-input:disabled) .dropdown-icon-container{opacity:0;pointer-events:none!important}.app-input-container:has(.app-input:disabled) .dropdown-selected:has(.selected-end-item){width:100%}.app-input-container:has(.app-input:disabled) .driver-type{color:#919191}.app-input-container:has(.app-input:disabled) .icon-container{pointer-events:none!important}.app-input-container:has(.app-input:disabled):not(.disabled-removable) .cancel-button{display:none!important}.app-input-container:has(.app-input:required):not(:has(.app-input:disabled)) .app-input-name:after{content:\" *\";color:var(--color-text-negative)}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .dropdown-icon-container:hover .dropdown-icon{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:not(:has(.app-input:focus-visible)) .hover-icon:hover{color:#424242!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error).is-empty:has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container:not(.has-error):not(.has-valid):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.canceled .app-input-label,.app-input-container.canceled .app-input{color:var(--color-text-subtle)!important}.app-input-container.canceled .icon-container .icon,.app-input-container.canceled .icon-container .icon-sm{color:var(--color-icon-disable)!important}.subcontent{pointer-events:none;position:absolute;left:6px;color:#919191;-webkit-user-select:none;user-select:none;top:50%;transform:translateY(-50%);transition:right .1s ease-in-out,left .1s ease-in-out,transform .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);opacity:0;font-family:Montserrat;font-weight:400;font-style:Regular;font-size:14px;line-height:18px;letter-spacing:0%;height:18px;overflow:hidden}.subcontent .subcontent-hide{opacity:0!important}.app-input-label{position:absolute;display:flex;gap:4px;left:0;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.app-input-label.placeholder-color{color:var(--placeholder-color)!important}.app-input{padding:.25rem 6px;width:100%;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.app-input:focus-visible{color:var(--color-text-inverse)}@media(pointer:coarse){.app-input{font-size:16px;transform:scale(.875);transform-origin:left center;height:26px}}.app-input-error{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;pointer-events:none;-webkit-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);color:var(--color-text-negative);transform:translateY(-10px)}.app-input-container.has-error{background-color:var(--color-surface-negative)}.app-input-container.has-error:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-error:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-error:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-error.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-error.hovered{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error.hovered.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error.hovered.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}@media(hover:hover){.app-input-container.has-error:hover{background-color:var(--color-surface-negative-hover)}.app-input-container.has-error:hover.has-text .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-error:hover.has-text .bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}}.app-input-container.has-error:has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus);color:var(--color-text-inverse)}.app-input-container.has-error:has(.app-input:focus-visible).has-text .button-icon{opacity:1}.app-input-container.has-error:has(.app-input:focus-visible).has-text .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.app-input-container.has-error:has(.app-input:focus-visible).is-empty,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected){background-color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .app-input-error,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .app-input-error{opacity:0}.app-input-container.has-error:has(.app-input:focus-visible).is-empty .bg-icon,.app-input-container.has-error:has(.app-input:focus-visible).has-dropdown:not(.has-selected) .bg-icon{color:var(--color-surface-neutral-focus)!important}.app-input-container.has-error:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .warning-icon,.app-input-container.has-error.is-empty:has(.app-input:not(:focus-visible)) .warning-icon{opacity:1!important}.app-input-container.has-error .app-input-error{opacity:1;transform:translateY(0);pointer-events:auto}.app-input-container.has-error .app-input::selection{background-color:#ffffff4d}.app-input-container.has-error .icon-container .separator,.app-input-container.has-error .dropdown-icon-container .separator{background-color:var(--color-icon-negative)}.app-input-container.has-error .icon-container .icon,.app-input-container.has-error .icon-container .icon-sm,.app-input-container.has-error .dropdown-icon-container .icon,.app-input-container.has-error .dropdown-icon-container .icon-sm{color:var(--color-icon-negative)}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#c20c0c!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-error:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.app-input-container.has-valid:not(.has-icon):not(.has-password):not(.has-right) .app-input{padding-right:26px}.app-input-container.has-valid:has(.app-input:focus-visible):not(.has-right) .app-input{padding-right:26px}@media(hover:hover){.app-input-container.has-valid:hover:not(.has-right) .app-input{padding-right:26px}}.app-input-container.has-valid.has-right .app-input{padding-right:6px;padding-left:26px}.app-input-container.has-valid.has-text:not(.has-dropdown):not(.in-table),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.in-table),.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.in-table){background-color:var(--color-surface-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown).hovered .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text.hovered .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover{background-color:var(--color-surface-positive-hover)}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):hover .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):hover .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:hover .bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible),.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible){background-color:var(--color-surface-positive-focus);color:var(--color-text-inverse)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .button-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:focus-visible) .bg-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:focus-visible) .bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.app-input-container.has-valid.has-text:not(.has-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:has(.app-input:not(:focus-visible)).app-input-container:not(:hover) .positive-icon{opacity:1}.app-input-container.has-valid.has-text:not(.has-dropdown) .app-input::selection,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .app-input::selection,.app-input-container.has-valid.has-multiple-dropdown.has-text .app-input::selection{background-color:#ffffff4d}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .separator,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .separator,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .separator,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .separator{background-color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .icon-sm,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .icon-sm,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .icon-sm{color:var(--color-icon-positive)}.app-input-container.has-valid.has-text:not(.has-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-text:not(.has-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .icon-container .password-key,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown) .dropdown-icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .icon-container .password-key,.app-input-container.has-valid.has-multiple-dropdown.has-text .dropdown-icon-container .password-key{opacity:0;pointer-events:none}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .bg-icon:hover{background-color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .dropdown-icon-container:hover .dropdown-icon{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):not(:has(.app-input:focus-visible)):not(.inverse) .hover-icon:hover{color:#0b49d1!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .bg-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.app-input-container.has-valid.has-text:not(.has-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-dropdown.has-selected:not(.has-multiple-dropdown):not(.removable):has(.app-input:focus-visible) .hover-icon:hover,.app-input-container.has-valid.has-multiple-dropdown.has-text:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.in-table,.in-table.has-error,.in-table.has-valid.has-text{background-color:transparent}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)) .app-input{color:var(--color-text-negative)}.in-table.has-error:not(:hover).in-table:not(.app-input-container:has(.app-input:focus-visible)):not(.static-placeholder) .app-input-label{color:var(--color-text-negative)}.in-table .dropdown-icon-container{opacity:0}@media(hover:hover){.in-table:hover .dropdown-icon-container{opacity:1}}.in-table:has(.app-input:focus-visible) .dropdown-icon-container{opacity:1}.app-input-icon{position:absolute;right:4px;top:4px;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.button-icon{opacity:0;pointer-events:none}@media(hover:hover){.button-icon:hover{cursor:pointer}}.bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),transform .1s cubic-bezier(.46,.03,.51,.95);transform-box:border-box;transform-origin:center;will-change:transform}.bg-icon svg{transition:transform .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.bg-icon:hover{transform:scale(1.2222222222)}.bg-icon:hover svg{transform:scale(.8181818182)}}.bg-icon:active{transform:scale(1)}.round-icon{background-color:#919191;color:#2f2f2f;border-radius:50%;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.positive-icon{color:var(--color-icon-positive);height:18px;width:18px;display:grid;place-items:center;opacity:0}.warning-icon{color:var(--color-icon-negative);height:18px;width:18px;display:grid;place-items:center;opacity:0}.text-color-positive:not(:hover):not(:has(.app-input:focus-visible)) .app-input{color:#3b73ed}.is-plan.has-selected .app-input,.is-plan.has-selected .dropdown-selected-content,.is-plan.has-selected .selected-text{font-weight:700}.is-plan.has-selected:not(:has(.app-input:focus-visible)) .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)) .selected-text{color:#3b73ed}@media(hover:hover){.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .app-input,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .dropdown-selected-content,.is-plan.has-selected:not(:has(.app-input:focus-visible)):hover .selected-text{color:#0b49d1}}.floating-error .app-input-error{opacity:0!important}.static-error .app-input-error{pointer-events:none!important;transform:translateY(calc(-100% - 4px))!important;transition:margin .1s ease-in-out,opacity .1s ease-in-out}.static-error.has-icon .app-input-error{margin-right:26px!important}.static-error:has(.app-input:not(:focus-visible)) .app-input-error{opacity:1}.static-error.has-text .app-input-error{opacity:0!important}.static-placeholder .app-input-label{position:relative;white-space:nowrap;font-size:11px;font-weight:600}.static-placeholder .dropdown-selected{overflow:hidden;display:flex!important;justify-content:left!important}.static-placeholder .dropdown-selected .selected-label-hidden{width:max-content;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;pointer-events:none}.static-placeholder .dropdown-selected .selected-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}.static-placeholder .app-input{padding-left:0!important}.static-placeholder.has-dropdown .cancel-button{display:none}.static-placeholder.has-dropdown .dropdown-icon-container .dropdown-icon{opacity:0;pointer-events:none}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-icon-container .dropdown-icon{opacity:1!important}@media(hover:hover){.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon,.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .icon-container .icon-sm{opacity:0}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container{z-index:5;pointer-events:auto;cursor:pointer}.static-placeholder.has-dropdown:not(:has(.app-input:disabled)):hover .dropdown-icon-container .dropdown-icon{opacity:1!important}}.static-placeholder.has-dropdown .dropdown-icon-container{right:4px!important;left:auto!important}.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-icon:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-password:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .icon-container .icon-sm,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon,.app-input-container.has-dropdown:has(.app-input:focus-visible) .dropdown-icon-container .icon-sm{color:var(--color-icon-inverse)!important}.app-input-container.has-icon.colored-icon .icon-container .icon,.app-input-container.has-icon.colored-icon .icon-container .icon-sm,.app-input-container.has-password.colored-icon .icon-container .icon,.app-input-container.has-password.colored-icon .icon-container .icon-sm,.app-input-container.has-dropdown.colored-icon .icon-container .icon,.app-input-container.has-dropdown.colored-icon .icon-container .icon-sm{color:var(--icon-color)}.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-icon.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-password.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .icon-container .icon-sm,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon,.app-input-container.has-dropdown.is-empty:has(.app-input:disabled) .dropdown-icon-container .icon-sm{color:var(--color-icon-disable)!important}.app-input-container.has-icon .positive-icon,.app-input-container.has-icon .warning-icon,.app-input-container.has-password .positive-icon,.app-input-container.has-password .warning-icon,.app-input-container.has-dropdown .positive-icon,.app-input-container.has-dropdown .warning-icon{display:none!important}.app-input-container.has-icon .icon,.app-input-container.has-icon .icon-sm,.app-input-container.has-password .icon,.app-input-container.has-password .icon-sm,.app-input-container.has-dropdown .icon,.app-input-container.has-dropdown .icon-sm{height:18px;width:18px;display:grid;place-items:center;color:var(--color-icon-neutral);transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);opacity:1}.app-input-container.has-icon:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}@media(hover:hover){.app-input-container.has-icon:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-password:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected,.app-input-container.has-dropdown:hover:not(:has(.app-input:disabled)):not(.static-placeholder) .dropdown-selected{width:calc(100% - 48px)!important}}.icon-sm{height:14px;width:14px}.app-input-container.has-icon .icon-container,.app-input-container.has-password .icon-container{height:26px;display:flex;justify-items:center;align-items:center;gap:4px;padding:.25rem 0 .25rem 6px}@media(hover:hover){.app-input-container.has-icon .icon-container:hover,.app-input-container.has-password .icon-container:hover{cursor:text}}.app-input-container.has-icon .subcontent,.app-input-container.has-password .subcontent{left:32px}.app-input-container.has-icon .app-input-label,.app-input-container.has-password .app-input-label{left:27px}.app-input-container.has-icon .app-input,.app-input-container.has-password .app-input{padding-left:4px}.separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);opacity:40%}.has-password .password-icons{display:grid;place-items:center;position:relative;height:18px;width:18px}.has-password .password-icons .icon,.has-password .password-icons .icon-sm{position:absolute;opacity:0}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-key{opacity:1!important}.has-password.is-empty:has(.app-input:not(:focus-visible)) .password-icons{pointer-events:none}.has-password:has(.app-input:disabled) .password-icons{pointer-events:none}.has-password.has-text .password-hidden,.has-password:has(.app-input:focus-visible) .password-hidden{opacity:1!important}@media(hover:hover){.has-password.has-text .password-hidden:hover,.has-password:has(.app-input:focus-visible) .password-hidden:hover{cursor:pointer}}.has-visible.has-text .password-shown,.has-visible:has(.app-input:focus-visible) .password-shown{opacity:1!important}@media(hover:hover){.has-visible.has-text .password-shown:hover,.has-visible:has(.app-input:focus-visible) .password-shown:hover{cursor:pointer}}.has-visible.has-text .password-hidden,.has-visible:has(.app-input:focus-visible) .password-hidden{opacity:0!important;pointer-events:none}.has-number .number-container{position:relative;display:flex;justify-content:center;align-items:center;right:4px;pointer-events:none}.has-number .number-buttons{display:flex;gap:4px;position:absolute;right:0;justify-content:center;align-items:center;opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);pointer-events:none}.has-number .plus-icon,.has-number .minus-icon{cursor:pointer;pointer-events:none}.has-number:has(.app-input:focus-visible){cursor:text}.has-number:has(.app-input:focus-visible) .number-buttons{opacity:1}.has-number:has(.app-input:focus-visible) .plus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .minus-icon{pointer-events:auto}.has-number:has(.app-input:focus-visible) .button-icon{opacity:0!important;pointer-events:none!important}.has-number:has(.app-input:focus-visible) .number-container{width:60px}.has-number:has(.app-input:focus-visible) .subcontent{right:52px!important}.has-number:has(.app-input:focus-visible).has-text .subcontent{right:52px!important}.colored-icon .icon,.colored-icon .icon-sm{color:var(--icon-color)!important}.dropdown-anchor{position:absolute;width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0}.dropdown-infinite-scroll-item{width:100%;-webkit-user-select:none;user-select:none;pointer-events:none;opacity:0;height:0}.dropdown-menu{min-width:0px!important;width:100%;border:0;margin-top:4px;top:30px;height:var(--unfiltered-height);min-height:var(--unfiltered-height);padding:0!important;overflow:hidden;border-radius:0!important;background:transparent!important}.dropdown-menu.has-stroke .dropdown-menu-content{outline:1px solid #6c6c6c;outline-offset:-1px}.dropdown-menu .dropdown-menu-content{position:absolute;width:100%;background-color:#2f2f2f;border-radius:3px;padding:4px 0 4px 4px;max-height:244px;z-index:1100!important;overflow-y:scroll;margin-top:auto!important;scroll-padding:6px 0}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar{background-color:#2f2f2f;border-radius:0 3px 3px 0;width:4px}.dropdown-menu .dropdown-menu-content::-webkit-scrollbar-thumb{width:4px;background:#2f2f2f;border-left:2px solid #919191;background-clip:padding-box;border-radius:1px 3px 3px 1px}@supports (-moz-appearance: none){.dropdown-menu .dropdown-menu-content{padding-right:4px;scrollbar-width:4px;scrollbar-color:#919191 transparent;scrollbar-gutter:stable!important}@media(hover:hover){.dropdown-menu .dropdown-menu-content:hover{scrollbar-color:#919191 transparent;scrollbar-width:4px!important;scrollbar-gutter:stable!important}}}@-moz-document url-prefix(){.dropdown-menu .dropdown-menu-content{overflow:-moz-scrollbars-vertical;scrollbar-width:4px;scrollbar-color:#919191 transparent}}.option-icon{color:#6c6c6c;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.option-icon.full-size{width:max-content;min-width:100%;height:18px!important;min-height:18px;flex-shrink:0;overflow:hidden}.option-icon.full-size svg{height:18px;width:max-content}.cai-color{color:var(--color)!important;transition:color .1s cubic-bezier(.46,.03,.51,.95)}@media(hover:hover){.color-item:hover .cai-color{color:var(--hover-color)!important}}.dropdown-item{color:#fff;font-weight:400;font-size:14px;line-height:18px;height:26px;padding:4px;width:100%;scroll-margin:6px 0;outline:1px solid transparent;outline-offset:-1px;display:flex;align-items:center;justify-content:left;gap:4px;background-color:#2f2f2f;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),outline .1s cubic-bezier(.46,.03,.51,.95);border-radius:2px;position:relative}.dropdown-item.focused{outline:1px solid #6c6c6c!important}.dropdown-item.focused .end-item-base{opacity:0}.dropdown-item.focused .end-item-hover{opacity:1}.dropdown-item.focused .full-icon{color:#ffffffb2}.dropdown-item.focused .truck-trailer-option{opacity:1}.dropdown-item .icon,.dropdown-item .icon-sm{color:#919191}.dropdown-item .dropdown-content-with-icon{max-width:calc(100% - 22px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content-hazardous{max-width:calc(100% - 40px);overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}.dropdown-item .dropdown-content{max-width:70%;overflow-x:hidden;word-break:break-all;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){.dropdown-item:hover:not(.no-hover){background-color:#424242}.dropdown-item:hover:not(.no-hover) .end-item-base{opacity:0}.dropdown-item:hover:not(.no-hover) .end-item-hover{opacity:1}.dropdown-item:hover:not(.no-hover) .full-icon{color:#ffffffb2}.dropdown-item:hover:not(.no-hover) .truck-trailer-option{opacity:1}}.dropdown-item.no-hover{cursor:default;pointer-events:none}.dropdown-item:focus-visible{background-color:#424242;border:0;outline:none}.dropdown-item:not(:first-child){margin-top:4px}.dropdown-item.banned{color:#919191;cursor:default}@media(hover:hover){.dropdown-item.banned:hover{color:#919191;background-color:#2f2f2f}.dropdown-item.banned:hover .end-item-base{opacity:0}.dropdown-item.banned:hover .end-item-hover{opacity:1}}.dropdown-item.dnu .round-icon{background-color:#e66767}.dropdown-item.selected .dispatch-load-count,.dropdown-item.selected .unassigned-ltl,.dropdown-item.selected .unassigned-ltl .icon,.dropdown-item.selected .unassigned-ltl .icon-sm{color:#92b1f5}.dropdown-item:not(:hover):not(.focused):not(.selected) .truck-icon{color:#919191}.dropdown-item:not(:hover):not(.focused):not(.selected) .trailer-icon{color:#919191}@media(hover:hover){.dropdown-avatar:hover{z-index:20}}.no-results{color:#919191;font-weight:700;cursor:default;pointer-events:none}.add-new{color:#92b1f5!important;font-weight:700;font-size:11px}.add-new .dropdown-item-icon{opacity:1}@media(hover:hover){.add-new:hover{background-color:#3b73ed66!important;color:#fff!important}}.selected{font-weight:700}.selected .dropdown-item-icon{opacity:1}.selected .dropdown-item-count{color:#fff;background-color:#3b73ed}.selected .full-icon{color:#fff}.selected .end-item-base,.selected .end-item-hover{font-weight:700;color:#92b1f5}.selected .end-item-base .icon,.selected .end-item-base .icon-sm,.selected .end-item-hover .icon,.selected .end-item-hover .icon-sm{color:#92b1f5}.dropdown-item-icon{opacity:0;color:#92b1f5;width:14px;height:14px;margin-left:auto}.dropdown-item-icon.no-margin{margin-left:0}.dropdown-item-count{position:absolute;right:6px;top:50%;transform:translateY(-50%);padding:2px 5px;border-radius:10px;background-color:#424242;color:#ffffffb2;min-width:18px;line-height:14px;font-weight:600;font-size:11px;text-align:center}.fraud-icon{color:#fab15c!important;height:18px;width:18px}.dropdown-icon-container{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;display:grid;place-items:center;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-icon-container.open .dropdown-icon{transform:rotateX(180deg)}.dropdown-icon{transition:transform .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)!important;transform:rotateX(0);cursor:pointer}.has-dropdown .app-input-icon{right:26px}.has-dropdown:has(.app-input:focus-visible) .subcontent{right:26px!important}.has-dropdown:has(.app-input:focus-visible).has-text .subcontent,.has-dropdown:has(.app-input:focus-visible).has-selected .subcontent{right:48px!important}.has-dropdown:has(.app-input:focus-visible):not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}@media(hover:hover){.has-dropdown:hover:not(.static-placeholder):not(.is-adding) .app-input{padding-right:48px!important}}.has-right .app-input{text-align:right}@media(pointer:coarse){.has-right .app-input{transform-origin:right center}}.has-right .positive-icon,.has-right .app-input-icon{left:4px;right:auto}.has-right .cancel-button{z-index:1}.has-right.has-number .plus-button-container{order:2}.has-right.has-number .minus-button-container{order:1}.has-right.static-placeholder .app-input-icon{right:4px!important;left:auto!important;opacity:0!important}.has-right.static-placeholder:has(.app-input:focus-visible) .cancel-button{opacity:0!important;pointer-events:none!important}.has-right.static-placeholder.removable .cancel-button .bg-icon{background-color:transparent!important}@media(hover:hover){.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon{color:var(--color-icon-positive)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-valid.has-text:has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon{color:var(--color-icon-neutral)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text) .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon{color:var(--color-icon-inverse)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)):not(.has-text):has(.app-input:focus-visible) .cancel-button .bg-icon:hover{color:#fff!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon{color:var(--color-icon-negative)!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)).has-error .cancel-button .bg-icon:hover{color:#c20c0c!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button{opacity:1!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .cancel-button .bg-icon{opacity:1!important;pointer-events:auto!important}.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon,.has-right.static-placeholder.removable:hover:not(:has(.app-input:disabled)) .icon-container .icon-sm{opacity:0!important}}@media(hover:hover){.has-right.static-placeholder:hover:not(:has(.app-input:focus-visible)):not(:has(.app-input:disabled)).has-text .cancel-button{opacity:1!important}}.has-right .app-input{order:1}.has-right.has-subcontent .app-input{flex:1;min-width:0;word-break:none}.has-right .dropdown-selected{margin-left:0!important;text-align:right!important;right:0!important;left:0!important;justify-content:flex-end!important;width:100%!important}.has-right .subcontent{position:relative!important;order:1;display:grid;place-items:center;padding-right:4px;height:unset!important;transform:translateY(0)!important;left:0!important;right:unset!important}.has-right .subcontent .subcontent-hide{display:none!important}.has-right.has-text .subcontent{left:0!important;right:unset!important}.has-right:has(.app-input:focus-visible) .subcontent{left:0!important;right:unset!important}.has-right.has-icon .subcontent,.has-right.has-password .subcontent{padding-right:0!important;padding-left:4px}.has-right.has-icon .dropdown-selected,.has-right.has-password .dropdown-selected{width:calc(100% - 24px)!important}.has-right.has-icon .app-input,.has-right.has-password .app-input{padding-right:0!important}.has-right.has-icon .app-input-label,.has-right.has-password .app-input-label{left:0!important}.has-right.has-icon.fade-placeholder .app-input-label,.has-right.has-password.fade-placeholder .app-input-label{left:auto!important;right:24px!important}.has-right.has-icon .icon-container,.has-right.has-password .icon-container{width:30px;padding-left:4px}.has-right.has-icon .icon-container .icon,.has-right.has-icon .icon-container .icon-sm,.has-right.has-password .icon-container .icon,.has-right.has-password .icon-container .icon-sm{order:2}.has-right.has-dropdown .app-input-icon{left:26px}.has-right.has-dropdown .dropdown-icon-container{left:4px}.has-right .warning-icon{display:none!important}.has-right.has-number .separator{order:3}.has-right.has-number .number-buttons{left:0;right:unset}.has-right.has-number .number-container{left:4px;right:unset}.has-right.has-number.app-input-container:has(.app-input:focus-visible) .app-input{padding-left:4px}@media(hover:hover){.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .number-container{width:60px}.has-right.has-number.app-input-container:hover:not(:has(.app-input:disabled)) .app-input{padding-left:4px}}.has-right .icon-container{order:2;margin-right:4px}.has-right .icon-container .password-icons{order:2}.has-right.fade-placeholder .app-input-label{right:0!important;left:auto!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:after{content:none!important}.has-right.fade-placeholder:has(.app-input:required) .app-input-name:before{content:\"* \";color:var(--color-text-negative)}@media(hover:hover){.removable:has(.cancel-button:hover).in-table{background-color:transparent!important}.removable:has(.cancel-button:hover).in-table .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):not(.in-table){background-color:var(--color-surface-negative-hover)!important}.removable:has(.cancel-button:hover):not(.in-table) .separator{background-color:var(--color-icon-negative)!important}}@media(hover:hover){.removable:has(.cancel-button:hover):has(.app-input:focus-visible){background-color:var(--color-surface-negative-focus)!important}.removable:has(.cancel-button:hover):has(.app-input:focus-visible) .separator{background-color:var(--color-icon-inverse)!important}}.no-clear .cancel-button{display:none!important}.is-adding{padding-right:20px}.is-adding .dropdown-icon{opacity:0!important}.is-adding .accept-button{pointer-events:none;opacity:0!important}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .bg-icon:hover{background-color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .dropdown-icon-container:hover .dropdown-icon{color:#fff!important}}@media(hover:hover){.is-adding:not(.removable):has(.app-input:focus-visible) .hover-icon:hover{color:#fff!important}}.is-adding:has(.app-input:focus-visible){padding-right:48px!important}@media(hover:hover){.is-adding:hover{padding-right:48px!important}}.is-adding.has-right{padding-left:26px}.is-adding.has-right.has-right:has(.app-input:focus-visible){padding-left:40px}@media(hover:hover){.is-adding.has-right.has-right:hover{padding-left:40px}}.is-adding .app-input-icon{right:4px}@media(hover:hover){.is-adding.has-text:hover .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:hover .accept-button{pointer-events:auto;opacity:1!important}}.is-adding.has-text:has(.app-input:focus-visible) .button-icon{opacity:1;pointer-events:auto!important}.is-adding.has-text:has(.app-input:focus-visible) .accept-button{pointer-events:auto;opacity:1!important}.is-adding .cancel-button{opacity:1!important;pointer-events:auto}.is-adding .dropdown-icon-container{pointer-events:none}.is-adding .accept-button{right:26px;pointer-events:auto}.dropdown-selected{-webkit-user-select:none;user-select:none;position:absolute;top:50%;transform:translateY(-50%);left:0;width:calc(100% - 22px);pointer-events:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;word-break:break-all;padding:.25rem 6px;font-size:14px;line-height:18px;font-weight:400;border:0;outline:none;margin-top:auto;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95),width .1s ease-in-out;color:var(--color-text);display:flex;gap:4px}.dropdown-selected .dropdown-selected-content{overflow:hidden;-webkit-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.dropdown-selected .dropdown-selected-hazardous{max-width:calc(100% - 22px)}p.dropdown-selected{-webkit-user-select:none;user-select:none;display:block}.app-input-container:has(.app-input:focus-visible) .dropdown-selected{color:#fff;opacity:.7}.app-input-container:has(.app-input:focus-visible) .dropdown-selected .option-icon{color:#fff!important}.has-icon .positive-icon,.has-icon .warning-icon{display:none}.has-icon .dropdown-selected{left:27px;width:calc(100% - 49px)}@media(hover:hover){.has-icon:hover .dropdown-selected{width:calc(100% - 71px)}}.has-icon.app-input-container:has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 71px)}.hazard-icon{height:18px;width:max-content}.has-dispatch .app-input-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.dispatch-load-count{color:#dadada;font-weight:700}.dispatch-separator{color:#919191;font-weight:400}.dispatch-status{font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:14px;letter-spacing:0%;text-transform:uppercase;color:#ffffffb2;border-radius:2px;padding:2px 4px;display:flex;justify-content:center;align-items:center;gap:4px}.dispatch-status.status-available{background-color:#50ac2533}.dispatch-status.status-dispatched{background-color:#3b73ed33}.dispatch-status.status-arrivedpickup,.dispatch-status.status-checkedinpickup,.dispatch-status.status-checkedin,.dispatch-status.status-loading,.dispatch-status.status-loaded{background-color:#259f9433}.dispatch-status.status-arriveddelivery,.dispatch-status.status-checkedindelivery,.dispatch-status.status-offloading,.dispatch-status.status-offloaded,.dispatch-status.status-empty{background-color:#ff704333}.dispatch-status.status-canceled{background-color:#df3c3c33}.dispatch-status.status-off,.dispatch-status.status-deadheading,.dispatch-status.status-break,.dispatch-status.status-split{background-color:#91919133}.dispatch-status.status-towing{background-color:#9e47ec33}.dispatch-status.status-repair,.dispatch-status.status-dispatchedrepair,.dispatch-status.status-loadedrepair{background-color:#865e3a33}.dispatch-status .status-block{border-radius:1px;background-color:#aaa;padding-left:2px;padding-right:2px;font-family:Montserrat;font-weight:700;font-style:Bold;font-size:11px;line-height:12px;text-align:center;color:#2f2f2f;min-width:12px;height:12px}.dispatch-status .status-block.blue{background-color:#6692f1}.dispatch-status .status-block.green{background-color:#56b4ac}.dispatch-status .status-block.orange{background-color:#ff906d}.has-ftl-dispatch,.has-dispatch{min-width:600px}.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-ftl-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .dispatch-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .trailer-icon,.has-dispatch:has(.app-input:focus-visible) .dropdown-selected .truck-icon{color:#fff}.dropdown-subitem{display:flex;justify-content:left;align-items:center;gap:4px}.truck-item{width:128px}.trailer-item{width:138px}.truck-trailer-option{opacity:0;transition:opacity .1s cubic-bezier(.46,.03,.51,.95);margin-left:auto}.truck-trailer-icon-colors.ic_truck_semi-truck,.truck-trailer-icon-colors.ic_truck_semi-wSleeper{color:#92b1f5}.truck-trailer-icon-colors.ic_truck_box-truck,.truck-trailer-icon-colors.ic_truck_reefer,.truck-trailer-icon-colors.ic_truck_cargo-van{color:#fbc88b}.truck-trailer-icon-colors.ic_truck_cement,.truck-trailer-icon-colors.ic_truck_dump,.truck-trailer-icon-colors.ic_truck_garbage{color:#ed9292}.truck-trailer-icon-colors.ic_truck_tow-truck,.truck-trailer-icon-colors.ic_truck_car-hauler,.truck-trailer-icon-colors.ic_truck_spotter{color:#86c9c3}.truck-trailer-icon-colors.ic_trailer_flatbed,.truck-trailer-icon-colors.ic_trailer_low-boy,.truck-trailer-icon-colors.ic_trailer_step-deck{color:#92b1f5}.truck-trailer-icon-colors.ic_trailer_chassis,.truck-trailer-icon-colors.ic_trailer_container{color:#80d6f1}.truck-trailer-icon-colors.ic_trailer_conestoga,.truck-trailer-icon-colors.ic_trailer_side-kit{color:#8785e8}.truck-trailer-icon-colors.ic_trailer_dryvan,.truck-trailer-icon-colors.ic_trailer_reefer{color:#fbc88b}.truck-trailer-icon-colors.ic_trailer_end-dump,.truck-trailer-icon-colors.ic_trailer_bottom-dump,.truck-trailer-icon-colors.ic_trailer_hopper{color:#ed9292}.truck-trailer-icon-colors.ic_trailer_tanker,.truck-trailer-icon-colors.ic_trailer_tanker-pneumatic{color:#ed93bb}.truck-trailer-icon-colors.ic_trailer_carhauler,.truck-trailer-icon-colors.ic_trailer_carhauler-stinger{color:#86c9c3}.sub-label{margin-left:auto;margin-right:22px;opacity:0;transition:margin .1s ease-in-out,opacity .1s ease-in-out;color:#6c6c6c}.app-input-label:has(.sub-label),.app-input-label:has(.accident-state){width:100%}.has-selected .sub-label{opacity:1}.dispatch-icon,.trailer-icon,.truck-icon{color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.truck-icon,.trailer-icon{width:42px}.truck-number{width:80px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.trailer-number{width:90px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.driver-name{max-width:170px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.dropdown-subitem-end{margin-left:auto;position:relative;height:26px;width:auto;display:flex;justify-content:right;align-items:center;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;vertical-align:bottom}.end-item-base{position:absolute;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);text-align:right}.dispatch-ltl{font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.unassigned-ltl{margin-left:auto;display:flex;justify-content:right;align-items:center;width:max-content;gap:4px;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);font-family:Montserrat;font-weight:700;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right}.end-item-hover{position:absolute;display:flex;justify-content:right;align-items:center;gap:4px;width:max-content;opacity:0;color:#919191;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95)}.selected-end-item{margin-left:auto;font-family:Montserrat;font-weight:400;font-size:11px;line-height:18px;letter-spacing:0%;text-align:right;display:flex;justify-content:right;align-items:center;gap:4px}.group-item{font-family:Montserrat;font-weight:700!important;font-size:11px!important;line-height:18px;letter-spacing:0%;vertical-align:middle;text-transform:uppercase;background-color:#2f2f2f;color:#aaa!important}.group-item:not(:first-child){border-top:1px solid #424242}.group-item .group-icon{margin-left:auto;transform:rotate(180deg);transition:transform .1s cubic-bezier(.46,.03,.51,.95)}.group-item.unfolded{color:#fff!important}.group-item.unfolded .group-icon{transform:rotate(0)}.counter{background-color:#424242;padding:1px 4px;border-radius:60px;font-family:Montserrat;font-weight:600;font-size:11px;min-width:18px;line-height:14px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#ffffffb2;transition:color .1s cubic-bezier(.46,.03,.51,.95)}.password-requirement{padding:6px;background-color:#fffffff2!important;box-shadow:0 0 4px #0006;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);overflow-y:hidden}.password-requirement p{font-family:Montserrat;font-weight:600;font-size:11px;line-height:14px;letter-spacing:0%;vertical-align:middle;color:#6c6c6c;font-style:italic}.password-requirement .icon,.password-requirement .icon-sm{width:14px!important;height:14px!important}.password-requirement .icon.checkmark,.password-requirement .checkmark.icon-sm{color:#ccc}.password-requirement .icon.cancel,.password-requirement .cancel.icon-sm{color:#e66767}.password-requirement ul{list-style-type:none;margin:6px 0 0;padding:0}.password-requirement ul li{color:#424242;font-size:11px;font-style:italic;font-weight:500;line-height:14px;display:flex;gap:4px}.password-requirement ul li.valid{color:#919191!important}.password-requirement ul li:not(:first-child){margin-top:6px}@media(hover:hover){.has-end-item:not(:has(.app-input:disabled)):hover .dropdown-selected{width:calc(100% - 44px)}}.has-end-item:not(:has(.app-input:disabled)):has(.app-input:focus-visible) .dropdown-selected{width:calc(100% - 44px)}.progress-bar{width:24px;height:8px;border-radius:2px;position:relative;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar:after{content:\"\";position:absolute;top:0;width:var(--progress);height:100%;transition:background-color .1s cubic-bezier(.46,.03,.51,.95)}.progress-bar.low{background-color:#df3c3c33}.progress-bar.low:after{background-color:#e66767}.progress-bar.medium{background-color:#f89b2e33}.progress-bar.medium:after{background-color:#fab15c}.progress-bar.high{background-color:#56b4ac33}.progress-bar.high:after{background-color:#56b4ac}.progress-bar.disable{background-color:#91919133}.progress-bar.disable:after{display:none}.app-input-container:has(.app-input:focus-visible) .selected-end-item .progress-bar{background-color:#fff!important}.full-icon{color:#919191}.fuelcard-number{width:216px}.fuelcard-brand{width:132px}.owner-ein{width:118px}.accident-name,.accident-unit,.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{flex-shrink:0}.accident-name>p,.accident-unit>p{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-name{width:218px}.accident-unit{width:170px}.accident-dob,.accident-cdl-number,.accident-vin,.accident-plate{text-align:right;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.accident-dob{width:134px}.accident-cdl-number{width:140px}.accident-vin{width:182px}.accident-plate{width:140px}.accident-state{margin-left:auto;justify-content:flex-end;text-align:right}.app-input-label .accident-state{margin-right:22px;white-space:nowrap;transition:margin .1s ease-in-out}.has-multiple-dropdown.has-text{border-top-left-radius:0!important;border-top-right-radius:0!important}.multiple-container{display:flex;flex-wrap:wrap;gap:4px;padding:4px;border-top-left-radius:2px;border-top-right-radius:2px;position:relative;transition:background-color .1s ease-in-out;background-color:#e9effd}.multiple-container.hovered{background-color:#bed0f9}.multiple-container.hovered .multiple-selected{background-color:#e9effd}.multiple-container.focused{background-color:#0b49d1}.multiple-container.focused .multiple-selected{background-color:#3b73ed;color:#fff}.multiple-selected{background-color:#bed0f9;color:#2f2f2f;transition:background-color .1s ease-in-out,color .1s ease-in-out;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;padding:2px 4px;-webkit-user-select:none;user-select:none;font-family:Montserrat;font-size:14px;font-weight:400;line-height:18px;width:209px;height:22px;border-radius:1px}.multiple-selected p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media(hover:hover){.multiple-selected:hover{color:#2f2f2f!important;background-color:#fff!important}.multiple-selected:hover .multiple-remove-button{opacity:1}}.multiple-selected .multiple-remove-button{opacity:0;background-color:#6692f1;color:#fff;width:14px;height:14px}.multiple-selected .multiple-remove-button .multiple-remove-icon{width:12px;height:12px}.multiple-label{color:#424242;-webkit-user-select:none;user-select:none;pointer-events:none;font-family:Montserrat;font-size:11px;font-style:normal;font-weight:600;position:absolute;top:0;left:6px;transform:translateY(-14px)}.dropdown-group{border-radius:2px;transition:background-color .1s cubic-bezier(.46,.03,.51,.95),max-height .1s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;margin-top:4px;max-height:var(--max-height);height:var(--max-height);overflow:hidden}.dropdown-group.no-items{cursor:default;pointer-events:none}.dropdown-group .group-item{outline:none;color:#fff!important;font-weight:400!important;font-size:14px!important;display:flex;transition:font-weight .1s ease-in-out,background-color .1s cubic-bezier(.46,.03,.51,.95),color .1s cubic-bezier(.46,.03,.51,.95);padding-left:6px;padding-right:6px}.dropdown-group .group-item.unfolded .counter{color:#fff}@media(hover:hover){.dropdown-group .group-item:hover .counter{color:#fff}}.dropdown-group .group-item.unfolded{font-weight:700!important}.dropdown-group .group-item .counter{margin-left:auto}.dropdown-group .group-item .group-icon{margin-left:0}.dropdown-group.active{background-color:#424242}@media(hover:hover){.dropdown-group.active .group-item:hover{background-color:#424242}}.dropdown-group.active .dropdown-item{background-color:#424242}@media(hover:hover){.dropdown-group:hover:not(.no-items){background-color:#424242}.dropdown-group:hover:not(.no-items) .group-item:hover{background-color:#424242}.dropdown-group:hover:not(.no-items) .dropdown-item{background-color:#424242}}.dropdown-group.active{padding:4px;padding-top:0!important}.dropdown-group.active .group-item{position:relative!important;padding-left:2px!important;padding-right:2px!important}@media(hover:hover){.dropdown-group .dropdown-item:not(.group-item):hover{background-color:#6c6c6c!important}}.fuel-stop-transaction-store{display:flex;gap:4px}.fuel-stop-transaction-store .fuel-stop-transaction-store-address{font-size:11px;color:#ccc;margin-left:auto}.fuel-stop-transaction-store .favorite-icon{color:#92b1f5;width:14px;height:14px}.fuel-stop-transaction-nostore{padding-left:2px;padding-right:2px}.hide-dropdown{opacity:0;pointer-events:none;transition:opacity .1s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown) .dropdown-menu-content{transition:max-height .2s cubic-bezier(.46,.03,.51,.95),opacity .2s cubic-bezier(.46,.03,.51,.95),height .1s ease-in-out;animation:dropdown-menu-opening .2s cubic-bezier(.46,.03,.51,.95)}.dropdown-menu:not(.hide-dropdown).animate-dropdown .dropdown-menu-content{max-height:var(--max-height);height:var(--max-height)}.closing:not(.hide-dropdown) .dropdown-menu-content{animation:dropdown-menu-closing .2s cubic-bezier(.46,.03,.51,.95);opacity:0;max-height:0}@keyframes dropdown-menu-opening{0%{max-height:0;opacity:0}to{max-height:244px;opacity:1}}@keyframes dropdown-menu-closing{0%{max-height:244px;opacity:1}to{max-height:0;opacity:0}}.app-input-container:has(.app-input:focus-visible).has-dropdown .loader.loading,.app-input-container:has(.app-input:focus-visible).has-text .loader.loading{opacity:1!important}.app-input-container:has(.app-input:focus-visible).has-dropdown.has-text .loader{transform:translate(-48px)}.loader{position:absolute;top:4px;right:0;transform:translate(-26px);pointer-events:none;z-index:1000;width:18px;height:18px;display:flex;align-items:center;justify-content:center;transition:opacity .1s ease-in-out,transform .1s ease-in-out;opacity:0}.loader-icon{width:14px;height:14px;animation:spin .8s ease-in-out infinite;transform-origin:center;display:flex;align-items:center;justify-content:center}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.size-22{height:22px}.size-22 .icon,.size-22 .icon-sm{height:14px!important;width:14px!important}.size-22 .bg-icon{height:14px!important;width:14px!important;padding:2px!important}.size-22 .icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.size-22 .app-input{padding-top:2px;padding-bottom:2px;padding-left:4px}@media(pointer:coarse){.size-22 .app-input{height:22px}}.size-22 .app-input-label{padding-top:2px;padding-bottom:2px;padding-left:4px}.size-22.has-icon .app-input-label{padding-left:0!important}.size-22 .app-input-icon{height:14px!important;width:14px!important}.size-22.has-text .app-input-label,.size-22:has(.app-input:focus-visible) .app-input-label{transform:translateY(-18px)}.size-22 .loader{top:2px;transform:translate(-22px)!important}.strikethrough .app-input,.strikethrough .dropdown-selected-content{text-decoration:line-through}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.split-option>p{max-width:calc(50% - 2px)}.split-option .dropdown-subitem-end{width:calc(50% - 2px)}.split-option .end-item-base,.split-option .end-item-hover{max-width:100%}.selected-end-item-truncate{max-width:50%}.truck-owner-unit{min-width:0}.truck-owner-unit .dropdown-content{max-width:none;min-width:0}.truck-owner-bullet{flex-shrink:0;color:#919191}\n"] }]
|
|
4586
4839
|
}], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
|
|
4587
4840
|
type: Optional
|
|
4588
4841
|
}, {
|
|
@@ -6901,6 +7154,7 @@ class CustomDatetimePickersConstants {
|
|
|
6901
7154
|
12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
6902
7155
|
11,
|
|
6903
7156
|
];
|
|
7157
|
+
static hourTimesTwentyFour = Array.from({ length: 24 }, (_, hour) => String(hour).padStart(2, '0'));
|
|
6904
7158
|
static defaultScrollTypes = {
|
|
6905
7159
|
pmAmScroll: 0,
|
|
6906
7160
|
minutesScroll: 0,
|
|
@@ -7477,7 +7731,9 @@ class CaCustomDatetimePickersComponent {
|
|
|
7477
7731
|
set dateTime(value) {
|
|
7478
7732
|
this._dateTime = value;
|
|
7479
7733
|
// Update time value when dateTime changes
|
|
7480
|
-
if (this.hourScroll &&
|
|
7734
|
+
if (this.hourScroll &&
|
|
7735
|
+
this.minutesScroll &&
|
|
7736
|
+
(this.pmAmScroll || this.isTwentyFourHour)) {
|
|
7481
7737
|
this.setTimeValue();
|
|
7482
7738
|
}
|
|
7483
7739
|
}
|
|
@@ -7494,6 +7750,10 @@ class CaCustomDatetimePickersComponent {
|
|
|
7494
7750
|
this.timeMinutes = CustomDatetimePickersConstants.timeMinutesGapFive;
|
|
7495
7751
|
else
|
|
7496
7752
|
this.timeMinutes = CustomDatetimePickersConstants.timeMinutes;
|
|
7753
|
+
this.isTwentyFourHour = this._inputConfig.timeFormat === 'TwentyFourHour';
|
|
7754
|
+
this.hourTimes = this.isTwentyFourHour
|
|
7755
|
+
? CustomDatetimePickersConstants.hourTimesTwentyFour
|
|
7756
|
+
: CustomDatetimePickersConstants.hourTimes;
|
|
7497
7757
|
}
|
|
7498
7758
|
closePopover = new EventEmitter();
|
|
7499
7759
|
dateCalendar;
|
|
@@ -7522,6 +7782,7 @@ class CaCustomDatetimePickersComponent {
|
|
|
7522
7782
|
isInputFocus;
|
|
7523
7783
|
monthNames = CustomDatetimePickersConstants.monthNames;
|
|
7524
7784
|
hourTimes = CustomDatetimePickersConstants.hourTimes;
|
|
7785
|
+
isTwentyFourHour = false;
|
|
7525
7786
|
scrollTypes = CustomDatetimePickersConstants.defaultScrollTypes;
|
|
7526
7787
|
selectedTime = CustomDatetimePickersConstants.defaultSelectedTime;
|
|
7527
7788
|
timeOfDay = CustomDatetimePickersConstants.timeOfDay;
|
|
@@ -7561,7 +7822,8 @@ class CaCustomDatetimePickersComponent {
|
|
|
7561
7822
|
const dateInputArray = moment(this.dateTime).format('h/mm/A').split('/');
|
|
7562
7823
|
// console.log(dateInputArray, 'this.inputConfig');
|
|
7563
7824
|
setTimeout(() => {
|
|
7564
|
-
|
|
7825
|
+
// The hour list holds one entry per hour of the day, AM then PM.
|
|
7826
|
+
this.scrollTypes.hourScroll = this.dateTime.getHours();
|
|
7565
7827
|
this.scrollTypes.minutesScroll = this.timeMinutes.indexOf(dateInputArray[1]);
|
|
7566
7828
|
this.scrollTypes.pmAmScroll = dateInputArray[2] === 'AM' ? 0 : 1;
|
|
7567
7829
|
// Update scroll positions if elements exist
|
|
@@ -7604,8 +7866,10 @@ class CaCustomDatetimePickersComponent {
|
|
|
7604
7866
|
this.scrollTypes.hourScroll * 22;
|
|
7605
7867
|
this.minutesScroll.nativeElement.scrollTop =
|
|
7606
7868
|
this.scrollTypes.minutesScroll * 22;
|
|
7607
|
-
this.pmAmScroll
|
|
7608
|
-
this.
|
|
7869
|
+
if (this.pmAmScroll) {
|
|
7870
|
+
this.pmAmScroll.nativeElement.scrollTop =
|
|
7871
|
+
this.scrollTypes.pmAmScroll * 22;
|
|
7872
|
+
}
|
|
7609
7873
|
});
|
|
7610
7874
|
}
|
|
7611
7875
|
else {
|
|
@@ -7615,6 +7879,12 @@ class CaCustomDatetimePickersComponent {
|
|
|
7615
7879
|
}
|
|
7616
7880
|
setTime(event) {
|
|
7617
7881
|
event?.stopPropagation();
|
|
7882
|
+
if (this.isTwentyFourHour) {
|
|
7883
|
+
const selectedTime = new Date();
|
|
7884
|
+
selectedTime.setHours(this.scrollTypes.hourScroll, Number(this.timeMinutes[this.scrollTypes.minutesScroll]), 0, 0);
|
|
7885
|
+
this.closePopover.emit(selectedTime);
|
|
7886
|
+
return;
|
|
7887
|
+
}
|
|
7618
7888
|
this.outputType[0] = this.hourTimes[this.scrollTypes.hourScroll];
|
|
7619
7889
|
this.outputType[2] = this.timeMinutes[this.scrollTypes.minutesScroll];
|
|
7620
7890
|
this.outputType[4] = this.timeOfDay[this.scrollTypes.pmAmScroll];
|
|
@@ -7687,15 +7957,18 @@ class CaCustomDatetimePickersComponent {
|
|
|
7687
7957
|
}
|
|
7688
7958
|
}
|
|
7689
7959
|
}
|
|
7690
|
-
|
|
7691
|
-
|
|
7692
|
-
|
|
7960
|
+
const selectedTime = `${this.hourTimes[this.scrollTypes.hourScroll]}:${this.timeMinutes[this.scrollTypes.minutesScroll]}`;
|
|
7961
|
+
this.selectedTime = !this.timeMinutes[this.scrollTypes.minutesScroll]
|
|
7962
|
+
? ''
|
|
7963
|
+
: this.isTwentyFourHour
|
|
7964
|
+
? selectedTime
|
|
7965
|
+
: `${selectedTime} ${this.timeOfDay[this.scrollTypes.pmAmScroll]}`;
|
|
7693
7966
|
}
|
|
7694
7967
|
ngOnDestroy() {
|
|
7695
7968
|
this.listPreview = CalendarListPreviewStringEnum.FULL_LIST;
|
|
7696
7969
|
}
|
|
7697
7970
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: CaCustomDatetimePickersComponent, deps: [{ token: CalendarDateTimePickerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
7698
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: CaCustomDatetimePickersComponent, isStandalone: true, selector: "cai-custom-datetime-pickers", inputs: { dateTime: "dateTime", inputConfig: "inputConfig", calendarType: "calendarType", placeholder: "placeholder" }, outputs: { closePopover: "closePopover", onRefocusInput: "onRefocusInput" }, viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true, read: ViewContainerRef }, { propertyName: "dateCalendar", first: true, predicate: CaCustomDateTimePickersDateCalendarsComponent, descendants: true }, { propertyName: "pmAmScroll", first: true, predicate: ["pmAmScroll"], descendants: true }, { propertyName: "minutesScroll", first: true, predicate: ["minutesScroll"], descendants: true }, { propertyName: "hourScroll", first: true, predicate: ["hourScroll"], descendants: true }], ngImport: i0, template: "<div\n class=\"temp_inp_holder\"\n (pointerdown)=\"refocusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n>\n <div>\n <div class=\"pickers_holder dark_picker\">\n @if (calendarMainType === \"date\") {\n <div class=\"date_picker\">\n <cai-custom-datetime-pickers-date-calendars\n [listPreview]=\"listPreview\"\n [dateTime]=\"dateTime\"\n [isMonthAndYearOnly]=\"_inputConfig.name === 'datepickerBankCard'\"\n (setListPreviewValue)=\"setListPreview($event)\"\n (onRefocusInput)=\"refocusInput($event)\"\n ></cai-custom-datetime-pickers-date-calendars>\n </div>\n }\n @if (calendarMainType === \"time\") {\n <div class=\"time_picker\">\n <div class=\"time_picker_head d-flex\">\n <div class=\"selected_time ta-font-bold\">\n {{
|
|
7971
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: CaCustomDatetimePickersComponent, isStandalone: true, selector: "cai-custom-datetime-pickers", inputs: { dateTime: "dateTime", inputConfig: "inputConfig", calendarType: "calendarType", placeholder: "placeholder" }, outputs: { closePopover: "closePopover", onRefocusInput: "onRefocusInput" }, viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true, read: ViewContainerRef }, { propertyName: "dateCalendar", first: true, predicate: CaCustomDateTimePickersDateCalendarsComponent, descendants: true }, { propertyName: "pmAmScroll", first: true, predicate: ["pmAmScroll"], descendants: true }, { propertyName: "minutesScroll", first: true, predicate: ["minutesScroll"], descendants: true }, { propertyName: "hourScroll", first: true, predicate: ["hourScroll"], descendants: true }], ngImport: i0, template: "<div\n class=\"temp_inp_holder\"\n (pointerdown)=\"refocusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n>\n <div>\n <div class=\"pickers_holder dark_picker\">\n @if (calendarMainType === \"date\") {\n <div class=\"date_picker\">\n <cai-custom-datetime-pickers-date-calendars\n [listPreview]=\"listPreview\"\n [dateTime]=\"dateTime\"\n [isMonthAndYearOnly]=\"_inputConfig.name === 'datepickerBankCard'\"\n (setListPreviewValue)=\"setListPreview($event)\"\n (onRefocusInput)=\"refocusInput($event)\"\n ></cai-custom-datetime-pickers-date-calendars>\n </div>\n }\n @if (calendarMainType === \"time\") {\n <div class=\"time_picker\" [class.time_picker_24h]=\"isTwentyFourHour\">\n <div class=\"time_picker_head d-flex\">\n <div class=\"selected_time ta-font-bold\">\n {{\n selectedTime ||\n (dateTime | date: (isTwentyFourHour ? \"HH:mm\" : \"hh:mm aa\"))\n }}\n </div>\n <div class=\"sel_now ta-font-bold\" (click)=\"setDefaultTime($event)\">\n Default\n </div>\n </div>\n <div class=\"time_picker_body\">\n <div class=\"picker_body_head\">\n <div\n class=\"ta-font-bold\"\n [class.active]=\"hoveredItem === 'hours'\"\n >\n Hour\n </div>\n <div\n class=\"ta-font-bold\"\n [class.active]=\"hoveredItem === 'minutes'\"\n >\n Minute\n </div>\n @if (!isTwentyFourHour) {\n <div\n class=\"ta-font-bold\"\n [class.active]=\"hoveredItem === 'times'\"\n >\n AM/PM\n </div>\n }\n </div>\n <div class=\"picker_body\">\n <div\n #hourScroll\n (mouseout)=\"hoveredItem = null\"\n (mouseover)=\"hoveredItem = 'hours'\"\n (scroll)=\"onScroll($event, 'hourScroll')\"\n class=\"scroll_pickers\"\n [tabindex]=\"-1\"\n >\n @for (hour of hourTimes; let indx = $index; track indx) {\n <div\n class=\"scroll_item ta-font-medium\"\n [ngClass]=\"{\n 'active_item ta-font-bold':\n scrollTypes.hourScroll === indx,\n }\"\n (click)=\"onScroll($event, 'hourScroll', indx)\"\n >\n {{ hour }}\n </div>\n }\n </div>\n <div\n #minutesScroll\n (mouseout)=\"hoveredItem = null\"\n (mouseover)=\"hoveredItem = 'minutes'\"\n (scroll)=\"onScroll($event, 'minutesScroll')\"\n class=\"scroll_pickers\"\n [tabindex]=\"-1\"\n >\n @for (minutes of timeMinutes; let indx = $index; track indx) {\n <div\n class=\"scroll_item ta-font-medium\"\n [ngClass]=\"{\n 'active_item ta-font-bold':\n scrollTypes.minutesScroll === indx,\n }\"\n (click)=\"onScroll($event, 'minutesScroll', indx)\"\n >\n {{ minutes }}\n </div>\n }\n </div>\n @if (!isTwentyFourHour) {\n <div\n #pmAmScroll\n (mouseout)=\"hoveredItem = null\"\n (mouseover)=\"hoveredItem = 'times'\"\n (scroll)=\"onScroll($event, 'pmAmScroll')\"\n class=\"scroll_pickers\"\n [tabindex]=\"-1\"\n >\n @for (when of timeOfDay; let indx = $index; track indx) {\n <div\n class=\"scroll_item ta-font-medium\"\n [ngClass]=\"{\n 'active_item ta-font-bold':\n scrollTypes.pmAmScroll === indx,\n }\"\n (click)=\"onScroll($event, 'pmAmScroll', indx)\"\n >\n {{ when }}\n </div>\n }\n </div>\n }\n <div class=\"picker_line\">\n <span class=\"border_line\"></span>\n @if (!isTwentyFourHour) {\n <span class=\"border_line line_2\"></span>\n }\n </div>\n </div>\n <div class=\"picker_buttons\">\n <div\n (click)=\"closePopup($event)\"\n class=\"pick_button ta-font-bold\"\n >\n Cancel\n </div>\n <div\n (click)=\"setTime($event)\"\n class=\"pick_button set_button ta-font-bold\"\n >\n Set\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CaCustomDateTimePickersDateCalendarsComponent, selector: "cai-custom-datetime-pickers-date-calendars", inputs: ["listPreview", "dateTime", "isMonthAndYearOnly"], outputs: ["setListPreviewValue", "onRefocusInput"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
|
|
7699
7972
|
}
|
|
7700
7973
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: CaCustomDatetimePickersComponent, decorators: [{
|
|
7701
7974
|
type: Component,
|
|
@@ -7703,7 +7976,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
7703
7976
|
CommonModule,
|
|
7704
7977
|
FormsModule,
|
|
7705
7978
|
CaCustomDateTimePickersDateCalendarsComponent,
|
|
7706
|
-
], template: "<div\n class=\"temp_inp_holder\"\n (pointerdown)=\"refocusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n>\n <div>\n <div class=\"pickers_holder dark_picker\">\n @if (calendarMainType === \"date\") {\n <div class=\"date_picker\">\n <cai-custom-datetime-pickers-date-calendars\n [listPreview]=\"listPreview\"\n [dateTime]=\"dateTime\"\n [isMonthAndYearOnly]=\"_inputConfig.name === 'datepickerBankCard'\"\n (setListPreviewValue)=\"setListPreview($event)\"\n (onRefocusInput)=\"refocusInput($event)\"\n ></cai-custom-datetime-pickers-date-calendars>\n </div>\n }\n @if (calendarMainType === \"time\") {\n <div class=\"time_picker\">\n <div class=\"time_picker_head d-flex\">\n <div class=\"selected_time ta-font-bold\">\n {{
|
|
7979
|
+
], template: "<div\n class=\"temp_inp_holder\"\n (pointerdown)=\"refocusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n>\n <div>\n <div class=\"pickers_holder dark_picker\">\n @if (calendarMainType === \"date\") {\n <div class=\"date_picker\">\n <cai-custom-datetime-pickers-date-calendars\n [listPreview]=\"listPreview\"\n [dateTime]=\"dateTime\"\n [isMonthAndYearOnly]=\"_inputConfig.name === 'datepickerBankCard'\"\n (setListPreviewValue)=\"setListPreview($event)\"\n (onRefocusInput)=\"refocusInput($event)\"\n ></cai-custom-datetime-pickers-date-calendars>\n </div>\n }\n @if (calendarMainType === \"time\") {\n <div class=\"time_picker\" [class.time_picker_24h]=\"isTwentyFourHour\">\n <div class=\"time_picker_head d-flex\">\n <div class=\"selected_time ta-font-bold\">\n {{\n selectedTime ||\n (dateTime | date: (isTwentyFourHour ? \"HH:mm\" : \"hh:mm aa\"))\n }}\n </div>\n <div class=\"sel_now ta-font-bold\" (click)=\"setDefaultTime($event)\">\n Default\n </div>\n </div>\n <div class=\"time_picker_body\">\n <div class=\"picker_body_head\">\n <div\n class=\"ta-font-bold\"\n [class.active]=\"hoveredItem === 'hours'\"\n >\n Hour\n </div>\n <div\n class=\"ta-font-bold\"\n [class.active]=\"hoveredItem === 'minutes'\"\n >\n Minute\n </div>\n @if (!isTwentyFourHour) {\n <div\n class=\"ta-font-bold\"\n [class.active]=\"hoveredItem === 'times'\"\n >\n AM/PM\n </div>\n }\n </div>\n <div class=\"picker_body\">\n <div\n #hourScroll\n (mouseout)=\"hoveredItem = null\"\n (mouseover)=\"hoveredItem = 'hours'\"\n (scroll)=\"onScroll($event, 'hourScroll')\"\n class=\"scroll_pickers\"\n [tabindex]=\"-1\"\n >\n @for (hour of hourTimes; let indx = $index; track indx) {\n <div\n class=\"scroll_item ta-font-medium\"\n [ngClass]=\"{\n 'active_item ta-font-bold':\n scrollTypes.hourScroll === indx,\n }\"\n (click)=\"onScroll($event, 'hourScroll', indx)\"\n >\n {{ hour }}\n </div>\n }\n </div>\n <div\n #minutesScroll\n (mouseout)=\"hoveredItem = null\"\n (mouseover)=\"hoveredItem = 'minutes'\"\n (scroll)=\"onScroll($event, 'minutesScroll')\"\n class=\"scroll_pickers\"\n [tabindex]=\"-1\"\n >\n @for (minutes of timeMinutes; let indx = $index; track indx) {\n <div\n class=\"scroll_item ta-font-medium\"\n [ngClass]=\"{\n 'active_item ta-font-bold':\n scrollTypes.minutesScroll === indx,\n }\"\n (click)=\"onScroll($event, 'minutesScroll', indx)\"\n >\n {{ minutes }}\n </div>\n }\n </div>\n @if (!isTwentyFourHour) {\n <div\n #pmAmScroll\n (mouseout)=\"hoveredItem = null\"\n (mouseover)=\"hoveredItem = 'times'\"\n (scroll)=\"onScroll($event, 'pmAmScroll')\"\n class=\"scroll_pickers\"\n [tabindex]=\"-1\"\n >\n @for (when of timeOfDay; let indx = $index; track indx) {\n <div\n class=\"scroll_item ta-font-medium\"\n [ngClass]=\"{\n 'active_item ta-font-bold':\n scrollTypes.pmAmScroll === indx,\n }\"\n (click)=\"onScroll($event, 'pmAmScroll', indx)\"\n >\n {{ when }}\n </div>\n }\n </div>\n }\n <div class=\"picker_line\">\n <span class=\"border_line\"></span>\n @if (!isTwentyFourHour) {\n <span class=\"border_line line_2\"></span>\n }\n </div>\n </div>\n <div class=\"picker_buttons\">\n <div\n (click)=\"closePopup($event)\"\n class=\"pick_button ta-font-bold\"\n >\n Cancel\n </div>\n <div\n (click)=\"setTime($event)\"\n class=\"pick_button set_button ta-font-bold\"\n >\n Set\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n" }]
|
|
7707
7980
|
}], ctorParameters: () => [{ type: CalendarDateTimePickerService }], propDecorators: { dateTime: [{
|
|
7708
7981
|
type: Input
|
|
7709
7982
|
}], ref: [{
|
|
@@ -7743,94 +8016,101 @@ var InputConfigNameStringEnum;
|
|
|
7743
8016
|
})(InputConfigNameStringEnum || (InputConfigNameStringEnum = {}));
|
|
7744
8017
|
|
|
7745
8018
|
class InputDatetimeDateInputHelper {
|
|
7746
|
-
static
|
|
7747
|
-
|
|
8019
|
+
static getPlaceholders(format) {
|
|
8020
|
+
return [
|
|
8021
|
+
DATE_PART_PLACEHOLDERS[format.parts[0]],
|
|
8022
|
+
DATE_PART_PLACEHOLDERS[format.parts[1]],
|
|
8023
|
+
DATE_PART_PLACEHOLDERS[format.parts[2]],
|
|
8024
|
+
];
|
|
8025
|
+
}
|
|
7748
8026
|
static isValidDatePartIndex(highlightedPart) {
|
|
7749
8027
|
return (highlightedPart === 0 || highlightedPart === 1 || highlightedPart === 2);
|
|
7750
8028
|
}
|
|
7751
|
-
static getNormalizedDatePart(part,
|
|
7752
|
-
const placeholder = this.DATE_PLACEHOLDERS[index];
|
|
7753
|
-
const maxLength = this.DATE_PART_LENGTHS[index];
|
|
8029
|
+
static getNormalizedDatePart(part, placeholder) {
|
|
7754
8030
|
if (!part)
|
|
7755
8031
|
return placeholder;
|
|
7756
|
-
const trimmed = part.slice(0,
|
|
8032
|
+
const trimmed = part.slice(0, placeholder.length);
|
|
7757
8033
|
return trimmed + placeholder.slice(trimmed.length);
|
|
7758
8034
|
}
|
|
7759
|
-
static parseDateParts(currentValue) {
|
|
8035
|
+
static parseDateParts(currentValue, format) {
|
|
8036
|
+
const placeholders = this.getPlaceholders(format);
|
|
7760
8037
|
if (!currentValue) {
|
|
7761
|
-
return
|
|
8038
|
+
return placeholders;
|
|
7762
8039
|
}
|
|
7763
|
-
const
|
|
8040
|
+
const parts = currentValue.split(format.separator);
|
|
7764
8041
|
return [
|
|
7765
|
-
this.getNormalizedDatePart(
|
|
7766
|
-
this.getNormalizedDatePart(
|
|
7767
|
-
this.getNormalizedDatePart(
|
|
8042
|
+
this.getNormalizedDatePart(parts[0], placeholders[0]),
|
|
8043
|
+
this.getNormalizedDatePart(parts[1], placeholders[1]),
|
|
8044
|
+
this.getNormalizedDatePart(parts[2], placeholders[2]),
|
|
7768
8045
|
];
|
|
7769
8046
|
}
|
|
7770
|
-
static
|
|
7771
|
-
|
|
7772
|
-
|
|
7773
|
-
static finalizeDatePart(part, partIndex) {
|
|
8047
|
+
static finalizeDatePart(part, partIndex, format) {
|
|
8048
|
+
const partType = format.parts[partIndex];
|
|
8049
|
+
const placeholder = DATE_PART_PLACEHOLDERS[partType];
|
|
7774
8050
|
const digits = part.replace(/\D/g, '');
|
|
7775
8051
|
if (!digits) {
|
|
7776
|
-
return
|
|
8052
|
+
return placeholder;
|
|
7777
8053
|
}
|
|
7778
|
-
if (
|
|
8054
|
+
if (partType === 'month') {
|
|
7779
8055
|
if (digits === '0') {
|
|
7780
|
-
return this.getNormalizedDatePart(part,
|
|
8056
|
+
return this.getNormalizedDatePart(part, placeholder);
|
|
7781
8057
|
}
|
|
7782
8058
|
const clampedMonth = Math.min(Math.max(Number(digits), 1), 12);
|
|
7783
8059
|
return String(clampedMonth).padStart(2, '0');
|
|
7784
8060
|
}
|
|
7785
|
-
if (
|
|
8061
|
+
if (partType === 'day') {
|
|
7786
8062
|
if (digits === '0') {
|
|
7787
|
-
return this.getNormalizedDatePart(part,
|
|
8063
|
+
return this.getNormalizedDatePart(part, placeholder);
|
|
7788
8064
|
}
|
|
7789
8065
|
const clampedDay = Math.min(Math.max(Number(digits), 1), 31);
|
|
7790
8066
|
return String(clampedDay).padStart(2, '0');
|
|
7791
8067
|
}
|
|
7792
|
-
|
|
8068
|
+
if (partType === 'shortYear') {
|
|
8069
|
+
return digits.slice(-2).padStart(2, '0');
|
|
8070
|
+
}
|
|
8071
|
+
// A one or two digit year is taken as a year of the current century.
|
|
8072
|
+
return digits.length <= 2
|
|
8073
|
+
? String(2000 + Number(digits))
|
|
8074
|
+
: this.getNormalizedDatePart(part, placeholder);
|
|
7793
8075
|
}
|
|
7794
|
-
static normalizeEmptyDateValue(parts) {
|
|
7795
|
-
const
|
|
7796
|
-
|
|
7797
|
-
|
|
7798
|
-
return isCompletelyEmpty ? null : this.composeDateValue(parts);
|
|
8076
|
+
static normalizeEmptyDateValue(parts, format) {
|
|
8077
|
+
const placeholders = this.getPlaceholders(format);
|
|
8078
|
+
const isCompletelyEmpty = parts.every((part, index) => part === placeholders[index]);
|
|
8079
|
+
return isCompletelyEmpty ? null : parts.join(format.separator);
|
|
7799
8080
|
}
|
|
7800
|
-
static formatDatePartOnNavigation(currentValue, highlightedPart) {
|
|
8081
|
+
static formatDatePartOnNavigation(currentValue, highlightedPart, dateFormat) {
|
|
7801
8082
|
if (!this.isValidDatePartIndex(highlightedPart)) {
|
|
7802
8083
|
return currentValue;
|
|
7803
8084
|
}
|
|
7804
|
-
const
|
|
7805
|
-
nextValueParts
|
|
7806
|
-
this.
|
|
7807
|
-
|
|
7808
|
-
|
|
7809
|
-
|
|
7810
|
-
|
|
7811
|
-
const
|
|
7812
|
-
const
|
|
7813
|
-
|
|
7814
|
-
|
|
8085
|
+
const format = getDateFormatPattern(dateFormat);
|
|
8086
|
+
const nextValueParts = this.parseDateParts(currentValue, format);
|
|
8087
|
+
nextValueParts[highlightedPart] = this.finalizeDatePart(nextValueParts[highlightedPart], highlightedPart, format);
|
|
8088
|
+
this.enforceDayLimitByMonth(nextValueParts, format);
|
|
8089
|
+
return this.normalizeEmptyDateValue(nextValueParts, format);
|
|
8090
|
+
}
|
|
8091
|
+
static buildDatePartFromDigits(digits, partIndex, format) {
|
|
8092
|
+
const partType = format.parts[partIndex];
|
|
8093
|
+
const placeholder = DATE_PART_PLACEHOLDERS[partType];
|
|
8094
|
+
const slicedDigits = digits.slice(0, placeholder.length);
|
|
8095
|
+
if (slicedDigits.length === placeholder.length) {
|
|
8096
|
+
if (partType === 'month') {
|
|
7815
8097
|
const clampedMonth = Math.min(Number(slicedDigits), 12);
|
|
7816
8098
|
return String(clampedMonth).padStart(2, '0');
|
|
7817
8099
|
}
|
|
7818
|
-
if (
|
|
8100
|
+
if (partType === 'day') {
|
|
7819
8101
|
const clampedDay = Math.min(Number(slicedDigits), 31);
|
|
7820
8102
|
return String(clampedDay).padStart(2, '0');
|
|
7821
8103
|
}
|
|
7822
8104
|
}
|
|
7823
8105
|
return slicedDigits + placeholder.slice(slicedDigits.length);
|
|
7824
8106
|
}
|
|
7825
|
-
static isDatePartFull(part
|
|
7826
|
-
return
|
|
8107
|
+
static isDatePartFull(part) {
|
|
8108
|
+
return /^\d+$/.test(part);
|
|
7827
8109
|
}
|
|
7828
|
-
static getDatePartEnteredLength(part,
|
|
7829
|
-
const
|
|
7830
|
-
const maxLength = this.DATE_PART_LENGTHS[partIndex];
|
|
7831
|
-
const normalizedPart = this.getNormalizedDatePart(part, partIndex);
|
|
8110
|
+
static getDatePartEnteredLength(part, placeholder) {
|
|
8111
|
+
const normalizedPart = this.getNormalizedDatePart(part, placeholder);
|
|
7832
8112
|
let enteredLength = 0;
|
|
7833
|
-
for (let i = 0; i <
|
|
8113
|
+
for (let i = 0; i < placeholder.length; i += 1) {
|
|
7834
8114
|
if (normalizedPart[i] === placeholder[i])
|
|
7835
8115
|
break;
|
|
7836
8116
|
enteredLength += 1;
|
|
@@ -7859,25 +8139,26 @@ class InputDatetimeDateInputHelper {
|
|
|
7859
8139
|
return 31;
|
|
7860
8140
|
}
|
|
7861
8141
|
}
|
|
7862
|
-
static enforceDayLimitByMonth(parts) {
|
|
7863
|
-
const
|
|
7864
|
-
const
|
|
7865
|
-
const
|
|
7866
|
-
|
|
7867
|
-
|
|
8142
|
+
static enforceDayLimitByMonth(parts, format) {
|
|
8143
|
+
const dayIndex = format.parts.indexOf('day');
|
|
8144
|
+
const monthPart = parts[format.parts.indexOf('month')];
|
|
8145
|
+
const dayPart = parts[dayIndex];
|
|
8146
|
+
const isShortYear = format.parts.includes('shortYear');
|
|
8147
|
+
const yearPart = parts[format.parts.indexOf(isShortYear ? 'shortYear' : 'year')];
|
|
8148
|
+
if (!this.isDatePartFull(monthPart) || !this.isDatePartFull(dayPart)) {
|
|
7868
8149
|
return;
|
|
7869
8150
|
}
|
|
7870
8151
|
const month = Number(monthPart);
|
|
7871
8152
|
const day = Number(dayPart);
|
|
7872
|
-
const resolvedYear = this.isDatePartFull(yearPart
|
|
7873
|
-
?
|
|
8153
|
+
const resolvedYear = this.isDatePartFull(yearPart)
|
|
8154
|
+
? Number(yearPart) + (isShortYear ? 2000 : 0)
|
|
7874
8155
|
: undefined;
|
|
7875
8156
|
const monthMaxDay = this.getMonthMaxDay(month, resolvedYear);
|
|
7876
8157
|
if (day > monthMaxDay) {
|
|
7877
|
-
parts[
|
|
8158
|
+
parts[dayIndex] = String(monthMaxDay).padStart(2, '0');
|
|
7878
8159
|
}
|
|
7879
8160
|
}
|
|
7880
|
-
static handleDateDigitInput(currentValue, nextValueParts, highlightedPart, insertedCharacter) {
|
|
8161
|
+
static handleDateDigitInput(currentValue, nextValueParts, highlightedPart, insertedCharacter, format) {
|
|
7881
8162
|
const isSingleDigit = /^\d$/.test(insertedCharacter);
|
|
7882
8163
|
if (!isSingleDigit) {
|
|
7883
8164
|
return {
|
|
@@ -7885,31 +8166,32 @@ class InputDatetimeDateInputHelper {
|
|
|
7885
8166
|
nextHighlightedPart: highlightedPart,
|
|
7886
8167
|
};
|
|
7887
8168
|
}
|
|
7888
|
-
const isPartAlreadyFull = this.isDatePartFull(nextValueParts[highlightedPart]
|
|
8169
|
+
const isPartAlreadyFull = this.isDatePartFull(nextValueParts[highlightedPart]);
|
|
7889
8170
|
if (isPartAlreadyFull) {
|
|
7890
|
-
nextValueParts[highlightedPart] = this.buildDatePartFromDigits(insertedCharacter, highlightedPart);
|
|
7891
|
-
this.enforceDayLimitByMonth(nextValueParts);
|
|
8171
|
+
nextValueParts[highlightedPart] = this.buildDatePartFromDigits(insertedCharacter, highlightedPart, format);
|
|
8172
|
+
this.enforceDayLimitByMonth(nextValueParts, format);
|
|
7892
8173
|
return {
|
|
7893
|
-
nextValue: this.normalizeEmptyDateValue(nextValueParts),
|
|
8174
|
+
nextValue: this.normalizeEmptyDateValue(nextValueParts, format),
|
|
7894
8175
|
nextHighlightedPart: highlightedPart,
|
|
7895
8176
|
};
|
|
7896
8177
|
}
|
|
7897
8178
|
const existingDigits = nextValueParts[highlightedPart].replace(/\D/g, '');
|
|
7898
8179
|
const nextDigits = `${existingDigits}${insertedCharacter}`;
|
|
7899
|
-
nextValueParts[highlightedPart] = this.buildDatePartFromDigits(nextDigits, highlightedPart);
|
|
7900
|
-
this.enforceDayLimitByMonth(nextValueParts);
|
|
7901
|
-
const didFillCurrentPart = nextDigits.length >=
|
|
8180
|
+
nextValueParts[highlightedPart] = this.buildDatePartFromDigits(nextDigits, highlightedPart, format);
|
|
8181
|
+
this.enforceDayLimitByMonth(nextValueParts, format);
|
|
8182
|
+
const didFillCurrentPart = nextDigits.length >=
|
|
8183
|
+
DATE_PART_PLACEHOLDERS[format.parts[highlightedPart]].length;
|
|
7902
8184
|
const nextHighlightedPart = didFillCurrentPart
|
|
7903
8185
|
? highlightedPart === 2
|
|
7904
8186
|
? null
|
|
7905
8187
|
: highlightedPart + 1
|
|
7906
8188
|
: highlightedPart;
|
|
7907
8189
|
return {
|
|
7908
|
-
nextValue: this.normalizeEmptyDateValue(nextValueParts),
|
|
8190
|
+
nextValue: this.normalizeEmptyDateValue(nextValueParts, format),
|
|
7909
8191
|
nextHighlightedPart,
|
|
7910
8192
|
};
|
|
7911
8193
|
}
|
|
7912
|
-
static handleDateInput(currentValue, event, highlightedPart) {
|
|
8194
|
+
static handleDateInput(currentValue, event, highlightedPart, dateFormat) {
|
|
7913
8195
|
const inputEvent = event;
|
|
7914
8196
|
const inputType = inputEvent.inputType ?? '';
|
|
7915
8197
|
const insertedCharacter = inputEvent.data ?? '';
|
|
@@ -7948,39 +8230,41 @@ class InputDatetimeDateInputHelper {
|
|
|
7948
8230
|
nextHighlightedPart: effectiveHighlightedPart,
|
|
7949
8231
|
};
|
|
7950
8232
|
}
|
|
7951
|
-
const
|
|
8233
|
+
const format = getDateFormatPattern(dateFormat);
|
|
8234
|
+
const placeholders = this.getPlaceholders(format);
|
|
8235
|
+
const nextValueParts = this.parseDateParts(currentValue, format);
|
|
7952
8236
|
if (isWordBackwardDelete) {
|
|
7953
|
-
const currentEnteredLength = this.getDatePartEnteredLength(nextValueParts[effectiveHighlightedPart], effectiveHighlightedPart);
|
|
8237
|
+
const currentEnteredLength = this.getDatePartEnteredLength(nextValueParts[effectiveHighlightedPart], placeholders[effectiveHighlightedPart]);
|
|
7954
8238
|
const targetPart = currentEnteredLength === 0 && effectiveHighlightedPart > 0
|
|
7955
8239
|
? (effectiveHighlightedPart - 1)
|
|
7956
8240
|
: effectiveHighlightedPart;
|
|
7957
|
-
nextValueParts[targetPart] =
|
|
8241
|
+
nextValueParts[targetPart] = placeholders[targetPart];
|
|
7958
8242
|
return {
|
|
7959
|
-
nextValue: this.normalizeEmptyDateValue(nextValueParts),
|
|
8243
|
+
nextValue: this.normalizeEmptyDateValue(nextValueParts, format),
|
|
7960
8244
|
nextHighlightedPart: targetPart,
|
|
7961
8245
|
};
|
|
7962
8246
|
}
|
|
7963
8247
|
if (isBackwardContentDelete) {
|
|
7964
8248
|
const currentPart = nextValueParts[effectiveHighlightedPart];
|
|
7965
|
-
const enteredLength = this.getDatePartEnteredLength(currentPart, effectiveHighlightedPart);
|
|
8249
|
+
const enteredLength = this.getDatePartEnteredLength(currentPart, placeholders[effectiveHighlightedPart]);
|
|
7966
8250
|
if (enteredLength > 0) {
|
|
7967
8251
|
const nextDigits = currentPart.slice(0, enteredLength - 1);
|
|
7968
|
-
nextValueParts[effectiveHighlightedPart] = this.buildDatePartFromDigits(nextDigits, effectiveHighlightedPart);
|
|
8252
|
+
nextValueParts[effectiveHighlightedPart] = this.buildDatePartFromDigits(nextDigits, effectiveHighlightedPart, format);
|
|
7969
8253
|
return {
|
|
7970
|
-
nextValue: this.normalizeEmptyDateValue(nextValueParts),
|
|
8254
|
+
nextValue: this.normalizeEmptyDateValue(nextValueParts, format),
|
|
7971
8255
|
// Keep focus on current part even when deleting its final digit.
|
|
7972
8256
|
// A second backspace (when empty) will move focus backward.
|
|
7973
8257
|
nextHighlightedPart: effectiveHighlightedPart,
|
|
7974
8258
|
};
|
|
7975
8259
|
}
|
|
7976
8260
|
return {
|
|
7977
|
-
nextValue: this.normalizeEmptyDateValue(nextValueParts),
|
|
8261
|
+
nextValue: this.normalizeEmptyDateValue(nextValueParts, format),
|
|
7978
8262
|
nextHighlightedPart: effectiveHighlightedPart > 0
|
|
7979
8263
|
? (effectiveHighlightedPart - 1)
|
|
7980
8264
|
: 0,
|
|
7981
8265
|
};
|
|
7982
8266
|
}
|
|
7983
|
-
return this.handleDateDigitInput(currentValue, nextValueParts, effectiveHighlightedPart, insertedCharacter);
|
|
8267
|
+
return this.handleDateDigitInput(currentValue, nextValueParts, effectiveHighlightedPart, insertedCharacter, format);
|
|
7984
8268
|
}
|
|
7985
8269
|
}
|
|
7986
8270
|
|
|
@@ -8010,14 +8294,23 @@ class InputDatetimeTimeInputHelper {
|
|
|
8010
8294
|
this.getNormalizedTimePart(ampmPart, 2),
|
|
8011
8295
|
];
|
|
8012
8296
|
}
|
|
8013
|
-
|
|
8014
|
-
|
|
8297
|
+
// The 24-hour clock has no AM/PM part, so its last part is the minutes.
|
|
8298
|
+
static getLastTimePartIndex(timeFormat) {
|
|
8299
|
+
return timeFormat === 'TwentyFourHour' ? 1 : 2;
|
|
8300
|
+
}
|
|
8301
|
+
static composeTimeValue(parts, timeFormat) {
|
|
8302
|
+
return timeFormat === 'TwentyFourHour'
|
|
8303
|
+
? `${parts[0]}:${parts[1]}`
|
|
8304
|
+
: `${parts[0]}:${parts[1]} ${parts[2]}`;
|
|
8015
8305
|
}
|
|
8016
|
-
static normalizeEmptyTimeValue(parts) {
|
|
8306
|
+
static normalizeEmptyTimeValue(parts, timeFormat) {
|
|
8017
8307
|
const isCompletelyEmpty = parts[0] === this.TIME_PLACEHOLDERS[0] &&
|
|
8018
8308
|
parts[1] === this.TIME_PLACEHOLDERS[1] &&
|
|
8019
|
-
|
|
8020
|
-
|
|
8309
|
+
(timeFormat === 'TwentyFourHour' ||
|
|
8310
|
+
parts[2] === this.TIME_PLACEHOLDERS[2]);
|
|
8311
|
+
return isCompletelyEmpty
|
|
8312
|
+
? null
|
|
8313
|
+
: this.composeTimeValue(parts, timeFormat);
|
|
8021
8314
|
}
|
|
8022
8315
|
static buildTimePartFromInput(input, partIndex) {
|
|
8023
8316
|
const maxLength = this.TIME_PART_LENGTHS[partIndex];
|
|
@@ -8057,7 +8350,7 @@ class InputDatetimeTimeInputHelper {
|
|
|
8057
8350
|
}
|
|
8058
8351
|
return { hour12: String(normalizedHour).padStart(2, '0'), meridiem: 'AM' };
|
|
8059
8352
|
}
|
|
8060
|
-
static handleTimeDigitInput(currentValue, nextValueParts, highlightedPart, insertedCharacter) {
|
|
8353
|
+
static handleTimeDigitInput(currentValue, nextValueParts, highlightedPart, insertedCharacter, timeFormat) {
|
|
8061
8354
|
const isSingleDigit = /^\d$/.test(insertedCharacter);
|
|
8062
8355
|
if (!isSingleDigit) {
|
|
8063
8356
|
return {
|
|
@@ -8082,34 +8375,39 @@ class InputDatetimeTimeInputHelper {
|
|
|
8082
8375
|
if (nextDigits.length < this.TIME_PART_LENGTHS[0]) {
|
|
8083
8376
|
nextValueParts[0] = this.buildTimePartFromInput(nextDigits, 0);
|
|
8084
8377
|
return {
|
|
8085
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8378
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8086
8379
|
nextHighlightedPart: 0,
|
|
8087
8380
|
};
|
|
8088
8381
|
}
|
|
8089
8382
|
const clampedHour = this.clamp(Number(nextDigits), 0, 23);
|
|
8090
|
-
|
|
8091
|
-
|
|
8092
|
-
|
|
8383
|
+
if (timeFormat === 'TwentyFourHour') {
|
|
8384
|
+
nextValueParts[0] = String(clampedHour).padStart(2, '0');
|
|
8385
|
+
}
|
|
8386
|
+
else {
|
|
8387
|
+
const { hour12, meridiem } = this.to12HourAndMeridiem(clampedHour, nextValueParts[2]);
|
|
8388
|
+
nextValueParts[0] = hour12;
|
|
8389
|
+
nextValueParts[2] = meridiem;
|
|
8390
|
+
}
|
|
8093
8391
|
return {
|
|
8094
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8392
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8095
8393
|
nextHighlightedPart: 1,
|
|
8096
8394
|
};
|
|
8097
8395
|
}
|
|
8098
8396
|
if (nextDigits.length < this.TIME_PART_LENGTHS[1]) {
|
|
8099
8397
|
nextValueParts[1] = this.buildTimePartFromInput(nextDigits, 1);
|
|
8100
8398
|
return {
|
|
8101
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8399
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8102
8400
|
nextHighlightedPart: 1,
|
|
8103
8401
|
};
|
|
8104
8402
|
}
|
|
8105
8403
|
const clampedMinute = this.clamp(Number(nextDigits), 0, 59);
|
|
8106
8404
|
nextValueParts[1] = String(clampedMinute).padStart(2, '0');
|
|
8107
8405
|
return {
|
|
8108
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8109
|
-
nextHighlightedPart: 2,
|
|
8406
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8407
|
+
nextHighlightedPart: timeFormat === 'TwentyFourHour' ? null : 2,
|
|
8110
8408
|
};
|
|
8111
8409
|
}
|
|
8112
|
-
static handleTimeInput(currentValue, event, highlightedPart) {
|
|
8410
|
+
static handleTimeInput(currentValue, event, highlightedPart, timeFormat = DEFAULT_TIME_FORMAT) {
|
|
8113
8411
|
const inputEvent = event;
|
|
8114
8412
|
const inputType = inputEvent.inputType ?? '';
|
|
8115
8413
|
const insertedCharacter = inputEvent.data ?? '';
|
|
@@ -8134,7 +8432,7 @@ class InputDatetimeTimeInputHelper {
|
|
|
8134
8432
|
effectiveHighlightedPart === null) {
|
|
8135
8433
|
return {
|
|
8136
8434
|
nextValue: currentValue,
|
|
8137
|
-
nextHighlightedPart:
|
|
8435
|
+
nextHighlightedPart: this.getLastTimePartIndex(timeFormat),
|
|
8138
8436
|
};
|
|
8139
8437
|
}
|
|
8140
8438
|
if (!this.isValidTimePartIndex(effectiveHighlightedPart)) {
|
|
@@ -8151,7 +8449,7 @@ class InputDatetimeTimeInputHelper {
|
|
|
8151
8449
|
: effectiveHighlightedPart;
|
|
8152
8450
|
nextValueParts[targetPart] = this.TIME_PLACEHOLDERS[targetPart];
|
|
8153
8451
|
return {
|
|
8154
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8452
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8155
8453
|
nextHighlightedPart: targetPart,
|
|
8156
8454
|
};
|
|
8157
8455
|
}
|
|
@@ -8162,14 +8460,14 @@ class InputDatetimeTimeInputHelper {
|
|
|
8162
8460
|
const nextInput = currentPart.slice(0, enteredLength - 1);
|
|
8163
8461
|
nextValueParts[effectiveHighlightedPart] = this.buildTimePartFromInput(nextInput, effectiveHighlightedPart);
|
|
8164
8462
|
return {
|
|
8165
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8463
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8166
8464
|
// Keep focus on current part when deleting its final character.
|
|
8167
8465
|
// A second backspace (while empty) then moves focus backward.
|
|
8168
8466
|
nextHighlightedPart: effectiveHighlightedPart,
|
|
8169
8467
|
};
|
|
8170
8468
|
}
|
|
8171
8469
|
return {
|
|
8172
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8470
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8173
8471
|
nextHighlightedPart: effectiveHighlightedPart > 0
|
|
8174
8472
|
? (effectiveHighlightedPart - 1)
|
|
8175
8473
|
: 0,
|
|
@@ -8180,7 +8478,7 @@ class InputDatetimeTimeInputHelper {
|
|
|
8180
8478
|
if (uppercaseCharacter === 'A' || uppercaseCharacter === 'P') {
|
|
8181
8479
|
nextValueParts[2] = uppercaseCharacter === 'A' ? 'AM' : 'PM';
|
|
8182
8480
|
return {
|
|
8183
|
-
nextValue: this.normalizeEmptyTimeValue(nextValueParts),
|
|
8481
|
+
nextValue: this.normalizeEmptyTimeValue(nextValueParts, timeFormat),
|
|
8184
8482
|
nextHighlightedPart: null,
|
|
8185
8483
|
};
|
|
8186
8484
|
}
|
|
@@ -8189,15 +8487,19 @@ class InputDatetimeTimeInputHelper {
|
|
|
8189
8487
|
nextHighlightedPart: effectiveHighlightedPart,
|
|
8190
8488
|
};
|
|
8191
8489
|
}
|
|
8192
|
-
return this.handleTimeDigitInput(currentValue, nextValueParts, effectiveHighlightedPart, insertedCharacter);
|
|
8490
|
+
return this.handleTimeDigitInput(currentValue, nextValueParts, effectiveHighlightedPart, insertedCharacter, timeFormat);
|
|
8193
8491
|
}
|
|
8194
8492
|
}
|
|
8195
8493
|
|
|
8196
8494
|
class InputDatetimeFormatHelper {
|
|
8197
8495
|
static MIN_VALID_YEAR = 1900;
|
|
8198
|
-
static
|
|
8199
|
-
const
|
|
8200
|
-
return
|
|
8496
|
+
static getDateMomentFormat(dateFormat) {
|
|
8497
|
+
const { parts, separator } = getDateFormatPattern(dateFormat);
|
|
8498
|
+
return parts.map((part) => DATE_PART_PLACEHOLDERS[part]).join(separator);
|
|
8499
|
+
}
|
|
8500
|
+
static isDateControlValueValid(value, dateFormat) {
|
|
8501
|
+
return (typeof value === 'string' &&
|
|
8502
|
+
this.parseDateControlValue(value, dateFormat) !== null);
|
|
8201
8503
|
}
|
|
8202
8504
|
static isTimeControlValueValid(value) {
|
|
8203
8505
|
if (typeof value !== 'string') {
|
|
@@ -8205,7 +8507,13 @@ class InputDatetimeFormatHelper {
|
|
|
8205
8507
|
}
|
|
8206
8508
|
return this.parseTimeControlValue(value) !== null;
|
|
8207
8509
|
}
|
|
8208
|
-
static parseDateControlValue(value) {
|
|
8510
|
+
static parseDateControlValue(value, dateFormat) {
|
|
8511
|
+
const parsedDate = moment(value.trim(), this.getDateMomentFormat(dateFormat), true);
|
|
8512
|
+
return parsedDate.isValid() && parsedDate.year() >= this.MIN_VALID_YEAR
|
|
8513
|
+
? this.buildLocalDate(parsedDate)
|
|
8514
|
+
: null;
|
|
8515
|
+
}
|
|
8516
|
+
static parseDateFormValue(value) {
|
|
8209
8517
|
const dateFormats = [
|
|
8210
8518
|
'MM/DD/YY',
|
|
8211
8519
|
'M/D/YY',
|
|
@@ -8237,14 +8545,15 @@ class InputDatetimeFormatHelper {
|
|
|
8237
8545
|
normalizedDate.setHours(12, 0, 0, 0);
|
|
8238
8546
|
return normalizedDate;
|
|
8239
8547
|
}
|
|
8240
|
-
static handleInput(currentValue, event, highlightedPart, isDatePicker) {
|
|
8548
|
+
static handleInput(currentValue, event, highlightedPart, isDatePicker, dateFormat, timeFormat = DEFAULT_TIME_FORMAT) {
|
|
8241
8549
|
if (isDatePicker) {
|
|
8242
|
-
return InputDatetimeDateInputHelper.handleDateInput(currentValue, event, highlightedPart);
|
|
8550
|
+
return InputDatetimeDateInputHelper.handleDateInput(currentValue, event, highlightedPart, dateFormat);
|
|
8243
8551
|
}
|
|
8244
8552
|
else {
|
|
8245
|
-
return InputDatetimeTimeInputHelper.handleTimeInput(currentValue, event, highlightedPart);
|
|
8553
|
+
return InputDatetimeTimeInputHelper.handleTimeInput(currentValue, event, highlightedPart, timeFormat);
|
|
8246
8554
|
}
|
|
8247
8555
|
}
|
|
8556
|
+
// Parses a form value (canonical formats), not the text shown in the input.
|
|
8248
8557
|
static toDate(value, isDatePicker) {
|
|
8249
8558
|
if (value instanceof Date && !Number.isNaN(value.getTime())) {
|
|
8250
8559
|
return value;
|
|
@@ -8256,58 +8565,65 @@ class InputDatetimeFormatHelper {
|
|
|
8256
8565
|
}
|
|
8257
8566
|
if (typeof value === 'string') {
|
|
8258
8567
|
const parsedDate = isDatePicker
|
|
8259
|
-
? this.
|
|
8568
|
+
? this.parseDateFormValue(value)
|
|
8260
8569
|
: this.parseTimeControlValue(value);
|
|
8261
8570
|
if (parsedDate)
|
|
8262
8571
|
return parsedDate;
|
|
8263
8572
|
}
|
|
8264
8573
|
return null;
|
|
8265
8574
|
}
|
|
8266
|
-
|
|
8575
|
+
// Parses the text shown in the input, which follows the date format.
|
|
8576
|
+
static parseControlValue(value, isDatePicker, dateFormat) {
|
|
8577
|
+
if (!value)
|
|
8578
|
+
return null;
|
|
8579
|
+
return isDatePicker
|
|
8580
|
+
? this.parseDateControlValue(value, dateFormat)
|
|
8581
|
+
: this.parseTimeControlValue(value);
|
|
8582
|
+
}
|
|
8583
|
+
static isControlValueValid(value, isDatePicker, dateFormat) {
|
|
8267
8584
|
if (value === null || value === undefined || value === '') {
|
|
8268
8585
|
return true;
|
|
8269
8586
|
}
|
|
8270
8587
|
return isDatePicker
|
|
8271
|
-
? this.isDateControlValueValid(value)
|
|
8588
|
+
? this.isDateControlValueValid(value, dateFormat)
|
|
8272
8589
|
: this.isTimeControlValueValid(value);
|
|
8273
8590
|
}
|
|
8274
|
-
static toControlValue(date, isDatePicker) {
|
|
8591
|
+
static toControlValue(date, isDatePicker, dateFormat, timeFormat = DEFAULT_TIME_FORMAT) {
|
|
8275
8592
|
return isDatePicker
|
|
8276
|
-
? moment(date).format(
|
|
8277
|
-
: moment(date).format(
|
|
8593
|
+
? moment(date).format(this.getDateMomentFormat(dateFormat))
|
|
8594
|
+
: moment(date).format(TIME_FORMAT_PATTERNS[timeFormat]);
|
|
8278
8595
|
}
|
|
8279
8596
|
static toFormValue(date, isDatePicker) {
|
|
8280
8597
|
return isDatePicker
|
|
8281
8598
|
? moment(date).format('MM/DD/YY')
|
|
8282
8599
|
: moment(date).format('HH:mm');
|
|
8283
8600
|
}
|
|
8284
|
-
static toCurrentValue(value, isDatePicker) {
|
|
8601
|
+
static toCurrentValue(value, isDatePicker, dateFormat, timeFormat = DEFAULT_TIME_FORMAT) {
|
|
8285
8602
|
const dateValue = this.toDate(value, isDatePicker);
|
|
8286
8603
|
if (!dateValue)
|
|
8287
8604
|
return null;
|
|
8288
|
-
return this.toControlValue(dateValue, isDatePicker);
|
|
8605
|
+
return this.toControlValue(dateValue, isDatePicker, dateFormat, timeFormat);
|
|
8606
|
+
}
|
|
8607
|
+
// Date parts in the order of the date format, each padded with its placeholder.
|
|
8608
|
+
static getDisplayedDateParts(value, dateFormat) {
|
|
8609
|
+
const format = getDateFormatPattern(dateFormat);
|
|
8610
|
+
return InputDatetimeDateInputHelper.parseDateParts(value, format).map((part, index) => ({
|
|
8611
|
+
type: format.parts[index],
|
|
8612
|
+
value: part,
|
|
8613
|
+
placeholder: DATE_PART_PLACEHOLDERS[format.parts[index]],
|
|
8614
|
+
}));
|
|
8289
8615
|
}
|
|
8290
|
-
static getDisplayedValues(value
|
|
8616
|
+
static getDisplayedValues(value) {
|
|
8291
8617
|
let displayedValues = {
|
|
8292
|
-
month: 'MM',
|
|
8293
|
-
day: 'DD',
|
|
8294
|
-
year: 'YY',
|
|
8295
8618
|
minute: 'MM',
|
|
8296
8619
|
hour: 'HH',
|
|
8297
8620
|
ampm: 'AM',
|
|
8298
8621
|
};
|
|
8299
8622
|
if (!value)
|
|
8300
8623
|
return displayedValues;
|
|
8301
|
-
|
|
8302
|
-
|
|
8303
|
-
|
|
8304
|
-
displayedValues.year = value?.slice(6, 8) ?? 'YY';
|
|
8305
|
-
}
|
|
8306
|
-
else {
|
|
8307
|
-
displayedValues.hour = value?.slice(0, 2) ?? 'HH';
|
|
8308
|
-
displayedValues.minute = value?.slice(3, 5) ?? 'MM';
|
|
8309
|
-
displayedValues.ampm = value?.slice(6, 8) ?? 'AM';
|
|
8310
|
-
}
|
|
8624
|
+
displayedValues.hour = value?.slice(0, 2) ?? 'HH';
|
|
8625
|
+
displayedValues.minute = value?.slice(3, 5) ?? 'MM';
|
|
8626
|
+
displayedValues.ampm = value?.slice(6, 8) ?? 'AM';
|
|
8311
8627
|
return displayedValues;
|
|
8312
8628
|
}
|
|
8313
8629
|
}
|
|
@@ -8320,31 +8636,42 @@ class InputDatetimePasteHelper {
|
|
|
8320
8636
|
normalizedDate.setHours(12, 0, 0, 0);
|
|
8321
8637
|
return normalizedDate;
|
|
8322
8638
|
}
|
|
8323
|
-
static parseDateInput(rawValue) {
|
|
8639
|
+
static parseDateInput(rawValue, dateFormat) {
|
|
8324
8640
|
const normalizedValue = rawValue.trim();
|
|
8325
8641
|
if (!normalizedValue)
|
|
8326
8642
|
return null;
|
|
8643
|
+
// Ambiguous dates (02/10/2026) are read in the order of the date format.
|
|
8644
|
+
const { parts } = getDateFormatPattern(dateFormat);
|
|
8645
|
+
const isDayFirst = parts.indexOf('day') < parts.indexOf('month');
|
|
8646
|
+
const [padded, unpadded] = isDayFirst
|
|
8647
|
+
? [
|
|
8648
|
+
['DD', 'MM'],
|
|
8649
|
+
['D', 'M'],
|
|
8650
|
+
]
|
|
8651
|
+
: [
|
|
8652
|
+
['MM', 'DD'],
|
|
8653
|
+
['M', 'D'],
|
|
8654
|
+
];
|
|
8655
|
+
const compactFormat = `${padded.join('')}YYYY`;
|
|
8327
8656
|
const compactDigits = normalizedValue.replace(/\D/g, '');
|
|
8328
8657
|
const dateFormats = [
|
|
8329
|
-
'
|
|
8330
|
-
|
|
8331
|
-
|
|
8332
|
-
|
|
8333
|
-
'MM.DD.YYYY',
|
|
8334
|
-
'M.D.YYYY',
|
|
8658
|
+
...['/', '-', '.'].flatMap((separator) => [
|
|
8659
|
+
`${padded.join(separator)}${separator}YYYY`,
|
|
8660
|
+
`${unpadded.join(separator)}${separator}YYYY`,
|
|
8661
|
+
]),
|
|
8335
8662
|
'YYYY-MM-DD',
|
|
8336
8663
|
'YYYY/M/D',
|
|
8337
8664
|
'YYYY.MM.DD',
|
|
8338
|
-
'
|
|
8339
|
-
'
|
|
8665
|
+
`${padded.join('/')}/YY`,
|
|
8666
|
+
`${unpadded.join('/')}/YY`,
|
|
8340
8667
|
'YYYYMMDD',
|
|
8341
|
-
|
|
8668
|
+
compactFormat,
|
|
8342
8669
|
];
|
|
8343
8670
|
const candidates = [];
|
|
8344
8671
|
candidates.push(moment(normalizedValue, dateFormats, true));
|
|
8345
8672
|
if (/^\d{8}$/.test(compactDigits)) {
|
|
8346
8673
|
candidates.push(moment(compactDigits, 'YYYYMMDD', true));
|
|
8347
|
-
candidates.push(moment(compactDigits,
|
|
8674
|
+
candidates.push(moment(compactDigits, compactFormat, true));
|
|
8348
8675
|
}
|
|
8349
8676
|
candidates.push(moment(normalizedValue, moment.ISO_8601, true));
|
|
8350
8677
|
const validCandidate = candidates.find((candidate) => candidate.isValid() && candidate.year() >= this.MIN_VALID_YEAR);
|
|
@@ -8380,9 +8707,9 @@ class InputDatetimePasteHelper {
|
|
|
8380
8707
|
const now = new Date();
|
|
8381
8708
|
return new Date(now.getFullYear(), now.getMonth(), now.getDate(), validCandidate.hour(), validCandidate.minute(), 0, 0);
|
|
8382
8709
|
}
|
|
8383
|
-
static parsePastedValue(rawValue, isDatePicker) {
|
|
8710
|
+
static parsePastedValue(rawValue, isDatePicker, dateFormat) {
|
|
8384
8711
|
return isDatePicker
|
|
8385
|
-
? this.parseDateInput(rawValue)
|
|
8712
|
+
? this.parseDateInput(rawValue, dateFormat)
|
|
8386
8713
|
: this.parseTimeInput(rawValue);
|
|
8387
8714
|
}
|
|
8388
8715
|
}
|
|
@@ -8413,21 +8740,30 @@ class CaiInputDatetimePickerComponent {
|
|
|
8413
8740
|
currentValue = signal(null, ...(ngDevMode ? [{ debugName: "currentValue" }] : []));
|
|
8414
8741
|
isFocusedThroughPopoverToggle = signal(false, ...(ngDevMode ? [{ debugName: "isFocusedThroughPopoverToggle" }] : []));
|
|
8415
8742
|
isInputSelected = signal(false, ...(ngDevMode ? [{ debugName: "isInputSelected" }] : []));
|
|
8743
|
+
dateFormat = signal(undefined, ...(ngDevMode ? [{ debugName: "dateFormat" }] : []));
|
|
8744
|
+
timeFormat = signal(DEFAULT_TIME_FORMAT, ...(ngDevMode ? [{ debugName: "timeFormat" }] : []));
|
|
8745
|
+
isTwentyFourHour = computed(() => this.timeFormat() === 'TwentyFourHour', ...(ngDevMode ? [{ debugName: "isTwentyFourHour" }] : []));
|
|
8746
|
+
// The 24-hour clock has no AM/PM part.
|
|
8747
|
+
lastPartIndex = computed(() => !this.isDatePicker() && this.isTwentyFourHour() ? 1 : 2, ...(ngDevMode ? [{ debugName: "lastPartIndex" }] : []));
|
|
8416
8748
|
displayedValues = computed(() => {
|
|
8417
|
-
return (InputDatetimeFormatHelper.getDisplayedValues(this.currentValue()
|
|
8749
|
+
return (InputDatetimeFormatHelper.getDisplayedValues(this.currentValue()) ?? []);
|
|
8418
8750
|
}, ...(ngDevMode ? [{ debugName: "displayedValues" }] : []));
|
|
8751
|
+
displayedDateParts = computed(() => InputDatetimeFormatHelper.getDisplayedDateParts(this.currentValue(), this.dateFormat()), ...(ngDevMode ? [{ debugName: "displayedDateParts" }] : []));
|
|
8752
|
+
dateSeparator = computed(() => getDateFormatPattern(this.dateFormat()).separator, ...(ngDevMode ? [{ debugName: "dateSeparator" }] : []));
|
|
8419
8753
|
hasDate = computed(() => {
|
|
8420
8754
|
const currentValue = this.currentValue();
|
|
8421
8755
|
if (!currentValue)
|
|
8422
8756
|
return false;
|
|
8423
8757
|
return this.isDatePicker()
|
|
8424
|
-
? /^\d
|
|
8425
|
-
:
|
|
8758
|
+
? this.displayedDateParts().every((part) => /^\d+$/.test(part.value))
|
|
8759
|
+
: (this.isTwentyFourHour()
|
|
8760
|
+
? /^\d{2}:\d{2}$/
|
|
8761
|
+
: /^\d{2}:\d{2}\s(?:AM|PM)$/).test(currentValue);
|
|
8426
8762
|
}, ...(ngDevMode ? [{ debugName: "hasDate" }] : []));
|
|
8427
8763
|
hasInternalValidationError = computed(() => {
|
|
8428
8764
|
const currentValue = this.currentValue();
|
|
8429
8765
|
return Boolean(currentValue &&
|
|
8430
|
-
!InputDatetimeFormatHelper.isControlValueValid(currentValue, this.isDatePicker()));
|
|
8766
|
+
!InputDatetimeFormatHelper.isControlValueValid(currentValue, this.isDatePicker(), this.dateFormat()));
|
|
8431
8767
|
}, ...(ngDevMode ? [{ debugName: "hasInternalValidationError" }] : []));
|
|
8432
8768
|
shouldShowInternalValidationError = computed(() => {
|
|
8433
8769
|
const control = this.getSuperControl;
|
|
@@ -8448,6 +8784,20 @@ class CaiInputDatetimePickerComponent {
|
|
|
8448
8784
|
constructor() {
|
|
8449
8785
|
this.initializeDateChangedListener();
|
|
8450
8786
|
}
|
|
8787
|
+
ngOnChanges(changes) {
|
|
8788
|
+
if (!changes['inputConfig'])
|
|
8789
|
+
return;
|
|
8790
|
+
const dateFormat = this.inputConfig?.dateFormat;
|
|
8791
|
+
const timeFormat = this.inputConfig?.timeFormat ?? DEFAULT_TIME_FORMAT;
|
|
8792
|
+
if (dateFormat === this.dateFormat() && timeFormat === this.timeFormat()) {
|
|
8793
|
+
return;
|
|
8794
|
+
}
|
|
8795
|
+
// The displayed text follows the format, so it is rebuilt from the date.
|
|
8796
|
+
const parsedDate = this.parseControlValue(this.currentValue());
|
|
8797
|
+
this.dateFormat.set(dateFormat);
|
|
8798
|
+
this.timeFormat.set(timeFormat);
|
|
8799
|
+
this.currentValue.set(parsedDate ? this.toControlValue(parsedDate) : null);
|
|
8800
|
+
}
|
|
8451
8801
|
ngOnInit() {
|
|
8452
8802
|
this.superControl = this.injector.get(NgControl, null);
|
|
8453
8803
|
if (this.superControl) {
|
|
@@ -8456,10 +8806,8 @@ class CaiInputDatetimePickerComponent {
|
|
|
8456
8806
|
}
|
|
8457
8807
|
registerDateChange(date) {
|
|
8458
8808
|
this.dateTime.set(date);
|
|
8459
|
-
|
|
8460
|
-
|
|
8461
|
-
this.currentValue.set(nextCurrentValue);
|
|
8462
|
-
this.onChange(InputDatetimeFormatHelper.toFormValue(date, isDatePicker));
|
|
8809
|
+
this.currentValue.set(this.toControlValue(date));
|
|
8810
|
+
this.onChange(InputDatetimeFormatHelper.toFormValue(date, this.isDatePicker()));
|
|
8463
8811
|
}
|
|
8464
8812
|
initializeDateChangedListener() {
|
|
8465
8813
|
// Date-picker changes (day/month/year selection) come from calendarService.dateChanged.
|
|
@@ -8478,13 +8826,17 @@ class CaiInputDatetimePickerComponent {
|
|
|
8478
8826
|
toDate(value) {
|
|
8479
8827
|
return InputDatetimeFormatHelper.toDate(value, this.isDatePicker());
|
|
8480
8828
|
}
|
|
8829
|
+
parseControlValue(value) {
|
|
8830
|
+
return InputDatetimeFormatHelper.parseControlValue(value, this.isDatePicker(), this.dateFormat());
|
|
8831
|
+
}
|
|
8832
|
+
toControlValue(date) {
|
|
8833
|
+
return InputDatetimeFormatHelper.toControlValue(date, this.isDatePicker(), this.dateFormat(), this.timeFormat());
|
|
8834
|
+
}
|
|
8481
8835
|
moveHighlightedPartRight() {
|
|
8482
8836
|
if (this.isDatePicker()) {
|
|
8483
|
-
const nextCurrentValue = InputDatetimeDateInputHelper.formatDatePartOnNavigation(this.currentValue(), this.highlightedPart());
|
|
8837
|
+
const nextCurrentValue = InputDatetimeDateInputHelper.formatDatePartOnNavigation(this.currentValue(), this.highlightedPart(), this.dateFormat());
|
|
8484
8838
|
this.currentValue.set(nextCurrentValue);
|
|
8485
|
-
const parsedDate = nextCurrentValue
|
|
8486
|
-
? this.toDate(nextCurrentValue)
|
|
8487
|
-
: null;
|
|
8839
|
+
const parsedDate = this.parseControlValue(nextCurrentValue);
|
|
8488
8840
|
if (parsedDate) {
|
|
8489
8841
|
this.dateTime.set(parsedDate);
|
|
8490
8842
|
this.onChange(InputDatetimeFormatHelper.toFormValue(parsedDate, true));
|
|
@@ -8497,7 +8849,7 @@ class CaiInputDatetimePickerComponent {
|
|
|
8497
8849
|
this.highlightedPart.set(0);
|
|
8498
8850
|
return;
|
|
8499
8851
|
}
|
|
8500
|
-
if (this.highlightedPart() ===
|
|
8852
|
+
if (this.highlightedPart() === this.lastPartIndex()) {
|
|
8501
8853
|
this.highlightedPart.set(0);
|
|
8502
8854
|
return;
|
|
8503
8855
|
}
|
|
@@ -8509,7 +8861,7 @@ class CaiInputDatetimePickerComponent {
|
|
|
8509
8861
|
return;
|
|
8510
8862
|
}
|
|
8511
8863
|
if (this.highlightedPart() === 0) {
|
|
8512
|
-
this.highlightedPart.set(
|
|
8864
|
+
this.highlightedPart.set(this.lastPartIndex());
|
|
8513
8865
|
return;
|
|
8514
8866
|
}
|
|
8515
8867
|
this.highlightedPart.set((this.highlightedPart() ?? 2) - 1);
|
|
@@ -8553,9 +8905,7 @@ class CaiInputDatetimePickerComponent {
|
|
|
8553
8905
|
}
|
|
8554
8906
|
writeValue(value) {
|
|
8555
8907
|
const parsedDate = this.toDate(value);
|
|
8556
|
-
this.currentValue.set(parsedDate
|
|
8557
|
-
? InputDatetimeFormatHelper.toControlValue(parsedDate, this.isDatePicker())
|
|
8558
|
-
: null);
|
|
8908
|
+
this.currentValue.set(parsedDate ? this.toControlValue(parsedDate) : null);
|
|
8559
8909
|
this.dateTime.set(parsedDate ?? new Date());
|
|
8560
8910
|
}
|
|
8561
8911
|
clearInput(event) {
|
|
@@ -8632,9 +8982,9 @@ class CaiInputDatetimePickerComponent {
|
|
|
8632
8982
|
this.isInputSelected.set(false);
|
|
8633
8983
|
this.highlightedPart.set(0);
|
|
8634
8984
|
}
|
|
8635
|
-
const { nextValue, nextHighlightedPart } = InputDatetimeFormatHelper.handleInput(this.currentValue(), event, this.highlightedPart() ?? null, this.isDatePicker());
|
|
8985
|
+
const { nextValue, nextHighlightedPart } = InputDatetimeFormatHelper.handleInput(this.currentValue(), event, this.highlightedPart() ?? null, this.isDatePicker(), this.dateFormat(), this.timeFormat());
|
|
8636
8986
|
this.currentValue.set(nextValue);
|
|
8637
|
-
const parsedDate =
|
|
8987
|
+
const parsedDate = this.parseControlValue(nextValue);
|
|
8638
8988
|
if (parsedDate) {
|
|
8639
8989
|
this.dateTime.set(parsedDate);
|
|
8640
8990
|
}
|
|
@@ -8663,12 +9013,12 @@ class CaiInputDatetimePickerComponent {
|
|
|
8663
9013
|
event.stopPropagation();
|
|
8664
9014
|
const pastedText = event.clipboardData?.getData('text') ?? '';
|
|
8665
9015
|
const isDatePicker = this.isDatePicker();
|
|
8666
|
-
const parsedDate = InputDatetimePasteHelper.parsePastedValue(pastedText, isDatePicker);
|
|
9016
|
+
const parsedDate = InputDatetimePasteHelper.parsePastedValue(pastedText, isDatePicker, this.dateFormat());
|
|
8667
9017
|
if (!parsedDate) {
|
|
8668
9018
|
return;
|
|
8669
9019
|
}
|
|
8670
9020
|
this.dateTime.set(parsedDate);
|
|
8671
|
-
this.currentValue.set(
|
|
9021
|
+
this.currentValue.set(this.toControlValue(parsedDate));
|
|
8672
9022
|
this.highlightedPart.set(null);
|
|
8673
9023
|
this.mainPopover.close();
|
|
8674
9024
|
requestAnimationFrame(() => {
|
|
@@ -8758,7 +9108,7 @@ class CaiInputDatetimePickerComponent {
|
|
|
8758
9108
|
this.clearButtonTooltip.close();
|
|
8759
9109
|
}
|
|
8760
9110
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: CaiInputDatetimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8761
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: CaiInputDatetimePickerComponent, isStandalone: true, selector: "cai-input-datetime-picker, ca-date-time", inputs: { id: "id", inputConfig: "inputConfig", forceInvalidStyling: "forceInvalidStyling" }, outputs: { clearInputEvent: "clear", blurInputEvent: "blurInput", onFocusEmitter: "onFocusEmitter" }, providers: [CalendarDateTimePickerService], viewQueries: [{ propertyName: "inputListener", first: true, predicate: ["inputListener"], descendants: true }, { propertyName: "mainPopover", first: true, predicate: ["mainPopover"], descendants: true }, { propertyName: "clearButtonTooltip", first: true, predicate: ["clearButtonTooltip"], descendants: true }, { propertyName: "iconContainer", first: true, predicate: ["iconContainer"], descendants: true, read: ElementRef }, { propertyName: "dropdownIcon", first: true, predicate: ["dropdownIcon"], descendants: true, read: ElementRef }], ngImport: i0, template: "@let inTable = inputConfig?.inTable; @let inverse = inputConfig?.inverse;\n@let size = inputConfig?.size;\n@let invalid =\n (getSuperControl?.invalid &&\n (getSuperControl?.touched || getSuperControl?.dirty)) ||\n shouldShowInternalValidationError();\n@let valid = getSuperControl?.valid && getSuperControl?.value;\n@let disabled = getSuperControl?.disabled || inputConfig?.isDisabled;\n@let isBilling = inputConfig?.isBilling;\n@let showClear = !disabled && !inputConfig.hideClear;\n@let hasFloatingError = inTable && invalid;\n\n<div\n [id]=\"id\"\n class=\"datetime-input-container\"\n [class]=\"{\n 'datetime-valid': valid && !forceInvalidStyling,\n 'datetime-invalid': invalid || forceInvalidStyling,\n 'datetime-disabled': disabled,\n 'datetime-focus': isInputFocused(),\n 'datetime-has-text': !!currentValue(),\n 'datetime-has-date': hasDate(),\n 'datetime-required': isRequired && !disabled,\n 'datetime-in-table': inTable,\n 'datetime-inverse': inverse,\n 'datetime-billing': isBilling,\n 'datetime-popover-open': mainPopover.isOpen(),\n 'datetime-size-22': size === 22,\n 'datetime-icon-hidden': inputConfig.isIconHidden,\n 'force-invalid': forceInvalidStyling,\n }\"\n #mainPopover=\"ngbPopover\"\n [ngbPopover]=\"!disabled ? dateTimePopover : null\"\n [placement]=\"['bottom-start', 'top-start']\"\n [triggers]=\"'manual'\"\n [popoverClass]=\"'datetimepopovermain'\"\n [autoClose]=\"'outside'\"\n [container]=\"'body'\"\n (mouseenter)=\"hasFloatingError && errorTooltipContainer.open()\"\n (mouseleave)=\"hasFloatingError && errorTooltipContainer.close()\"\n (pointerdown)=\"focusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (dblclick)=\"onInputSelect($event)\"\n>\n <div class=\"datetime-label\">\n {{ inputConfig.label }}\n </div>\n\n <input\n #inputListener\n [id]=\"id\"\n [value]=\"currentValue() ?? ''\"\n [tabindex]=\"disabled ? '-1' : '0'\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"onInputChange($event)\"\n (paste)=\"onInputPaste($event)\"\n class=\"datetime-input-listener\"\n #errorTooltipContainer=\"ngbTooltip\"\n [disabled]=\"disabled\"\n [ngbTooltip]=\"hasFloatingError ? errorTooltip : null\"\n [container]=\"'body'\"\n [placement]=\"'bottom'\"\n [triggers]=\"'manual'\"\n [disableTooltip]=\"isInputFocused()\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip\"\n />\n\n @if (!inputConfig.isIconHidden) {\n <div\n #iconContainer\n class=\"datetime-icon-container\"\n (click)=\"togglePopover()\"\n >\n <svg-icon\n class=\"datetime-icon\"\n [name]=\"\n inputConfig.placeholderIcon === 'date' ? 'cai-date' : 'cai-time'\n \"\n ></svg-icon>\n <div class=\"datetime-separator\"></div>\n </div>\n }\n\n <div class=\"datetime-input\" [class.selected]=\"isInputSelected()\">\n @if (isDatePicker()) {\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 0\"\n [class.filled]=\"displayedValues().month !== 'MM'\"\n (pointerdown)=\"highlightPart($event, 0)\"\n >{{ displayedValues().month }}</span\n >\n <span class=\"datetime-input-separator\">/</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 1\"\n [class.filled]=\"displayedValues().day !== 'DD'\"\n (pointerdown)=\"highlightPart($event, 1)\"\n >{{ displayedValues().day }}</span\n >\n <span class=\"datetime-input-separator\">/</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 2\"\n [class.filled]=\"displayedValues().year !== 'YY'\"\n (pointerdown)=\"highlightPart($event, 2)\"\n >{{ displayedValues().year }}</span\n >\n } @else {\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 0\"\n [class.filled]=\"displayedValues().hour !== 'HH'\"\n (pointerdown)=\"highlightPart($event, 0)\"\n >{{ displayedValues().hour }}</span\n >\n <span class=\"datetime-input-separator\">:</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 1\"\n [class.filled]=\"displayedValues().minute !== 'MM'\"\n (pointerdown)=\"highlightPart($event, 1)\"\n >{{ displayedValues().minute }}</span\n >\n <span\n class=\"datetime-input-part time-am-pm\"\n [class.highlighted]=\"highlightedPart() === 2\"\n (pointerdown)=\"highlightPart($event, 2)\"\n >{{ displayedValues().ampm }}</span\n >\n }\n </div>\n\n @if (!disabled) {\n @let tooltipClass =\n inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n @if (showClear) {\n <button\n class=\"datetime-cancel-button\"\n type=\"button\"\n tabindex=\"-1\"\n ngbTooltip=\"Clear\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #clearButtonTooltip=\"ngbTooltip\"\n (click)=\"clearInput($event)\"\n (pointerdown)=\"closeClearButtonTooltip()\"\n (mouseleave)=\"closeClearButtonTooltip()\"\n >\n <svg-icon class=\"datetime-bg-icon\" name=\"cai-cancel\"></svg-icon>\n </button>\n }\n <svg-icon\n #dropdownIcon\n class=\"datetime-icon datetime-dropdown-icon\"\n (click)=\"togglePopover()\"\n name=\"cai-arrow-secondary-down\"\n ></svg-icon>\n }\n <!-- Error Message -->\n @if (!inTable || isBilling) {\n <div class=\"datetime-error-message\">\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : invalid\n ? (getSuperControl?.errors\n | errorMessage: inputConfig.customErrors)[0]\n : \"\"\n }}\n </div>\n }\n</div>\n\n<!-- Popover for DateTime Pickers -->\n<ng-template #dateTimePopover let-data=\"data\">\n <div\n class=\"datetime-dropdown-holder\"\n [class.datetime-has-stroke]=\"inputConfig.hasStroke\"\n >\n <cai-custom-datetime-pickers\n [calendarType]=\"isDatePicker() ? 'date' : 'time'\"\n [inputConfig]=\"inputConfig\"\n [placeholder]=\"'MM/DD/YY'\"\n [dateTime]=\"dateTime()\"\n (closePopover)=\"onPopoverDateChanged($event)\"\n ></cai-custom-datetime-pickers>\n </div>\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (inTable && invalid && !isInputFocused()) {\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : (getSuperControl?.errors | errorMessage: inputConfig.customErrors)[0]\n }}\n }\n</ng-template>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.datetime-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;padding:4px 4px 4px 6px;border-radius:2px;position:relative;display:flex;align-items:center;touch-action:manipulation;background-color:var(--color-surface-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);cursor:text;width:100%;height:26px}.datetime-input-container.datetime-inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #2f2f2f;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-icon{color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-separator{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-bg-icon:hover{background-color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-icon:hover{color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input{color:var(--color-text-inverse)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-part{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-separator{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.filled{color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#91919133;color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-separator{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-inverse.datetime-valid .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-inverse.datetime-valid.datetime-focus .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid.datetime-focus .datetime-input{color:var(--color-text)}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-bg-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-bg-icon:hover{background-color:#fff!important}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-icon:hover{color:#fff!important}.datetime-input-container.datetime-in-table{--color-surface-neutral: transparent;--color-surface-negative: transparent;--color-surface-positive: transparent}.datetime-input-container.datetime-in-table .datetime-dropdown-icon{opacity:0}.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-input,.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-label{color:var(--color-text-negative)}.datetime-input-container.datetime-in-table:hover .datetime-dropdown-icon,.datetime-input-container.datetime-in-table.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-input-container:hover{background-color:var(--color-surface-neutral-hover)}.datetime-input-container:hover .datetime-bg-icon{color:var(--color-surface-neutral-hover)}.datetime-input-container.datetime-focus{background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-focus:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-focus.datetime-billing .datetime-label{color:#fff!important}.datetime-input-container.datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-input{color:var(--color-text-inverse);opacity:1;pointer-events:auto}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part{height:18px;color:#ffffffb3}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.filled{color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#ffffff4d;color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-separator{color:#ffffffb3}.datetime-input-container.datetime-popover-open .datetime-dropdown-icon{transform:rotateX(180deg)}.datetime-input-container.datetime-has-text .datetime-input{opacity:1;pointer-events:auto!important}.datetime-input-container.datetime-has-text.datetime-disabled .datetime-input{pointer-events:none!important}.datetime-input-container.datetime-has-text:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-has-text.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-valid:not(.datetime-disabled){background-color:var(--color-surface-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover{background-color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#0b49d1}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus{background-color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon:hover{color:#0b49d1}.datetime-input-container.datetime-invalid:not(.datetime-disabled){background-color:var(--color-surface-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-error-message{opacity:1;transform:translateY(0)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover{background-color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#c20c0c}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover.datetime-has-text .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date{background-color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-separator,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-cancel-button,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date){background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-error-message{opacity:0}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon:hover{color:#c20c0c}.datetime-input-container.datetime-disabled{cursor:default;pointer-events:none}.datetime-input-container.datetime-disabled .datetime-icon,.datetime-input-container.datetime-disabled .datetime-dropdown-icon{cursor:default}.datetime-input-container.datetime-disabled:not(.datetime-in-table){background-color:var(--color-surface-disable)}.datetime-input-container.datetime-disabled.datetime-in-table{background-color:transparent}.datetime-input-container.datetime-disabled .datetime-label{color:var(--color-text-subtle)!important}.datetime-input-container.datetime-disabled .datetime-icon{color:var(--color-icon-disable)}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-label{color:var(--color-text-neutral)!important}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-icon{color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-separator{background-color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-required .datetime-label:after{content:\" *\";color:var(--color-text-negative)}.datetime-icon-container{display:flex;align-items:center;justify-content:center;gap:4px;width:max-content}.datetime-icon-container.hidden{display:none}.datetime-icon-container .datetime-icon{order:1;cursor:pointer}.datetime-icon-container .datetime-separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s ease-in-out;opacity:40%;order:2;margin-right:4px}.datetime-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:var(--color-icon-neutral);transition:color .1s ease-in-out,opacity .1s ease-in-out,transform .15s ease-in-out}.datetime-label{position:absolute;display:flex;gap:4px;left:27px;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.datetime-icon-hidden .datetime-label{left:0}.datetime-bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s ease-in-out,color .1s ease-in-out,opacity .1s ease-in-out,transform .1s ease-in-out;transform-box:border-box;transform-origin:center;will-change:transform}.datetime-bg-icon:focus-visible{outline:none}.datetime-bg-icon svg{transition:transform .1s ease-in-out}.datetime-bg-icon:hover{transform:scale(1.2222222222)}.datetime-bg-icon:hover svg{transform:scale(.8181818182)}.datetime-bg-icon:active{transform:scale(1)}.datetime-cancel-button{position:absolute;right:26px;top:4px;opacity:0;transition:opacity .1s ease-in-out;pointer-events:none}.datetime-dropdown-icon{position:absolute;right:4px;top:4px;transform:rotateX(0);cursor:pointer}.datetime-size-22{height:22px!important;padding-left:0}.datetime-size-22 .datetime-bg-icon{height:14px!important;width:14px!important;padding:2px!important;right:22px!important}.datetime-size-22 .datetime-icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.datetime-size-22 .datetime-input{padding-top:2px;padding-bottom:2px}.datetime-size-22 .datetime-label{padding-top:2px;padding-bottom:2px;padding-left:0!important}.datetime-size-22 .datetime-icon{height:14px!important;width:14px!important}.datetime-size-22.datetime-has-text .datetime-label,.datetime-size-22.datetime-focus .datetime-label{transform:translateY(-18px)!important}.datetime-error-message{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;transition:opacity .1s ease-in-out,transform .1s ease-in-out;color:var(--color-text-negative);transform:translateY(-10px);pointer-events:none}.datetime-input-listener{opacity:0;pointer-events:none;position:absolute;inset:0;font-size:16px}.datetime-billing .datetime-separator{order:0;margin-right:0;margin-left:4px}.datetime-billing .datetime-cancel-button{right:4px}.datetime-billing .datetime-label{left:0;font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-billing .datetime-icon-container{order:2}.datetime-billing .datetime-input{margin-left:auto;width:max-content}.datetime-billing .datetime-error-message{bottom:4px!important;right:32px!important;transform:translateY(0)!important}.datetime-billing.datetime-focus .datetime-error-message,.datetime-billing.datetime-has-text .datetime-error-message{opacity:0!important}.datetime-billing .datetime-dropdown-icon,.datetime-billing:hover .datetime-icon,.datetime-billing.datetime-focus .datetime-icon{opacity:0}.datetime-billing:hover .datetime-dropdown-icon,.datetime-billing.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-billing.datetime-has-text .datetime-dropdown-icon{opacity:0!important;pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container{pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container .datetime-icon,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container .datetime-icon{opacity:0!important}.datetime-input{font-size:14px;line-height:18px;font-weight:400;width:100%;opacity:0;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);-webkit-user-select:none;user-select:none}.datetime-input .datetime-input-separator{background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part{position:relative;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part.time-am-pm{margin-left:4px}.datetime-input .datetime-input-part:after{content:\"\";inset:0 -3px;position:absolute}.datetime-input.selected .datetime-input-part,.datetime-input.selected .datetime-input-separator{background-color:#ffffff4d}.datetime-input.selected .time-am-pm{margin-left:0!important;padding-left:4px!important}\n"], dependencies: [{ kind: "ngmodule", type:
|
|
9111
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: CaiInputDatetimePickerComponent, isStandalone: true, selector: "cai-input-datetime-picker, ca-date-time", inputs: { id: "id", inputConfig: "inputConfig", forceInvalidStyling: "forceInvalidStyling" }, outputs: { clearInputEvent: "clear", blurInputEvent: "blurInput", onFocusEmitter: "onFocusEmitter" }, providers: [CalendarDateTimePickerService], viewQueries: [{ propertyName: "inputListener", first: true, predicate: ["inputListener"], descendants: true }, { propertyName: "mainPopover", first: true, predicate: ["mainPopover"], descendants: true }, { propertyName: "clearButtonTooltip", first: true, predicate: ["clearButtonTooltip"], descendants: true }, { propertyName: "iconContainer", first: true, predicate: ["iconContainer"], descendants: true, read: ElementRef }, { propertyName: "dropdownIcon", first: true, predicate: ["dropdownIcon"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "@let inTable = inputConfig?.inTable; @let inverse = inputConfig?.inverse;\n@let size = inputConfig?.size;\n@let invalid =\n (getSuperControl?.invalid &&\n (getSuperControl?.touched || getSuperControl?.dirty)) ||\n shouldShowInternalValidationError();\n@let valid = getSuperControl?.valid && getSuperControl?.value;\n@let disabled = getSuperControl?.disabled || inputConfig?.isDisabled;\n@let isBilling = inputConfig?.isBilling;\n@let showClear = !disabled && !inputConfig.hideClear;\n@let hasFloatingError = inTable && invalid;\n\n<div\n [id]=\"id\"\n class=\"datetime-input-container\"\n [class]=\"{\n 'datetime-valid': valid && !forceInvalidStyling,\n 'datetime-invalid': invalid || forceInvalidStyling,\n 'datetime-disabled': disabled,\n 'datetime-focus': isInputFocused(),\n 'datetime-has-text': !!currentValue(),\n 'datetime-has-date': hasDate(),\n 'datetime-required': isRequired && !disabled,\n 'datetime-in-table': inTable,\n 'datetime-inverse': inverse,\n 'datetime-billing': isBilling,\n 'datetime-popover-open': mainPopover.isOpen(),\n 'datetime-size-22': size === 22,\n 'datetime-icon-hidden': inputConfig.isIconHidden,\n 'force-invalid': forceInvalidStyling,\n }\"\n #mainPopover=\"ngbPopover\"\n [ngbPopover]=\"!disabled ? dateTimePopover : null\"\n [placement]=\"['bottom-start', 'top-start']\"\n [triggers]=\"'manual'\"\n [popoverClass]=\"'datetimepopovermain'\"\n [autoClose]=\"'outside'\"\n [container]=\"'body'\"\n (mouseenter)=\"hasFloatingError && errorTooltipContainer.open()\"\n (mouseleave)=\"hasFloatingError && errorTooltipContainer.close()\"\n (pointerdown)=\"focusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (dblclick)=\"onInputSelect($event)\"\n>\n <div class=\"datetime-label\">\n {{ inputConfig.label }}\n </div>\n\n <input\n #inputListener\n [id]=\"id\"\n [value]=\"currentValue() ?? ''\"\n [tabindex]=\"disabled ? '-1' : '0'\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"onInputChange($event)\"\n (paste)=\"onInputPaste($event)\"\n class=\"datetime-input-listener\"\n #errorTooltipContainer=\"ngbTooltip\"\n [disabled]=\"disabled\"\n [ngbTooltip]=\"hasFloatingError ? errorTooltip : null\"\n [container]=\"'body'\"\n [placement]=\"'bottom'\"\n [triggers]=\"'manual'\"\n [disableTooltip]=\"isInputFocused()\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip\"\n />\n\n @if (!inputConfig.isIconHidden) {\n <div\n #iconContainer\n class=\"datetime-icon-container\"\n (click)=\"togglePopover()\"\n >\n <svg-icon\n class=\"datetime-icon\"\n [name]=\"\n inputConfig.placeholderIcon === 'date' ? 'cai-date' : 'cai-time'\n \"\n ></svg-icon>\n <div class=\"datetime-separator\"></div>\n </div>\n }\n\n <div class=\"datetime-input\" [class.selected]=\"isInputSelected()\">\n @if (isDatePicker()) {\n @for (part of displayedDateParts(); track part.type; let index = $index) {\n @if (index > 0) {\n <span class=\"datetime-input-separator\">{{ dateSeparator() }}</span>\n }\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === index\"\n [class.filled]=\"part.value !== part.placeholder\"\n (pointerdown)=\"highlightPart($event, index)\"\n >{{ part.value }}</span\n >\n }\n } @else {\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 0\"\n [class.filled]=\"displayedValues().hour !== 'HH'\"\n (pointerdown)=\"highlightPart($event, 0)\"\n >{{ displayedValues().hour }}</span\n >\n <span class=\"datetime-input-separator\">:</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 1\"\n [class.filled]=\"displayedValues().minute !== 'MM'\"\n (pointerdown)=\"highlightPart($event, 1)\"\n >{{ displayedValues().minute }}</span\n >\n @if (!isTwentyFourHour()) {\n <span\n class=\"datetime-input-part time-am-pm\"\n [class.highlighted]=\"highlightedPart() === 2\"\n (pointerdown)=\"highlightPart($event, 2)\"\n >{{ displayedValues().ampm }}</span\n >\n }\n }\n </div>\n\n @if (!disabled) {\n @let tooltipClass =\n inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n @if (showClear) {\n <button\n class=\"datetime-cancel-button\"\n type=\"button\"\n tabindex=\"-1\"\n ngbTooltip=\"Clear\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #clearButtonTooltip=\"ngbTooltip\"\n (click)=\"clearInput($event)\"\n (pointerdown)=\"closeClearButtonTooltip()\"\n (mouseleave)=\"closeClearButtonTooltip()\"\n >\n <svg-icon class=\"datetime-bg-icon\" name=\"cai-cancel\"></svg-icon>\n </button>\n }\n <svg-icon\n #dropdownIcon\n class=\"datetime-icon datetime-dropdown-icon\"\n (click)=\"togglePopover()\"\n name=\"cai-arrow-secondary-down\"\n ></svg-icon>\n }\n <!-- Error Message -->\n @if (!inTable || isBilling) {\n <div class=\"datetime-error-message\">\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : invalid\n ? (getSuperControl?.errors\n | errorMessage: inputConfig.customErrors)[0]\n : \"\"\n }}\n </div>\n }\n</div>\n\n<!-- Popover for DateTime Pickers -->\n<ng-template #dateTimePopover let-data=\"data\">\n <div\n class=\"datetime-dropdown-holder\"\n [class.datetime-has-stroke]=\"inputConfig.hasStroke\"\n >\n <cai-custom-datetime-pickers\n [calendarType]=\"isDatePicker() ? 'date' : 'time'\"\n [inputConfig]=\"inputConfig\"\n [placeholder]=\"'MM/DD/YY'\"\n [dateTime]=\"dateTime()\"\n (closePopover)=\"onPopoverDateChanged($event)\"\n ></cai-custom-datetime-pickers>\n </div>\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (inTable && invalid && !isInputFocused()) {\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : (getSuperControl?.errors | errorMessage: inputConfig.customErrors)[0]\n }}\n }\n</ng-template>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.datetime-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;padding:4px 4px 4px 6px;border-radius:2px;position:relative;display:flex;align-items:center;touch-action:manipulation;background-color:var(--color-surface-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);cursor:text;width:100%;height:26px}.datetime-input-container.datetime-inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #2f2f2f;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-icon{color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-separator{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-bg-icon:hover{background-color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-icon:hover{color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input{color:var(--color-text-inverse)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-part{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-separator{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.filled{color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#91919133;color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-separator{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-inverse.datetime-valid .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-inverse.datetime-valid.datetime-focus .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid.datetime-focus .datetime-input{color:var(--color-text)}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-bg-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-bg-icon:hover{background-color:#fff!important}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-icon:hover{color:#fff!important}.datetime-input-container.datetime-in-table{--color-surface-neutral: transparent;--color-surface-negative: transparent;--color-surface-positive: transparent}.datetime-input-container.datetime-in-table .datetime-dropdown-icon{opacity:0}.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-input,.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-label{color:var(--color-text-negative)}.datetime-input-container.datetime-in-table:hover .datetime-dropdown-icon,.datetime-input-container.datetime-in-table.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-input-container:hover{background-color:var(--color-surface-neutral-hover)}.datetime-input-container:hover .datetime-bg-icon{color:var(--color-surface-neutral-hover)}.datetime-input-container.datetime-focus{background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-focus:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-focus.datetime-billing .datetime-label{color:#fff!important}.datetime-input-container.datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-input{color:var(--color-text-inverse);opacity:1;pointer-events:auto}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part{height:18px;color:#ffffffb3}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.filled{color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#ffffff4d;color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-separator{color:#ffffffb3}.datetime-input-container.datetime-popover-open .datetime-dropdown-icon{transform:rotateX(180deg)}.datetime-input-container.datetime-has-text .datetime-input{opacity:1;pointer-events:auto!important}.datetime-input-container.datetime-has-text.datetime-disabled .datetime-input{pointer-events:none!important}.datetime-input-container.datetime-has-text:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-has-text.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-valid:not(.datetime-disabled){background-color:var(--color-surface-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover{background-color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#0b49d1}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus{background-color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon:hover{color:#0b49d1}.datetime-input-container.datetime-invalid:not(.datetime-disabled){background-color:var(--color-surface-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-error-message{opacity:1;transform:translateY(0)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover{background-color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#c20c0c}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover.datetime-has-text .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date{background-color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-separator,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-cancel-button,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date){background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-error-message{opacity:0}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon:hover{color:#c20c0c}.datetime-input-container.datetime-disabled{cursor:default;pointer-events:none}.datetime-input-container.datetime-disabled .datetime-icon,.datetime-input-container.datetime-disabled .datetime-dropdown-icon{cursor:default}.datetime-input-container.datetime-disabled:not(.datetime-in-table){background-color:var(--color-surface-disable)}.datetime-input-container.datetime-disabled.datetime-in-table{background-color:transparent}.datetime-input-container.datetime-disabled .datetime-label{color:var(--color-text-subtle)!important}.datetime-input-container.datetime-disabled .datetime-icon{color:var(--color-icon-disable)}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-label{color:var(--color-text-neutral)!important}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-icon{color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-separator{background-color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-required .datetime-label:after{content:\" *\";color:var(--color-text-negative)}.datetime-icon-container{display:flex;align-items:center;justify-content:center;gap:4px;width:max-content}.datetime-icon-container.hidden{display:none}.datetime-icon-container .datetime-icon{order:1;cursor:pointer}.datetime-icon-container .datetime-separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s ease-in-out;opacity:40%;order:2;margin-right:4px}.datetime-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:var(--color-icon-neutral);transition:color .1s ease-in-out,opacity .1s ease-in-out,transform .15s ease-in-out}.datetime-label{position:absolute;display:flex;gap:4px;left:27px;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.datetime-icon-hidden .datetime-label{left:0}.datetime-bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s ease-in-out,color .1s ease-in-out,opacity .1s ease-in-out,transform .1s ease-in-out;transform-box:border-box;transform-origin:center;will-change:transform}.datetime-bg-icon:focus-visible{outline:none}.datetime-bg-icon svg{transition:transform .1s ease-in-out}.datetime-bg-icon:hover{transform:scale(1.2222222222)}.datetime-bg-icon:hover svg{transform:scale(.8181818182)}.datetime-bg-icon:active{transform:scale(1)}.datetime-cancel-button{position:absolute;right:26px;top:4px;opacity:0;transition:opacity .1s ease-in-out;pointer-events:none}.datetime-dropdown-icon{position:absolute;right:4px;top:4px;transform:rotateX(0);cursor:pointer}.datetime-size-22{height:22px!important;padding-left:0}.datetime-size-22 .datetime-bg-icon{height:14px!important;width:14px!important;padding:2px!important;right:22px!important}.datetime-size-22 .datetime-icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.datetime-size-22 .datetime-input{padding-top:2px;padding-bottom:2px}.datetime-size-22 .datetime-label{padding-top:2px;padding-bottom:2px;padding-left:0!important}.datetime-size-22 .datetime-icon{height:14px!important;width:14px!important}.datetime-size-22.datetime-has-text .datetime-label,.datetime-size-22.datetime-focus .datetime-label{transform:translateY(-18px)!important}.datetime-error-message{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;transition:opacity .1s ease-in-out,transform .1s ease-in-out;color:var(--color-text-negative);transform:translateY(-10px);pointer-events:none}.datetime-input-listener{opacity:0;pointer-events:none;position:absolute;inset:0;font-size:16px}.datetime-billing .datetime-separator{order:0;margin-right:0;margin-left:4px}.datetime-billing .datetime-cancel-button{right:4px}.datetime-billing .datetime-label{left:0;font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-billing .datetime-icon-container{order:2}.datetime-billing .datetime-input{margin-left:auto;width:max-content}.datetime-billing .datetime-error-message{bottom:4px!important;right:32px!important;transform:translateY(0)!important}.datetime-billing.datetime-focus .datetime-error-message,.datetime-billing.datetime-has-text .datetime-error-message{opacity:0!important}.datetime-billing .datetime-dropdown-icon,.datetime-billing:hover .datetime-icon,.datetime-billing.datetime-focus .datetime-icon{opacity:0}.datetime-billing:hover .datetime-dropdown-icon,.datetime-billing.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-billing.datetime-has-text .datetime-dropdown-icon{opacity:0!important;pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container{pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container .datetime-icon,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container .datetime-icon{opacity:0!important}.datetime-input{font-size:14px;line-height:18px;font-weight:400;width:100%;opacity:0;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);-webkit-user-select:none;user-select:none}.datetime-input .datetime-input-separator{background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part{position:relative;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part.time-am-pm{margin-left:4px}.datetime-input .datetime-input-part:after{content:\"\";inset:0 -3px;position:absolute}.datetime-input.selected .datetime-input-part,.datetime-input.selected .datetime-input-separator{background-color:#ffffff4d}.datetime-input.selected .time-am-pm{margin-left:0!important;padding-left:4px!important}\n"], dependencies: [{ kind: "ngmodule", type:
|
|
8762
9112
|
// Modules
|
|
8763
9113
|
CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i1$2.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "svgClass", "class", "viewBox", "svgAriaLabel", "onSVGLoaded", "svgStyle"] }, { kind: "ngmodule", type: NgbModule }, { kind: "directive", type: i2.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type:
|
|
8764
9114
|
// Components
|
|
@@ -8779,7 +9129,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
8779
9129
|
CaCustomDatetimePickersComponent,
|
|
8780
9130
|
// Pipes
|
|
8781
9131
|
ErrorMessagePipe,
|
|
8782
|
-
], template: "@let inTable = inputConfig?.inTable; @let inverse = inputConfig?.inverse;\n@let size = inputConfig?.size;\n@let invalid =\n (getSuperControl?.invalid &&\n (getSuperControl?.touched || getSuperControl?.dirty)) ||\n shouldShowInternalValidationError();\n@let valid = getSuperControl?.valid && getSuperControl?.value;\n@let disabled = getSuperControl?.disabled || inputConfig?.isDisabled;\n@let isBilling = inputConfig?.isBilling;\n@let showClear = !disabled && !inputConfig.hideClear;\n@let hasFloatingError = inTable && invalid;\n\n<div\n [id]=\"id\"\n class=\"datetime-input-container\"\n [class]=\"{\n 'datetime-valid': valid && !forceInvalidStyling,\n 'datetime-invalid': invalid || forceInvalidStyling,\n 'datetime-disabled': disabled,\n 'datetime-focus': isInputFocused(),\n 'datetime-has-text': !!currentValue(),\n 'datetime-has-date': hasDate(),\n 'datetime-required': isRequired && !disabled,\n 'datetime-in-table': inTable,\n 'datetime-inverse': inverse,\n 'datetime-billing': isBilling,\n 'datetime-popover-open': mainPopover.isOpen(),\n 'datetime-size-22': size === 22,\n 'datetime-icon-hidden': inputConfig.isIconHidden,\n 'force-invalid': forceInvalidStyling,\n }\"\n #mainPopover=\"ngbPopover\"\n [ngbPopover]=\"!disabled ? dateTimePopover : null\"\n [placement]=\"['bottom-start', 'top-start']\"\n [triggers]=\"'manual'\"\n [popoverClass]=\"'datetimepopovermain'\"\n [autoClose]=\"'outside'\"\n [container]=\"'body'\"\n (mouseenter)=\"hasFloatingError && errorTooltipContainer.open()\"\n (mouseleave)=\"hasFloatingError && errorTooltipContainer.close()\"\n (pointerdown)=\"focusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (dblclick)=\"onInputSelect($event)\"\n>\n <div class=\"datetime-label\">\n {{ inputConfig.label }}\n </div>\n\n <input\n #inputListener\n [id]=\"id\"\n [value]=\"currentValue() ?? ''\"\n [tabindex]=\"disabled ? '-1' : '0'\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"onInputChange($event)\"\n (paste)=\"onInputPaste($event)\"\n class=\"datetime-input-listener\"\n #errorTooltipContainer=\"ngbTooltip\"\n [disabled]=\"disabled\"\n [ngbTooltip]=\"hasFloatingError ? errorTooltip : null\"\n [container]=\"'body'\"\n [placement]=\"'bottom'\"\n [triggers]=\"'manual'\"\n [disableTooltip]=\"isInputFocused()\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip\"\n />\n\n @if (!inputConfig.isIconHidden) {\n <div\n #iconContainer\n class=\"datetime-icon-container\"\n (click)=\"togglePopover()\"\n >\n <svg-icon\n class=\"datetime-icon\"\n [name]=\"\n inputConfig.placeholderIcon === 'date' ? 'cai-date' : 'cai-time'\n \"\n ></svg-icon>\n <div class=\"datetime-separator\"></div>\n </div>\n }\n\n <div class=\"datetime-input\" [class.selected]=\"isInputSelected()\">\n @if (isDatePicker()) {\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 0\"\n [class.filled]=\"displayedValues().month !== 'MM'\"\n (pointerdown)=\"highlightPart($event, 0)\"\n >{{ displayedValues().month }}</span\n >\n <span class=\"datetime-input-separator\">/</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 1\"\n [class.filled]=\"displayedValues().day !== 'DD'\"\n (pointerdown)=\"highlightPart($event, 1)\"\n >{{ displayedValues().day }}</span\n >\n <span class=\"datetime-input-separator\">/</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 2\"\n [class.filled]=\"displayedValues().year !== 'YY'\"\n (pointerdown)=\"highlightPart($event, 2)\"\n >{{ displayedValues().year }}</span\n >\n } @else {\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 0\"\n [class.filled]=\"displayedValues().hour !== 'HH'\"\n (pointerdown)=\"highlightPart($event, 0)\"\n >{{ displayedValues().hour }}</span\n >\n <span class=\"datetime-input-separator\">:</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 1\"\n [class.filled]=\"displayedValues().minute !== 'MM'\"\n (pointerdown)=\"highlightPart($event, 1)\"\n >{{ displayedValues().minute }}</span\n >\n <span\n class=\"datetime-input-part time-am-pm\"\n [class.highlighted]=\"highlightedPart() === 2\"\n (pointerdown)=\"highlightPart($event, 2)\"\n >{{ displayedValues().ampm }}</span\n >\n }\n </div>\n\n @if (!disabled) {\n @let tooltipClass =\n inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n @if (showClear) {\n <button\n class=\"datetime-cancel-button\"\n type=\"button\"\n tabindex=\"-1\"\n ngbTooltip=\"Clear\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #clearButtonTooltip=\"ngbTooltip\"\n (click)=\"clearInput($event)\"\n (pointerdown)=\"closeClearButtonTooltip()\"\n (mouseleave)=\"closeClearButtonTooltip()\"\n >\n <svg-icon class=\"datetime-bg-icon\" name=\"cai-cancel\"></svg-icon>\n </button>\n }\n <svg-icon\n #dropdownIcon\n class=\"datetime-icon datetime-dropdown-icon\"\n (click)=\"togglePopover()\"\n name=\"cai-arrow-secondary-down\"\n ></svg-icon>\n }\n <!-- Error Message -->\n @if (!inTable || isBilling) {\n <div class=\"datetime-error-message\">\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : invalid\n ? (getSuperControl?.errors\n | errorMessage: inputConfig.customErrors)[0]\n : \"\"\n }}\n </div>\n }\n</div>\n\n<!-- Popover for DateTime Pickers -->\n<ng-template #dateTimePopover let-data=\"data\">\n <div\n class=\"datetime-dropdown-holder\"\n [class.datetime-has-stroke]=\"inputConfig.hasStroke\"\n >\n <cai-custom-datetime-pickers\n [calendarType]=\"isDatePicker() ? 'date' : 'time'\"\n [inputConfig]=\"inputConfig\"\n [placeholder]=\"'MM/DD/YY'\"\n [dateTime]=\"dateTime()\"\n (closePopover)=\"onPopoverDateChanged($event)\"\n ></cai-custom-datetime-pickers>\n </div>\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (inTable && invalid && !isInputFocused()) {\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : (getSuperControl?.errors | errorMessage: inputConfig.customErrors)[0]\n }}\n }\n</ng-template>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.datetime-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;padding:4px 4px 4px 6px;border-radius:2px;position:relative;display:flex;align-items:center;touch-action:manipulation;background-color:var(--color-surface-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);cursor:text;width:100%;height:26px}.datetime-input-container.datetime-inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #2f2f2f;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-icon{color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-separator{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-bg-icon:hover{background-color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-icon:hover{color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input{color:var(--color-text-inverse)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-part{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-separator{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.filled{color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#91919133;color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-separator{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-inverse.datetime-valid .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-inverse.datetime-valid.datetime-focus .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid.datetime-focus .datetime-input{color:var(--color-text)}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-bg-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-bg-icon:hover{background-color:#fff!important}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-icon:hover{color:#fff!important}.datetime-input-container.datetime-in-table{--color-surface-neutral: transparent;--color-surface-negative: transparent;--color-surface-positive: transparent}.datetime-input-container.datetime-in-table .datetime-dropdown-icon{opacity:0}.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-input,.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-label{color:var(--color-text-negative)}.datetime-input-container.datetime-in-table:hover .datetime-dropdown-icon,.datetime-input-container.datetime-in-table.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-input-container:hover{background-color:var(--color-surface-neutral-hover)}.datetime-input-container:hover .datetime-bg-icon{color:var(--color-surface-neutral-hover)}.datetime-input-container.datetime-focus{background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-focus:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-focus.datetime-billing .datetime-label{color:#fff!important}.datetime-input-container.datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-input{color:var(--color-text-inverse);opacity:1;pointer-events:auto}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part{height:18px;color:#ffffffb3}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.filled{color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#ffffff4d;color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-separator{color:#ffffffb3}.datetime-input-container.datetime-popover-open .datetime-dropdown-icon{transform:rotateX(180deg)}.datetime-input-container.datetime-has-text .datetime-input{opacity:1;pointer-events:auto!important}.datetime-input-container.datetime-has-text.datetime-disabled .datetime-input{pointer-events:none!important}.datetime-input-container.datetime-has-text:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-has-text.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-valid:not(.datetime-disabled){background-color:var(--color-surface-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover{background-color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#0b49d1}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus{background-color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon:hover{color:#0b49d1}.datetime-input-container.datetime-invalid:not(.datetime-disabled){background-color:var(--color-surface-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-error-message{opacity:1;transform:translateY(0)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover{background-color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#c20c0c}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover.datetime-has-text .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date{background-color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-separator,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-cancel-button,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date){background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-error-message{opacity:0}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon:hover{color:#c20c0c}.datetime-input-container.datetime-disabled{cursor:default;pointer-events:none}.datetime-input-container.datetime-disabled .datetime-icon,.datetime-input-container.datetime-disabled .datetime-dropdown-icon{cursor:default}.datetime-input-container.datetime-disabled:not(.datetime-in-table){background-color:var(--color-surface-disable)}.datetime-input-container.datetime-disabled.datetime-in-table{background-color:transparent}.datetime-input-container.datetime-disabled .datetime-label{color:var(--color-text-subtle)!important}.datetime-input-container.datetime-disabled .datetime-icon{color:var(--color-icon-disable)}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-label{color:var(--color-text-neutral)!important}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-icon{color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-separator{background-color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-required .datetime-label:after{content:\" *\";color:var(--color-text-negative)}.datetime-icon-container{display:flex;align-items:center;justify-content:center;gap:4px;width:max-content}.datetime-icon-container.hidden{display:none}.datetime-icon-container .datetime-icon{order:1;cursor:pointer}.datetime-icon-container .datetime-separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s ease-in-out;opacity:40%;order:2;margin-right:4px}.datetime-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:var(--color-icon-neutral);transition:color .1s ease-in-out,opacity .1s ease-in-out,transform .15s ease-in-out}.datetime-label{position:absolute;display:flex;gap:4px;left:27px;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.datetime-icon-hidden .datetime-label{left:0}.datetime-bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s ease-in-out,color .1s ease-in-out,opacity .1s ease-in-out,transform .1s ease-in-out;transform-box:border-box;transform-origin:center;will-change:transform}.datetime-bg-icon:focus-visible{outline:none}.datetime-bg-icon svg{transition:transform .1s ease-in-out}.datetime-bg-icon:hover{transform:scale(1.2222222222)}.datetime-bg-icon:hover svg{transform:scale(.8181818182)}.datetime-bg-icon:active{transform:scale(1)}.datetime-cancel-button{position:absolute;right:26px;top:4px;opacity:0;transition:opacity .1s ease-in-out;pointer-events:none}.datetime-dropdown-icon{position:absolute;right:4px;top:4px;transform:rotateX(0);cursor:pointer}.datetime-size-22{height:22px!important;padding-left:0}.datetime-size-22 .datetime-bg-icon{height:14px!important;width:14px!important;padding:2px!important;right:22px!important}.datetime-size-22 .datetime-icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.datetime-size-22 .datetime-input{padding-top:2px;padding-bottom:2px}.datetime-size-22 .datetime-label{padding-top:2px;padding-bottom:2px;padding-left:0!important}.datetime-size-22 .datetime-icon{height:14px!important;width:14px!important}.datetime-size-22.datetime-has-text .datetime-label,.datetime-size-22.datetime-focus .datetime-label{transform:translateY(-18px)!important}.datetime-error-message{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;transition:opacity .1s ease-in-out,transform .1s ease-in-out;color:var(--color-text-negative);transform:translateY(-10px);pointer-events:none}.datetime-input-listener{opacity:0;pointer-events:none;position:absolute;inset:0;font-size:16px}.datetime-billing .datetime-separator{order:0;margin-right:0;margin-left:4px}.datetime-billing .datetime-cancel-button{right:4px}.datetime-billing .datetime-label{left:0;font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-billing .datetime-icon-container{order:2}.datetime-billing .datetime-input{margin-left:auto;width:max-content}.datetime-billing .datetime-error-message{bottom:4px!important;right:32px!important;transform:translateY(0)!important}.datetime-billing.datetime-focus .datetime-error-message,.datetime-billing.datetime-has-text .datetime-error-message{opacity:0!important}.datetime-billing .datetime-dropdown-icon,.datetime-billing:hover .datetime-icon,.datetime-billing.datetime-focus .datetime-icon{opacity:0}.datetime-billing:hover .datetime-dropdown-icon,.datetime-billing.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-billing.datetime-has-text .datetime-dropdown-icon{opacity:0!important;pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container{pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container .datetime-icon,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container .datetime-icon{opacity:0!important}.datetime-input{font-size:14px;line-height:18px;font-weight:400;width:100%;opacity:0;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);-webkit-user-select:none;user-select:none}.datetime-input .datetime-input-separator{background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part{position:relative;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part.time-am-pm{margin-left:4px}.datetime-input .datetime-input-part:after{content:\"\";inset:0 -3px;position:absolute}.datetime-input.selected .datetime-input-part,.datetime-input.selected .datetime-input-separator{background-color:#ffffff4d}.datetime-input.selected .time-am-pm{margin-left:0!important;padding-left:4px!important}\n"] }]
|
|
9132
|
+
], template: "@let inTable = inputConfig?.inTable; @let inverse = inputConfig?.inverse;\n@let size = inputConfig?.size;\n@let invalid =\n (getSuperControl?.invalid &&\n (getSuperControl?.touched || getSuperControl?.dirty)) ||\n shouldShowInternalValidationError();\n@let valid = getSuperControl?.valid && getSuperControl?.value;\n@let disabled = getSuperControl?.disabled || inputConfig?.isDisabled;\n@let isBilling = inputConfig?.isBilling;\n@let showClear = !disabled && !inputConfig.hideClear;\n@let hasFloatingError = inTable && invalid;\n\n<div\n [id]=\"id\"\n class=\"datetime-input-container\"\n [class]=\"{\n 'datetime-valid': valid && !forceInvalidStyling,\n 'datetime-invalid': invalid || forceInvalidStyling,\n 'datetime-disabled': disabled,\n 'datetime-focus': isInputFocused(),\n 'datetime-has-text': !!currentValue(),\n 'datetime-has-date': hasDate(),\n 'datetime-required': isRequired && !disabled,\n 'datetime-in-table': inTable,\n 'datetime-inverse': inverse,\n 'datetime-billing': isBilling,\n 'datetime-popover-open': mainPopover.isOpen(),\n 'datetime-size-22': size === 22,\n 'datetime-icon-hidden': inputConfig.isIconHidden,\n 'force-invalid': forceInvalidStyling,\n }\"\n #mainPopover=\"ngbPopover\"\n [ngbPopover]=\"!disabled ? dateTimePopover : null\"\n [placement]=\"['bottom-start', 'top-start']\"\n [triggers]=\"'manual'\"\n [popoverClass]=\"'datetimepopovermain'\"\n [autoClose]=\"'outside'\"\n [container]=\"'body'\"\n (mouseenter)=\"hasFloatingError && errorTooltipContainer.open()\"\n (mouseleave)=\"hasFloatingError && errorTooltipContainer.close()\"\n (pointerdown)=\"focusInput($event)\"\n (mousedown)=\"$event.preventDefault()\"\n (dblclick)=\"onInputSelect($event)\"\n>\n <div class=\"datetime-label\">\n {{ inputConfig.label }}\n </div>\n\n <input\n #inputListener\n [id]=\"id\"\n [value]=\"currentValue() ?? ''\"\n [tabindex]=\"disabled ? '-1' : '0'\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"onInputChange($event)\"\n (paste)=\"onInputPaste($event)\"\n class=\"datetime-input-listener\"\n #errorTooltipContainer=\"ngbTooltip\"\n [disabled]=\"disabled\"\n [ngbTooltip]=\"hasFloatingError ? errorTooltip : null\"\n [container]=\"'body'\"\n [placement]=\"'bottom'\"\n [triggers]=\"'manual'\"\n [disableTooltip]=\"isInputFocused()\"\n tooltipClass=\"tooltip tooltip-bg-red-500 input-tooltip\"\n />\n\n @if (!inputConfig.isIconHidden) {\n <div\n #iconContainer\n class=\"datetime-icon-container\"\n (click)=\"togglePopover()\"\n >\n <svg-icon\n class=\"datetime-icon\"\n [name]=\"\n inputConfig.placeholderIcon === 'date' ? 'cai-date' : 'cai-time'\n \"\n ></svg-icon>\n <div class=\"datetime-separator\"></div>\n </div>\n }\n\n <div class=\"datetime-input\" [class.selected]=\"isInputSelected()\">\n @if (isDatePicker()) {\n @for (part of displayedDateParts(); track part.type; let index = $index) {\n @if (index > 0) {\n <span class=\"datetime-input-separator\">{{ dateSeparator() }}</span>\n }\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === index\"\n [class.filled]=\"part.value !== part.placeholder\"\n (pointerdown)=\"highlightPart($event, index)\"\n >{{ part.value }}</span\n >\n }\n } @else {\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 0\"\n [class.filled]=\"displayedValues().hour !== 'HH'\"\n (pointerdown)=\"highlightPart($event, 0)\"\n >{{ displayedValues().hour }}</span\n >\n <span class=\"datetime-input-separator\">:</span>\n <span\n class=\"datetime-input-part\"\n [class.highlighted]=\"highlightedPart() === 1\"\n [class.filled]=\"displayedValues().minute !== 'MM'\"\n (pointerdown)=\"highlightPart($event, 1)\"\n >{{ displayedValues().minute }}</span\n >\n @if (!isTwentyFourHour()) {\n <span\n class=\"datetime-input-part time-am-pm\"\n [class.highlighted]=\"highlightedPart() === 2\"\n (pointerdown)=\"highlightPart($event, 2)\"\n >{{ displayedValues().ampm }}</span\n >\n }\n }\n </div>\n\n @if (!disabled) {\n @let tooltipClass =\n inverse\n ? \"tooltip input-tooltip tooltip-bg-white-700 tooltip-text-black-500\"\n : \"tooltip input-tooltip\";\n\n @if (showClear) {\n <button\n class=\"datetime-cancel-button\"\n type=\"button\"\n tabindex=\"-1\"\n ngbTooltip=\"Clear\"\n [openDelay]=\"600\"\n [tooltipClass]=\"tooltipClass\"\n [placement]=\"'top'\"\n [container]=\"'body'\"\n [autoClose]=\"true\"\n #clearButtonTooltip=\"ngbTooltip\"\n (click)=\"clearInput($event)\"\n (pointerdown)=\"closeClearButtonTooltip()\"\n (mouseleave)=\"closeClearButtonTooltip()\"\n >\n <svg-icon class=\"datetime-bg-icon\" name=\"cai-cancel\"></svg-icon>\n </button>\n }\n <svg-icon\n #dropdownIcon\n class=\"datetime-icon datetime-dropdown-icon\"\n (click)=\"togglePopover()\"\n name=\"cai-arrow-secondary-down\"\n ></svg-icon>\n }\n <!-- Error Message -->\n @if (!inTable || isBilling) {\n <div class=\"datetime-error-message\">\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : invalid\n ? (getSuperControl?.errors\n | errorMessage: inputConfig.customErrors)[0]\n : \"\"\n }}\n </div>\n }\n</div>\n\n<!-- Popover for DateTime Pickers -->\n<ng-template #dateTimePopover let-data=\"data\">\n <div\n class=\"datetime-dropdown-holder\"\n [class.datetime-has-stroke]=\"inputConfig.hasStroke\"\n >\n <cai-custom-datetime-pickers\n [calendarType]=\"isDatePicker() ? 'date' : 'time'\"\n [inputConfig]=\"inputConfig\"\n [placeholder]=\"'MM/DD/YY'\"\n [dateTime]=\"dateTime()\"\n (closePopover)=\"onPopoverDateChanged($event)\"\n ></cai-custom-datetime-pickers>\n </div>\n</ng-template>\n\n<ng-template #errorTooltip>\n @if (inTable && invalid && !isInputFocused()) {\n {{\n shouldShowInternalValidationError()\n ? internalValidationErrorMessage()\n : (getSuperControl?.errors | errorMessage: inputConfig.customErrors)[0]\n }}\n }\n</ng-template>\n", styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 5000s ease-in-out 0s!important}input:-webkit-autofill:focus{-webkit-text-fill-color:#ffffff!important}input:-moz-autofill,input:-moz-autofill-preview{filter:none}*,*:before,*:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}p,ul,ol,dl,blockquote,figure,pre{margin:0}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{background:none;border:none;padding:0}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle;max-width:100%;height:auto}ul,ol{padding-left:1.5rem;list-style-position:outside}a{color:inherit;text-decoration:inherit}table{border-collapse:collapse;border-spacing:0}:focus:not(:focus-visible){outline:none}.datetime-input-container{--color-text: #2f2f2f;--color-text-negative: #df3c3c;--color-text-heading: #424242;--color-text-subtle: #919191;--color-text-inverse: #ffffff;--color-icon-neutral: #919191;--color-icon-negative: #e66767;--color-icon-positive: #6692f1;--color-icon-inverse: rgba(255, 255, 255, .6980392157);--color-icon-disable: #cccccc;--color-surface-neutral: #eeeeee;--color-surface-neutral-hover: #dadada;--color-surface-neutral-focus: #1d1d1d;--color-surface-positive: #e9effd;--color-surface-positive-hover: #bed0f9;--color-surface-positive-focus: #0b49d1;--color-surface-negative: #fbe9e9;--color-surface-negative-hover: #f4bebe;--color-surface-negative-focus: #c20c0c;--color-surface-disable: #f7f7f7;padding:4px 4px 4px 6px;border-radius:2px;position:relative;display:flex;align-items:center;touch-action:manipulation;background-color:var(--color-surface-neutral);transition:background-color .1s cubic-bezier(.46,.03,.51,.95);cursor:text;width:100%;height:26px}.datetime-input-container.datetime-inverse{--color-text: #ffffff;--color-text-negative: #ed9292;--color-text-heading: #ffffff;--color-text-inverse: #2f2f2f;--color-icon-neutral: #aaaaaa;--color-icon-negative: #ed9292;--color-icon-positive: #92b1f5;--color-icon-disable: #6c6c6c;--color-surface-neutral: #424242;--color-surface-neutral-hover: #6c6c6c;--color-surface-neutral-focus: #dadada;--color-surface-positive: rgba(59, 115, 237, .2);--color-surface-positive-hover: #2f519a;--color-surface-positive-focus: #0b49d1;--color-surface-negative: rgba(223, 60, 60, .2);--color-surface-negative-hover: #923030;--color-surface-negative-focus: #c20c0c;--color-surface-disable: rgba(66, 66, 66, .4)}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-icon{color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-separator{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-neutral)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-bg-icon:hover{background-color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus:hover .datetime-icon:hover{color:#424242!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input{color:var(--color-text-inverse)!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-part{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input.selected .datetime-input-separator{background-color:#91919133}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.filled{color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#91919133;color:#000!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date).datetime-focus .datetime-input .datetime-input-separator{color:#0000004d!important}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse:not(.datetime-has-date):hover .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-inverse.datetime-valid .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-inverse.datetime-valid.datetime-focus .datetime-input,.datetime-input-container.datetime-inverse.datetime-invalid.datetime-focus .datetime-input{color:var(--color-text)}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-bg-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-bg-icon:hover{background-color:#fff!important}.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-valid:hover .datetime-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-dropdown-icon:hover,.datetime-input-container.datetime-inverse.datetime-invalid:hover .datetime-icon:hover{color:#fff!important}.datetime-input-container.datetime-in-table{--color-surface-neutral: transparent;--color-surface-negative: transparent;--color-surface-positive: transparent}.datetime-input-container.datetime-in-table .datetime-dropdown-icon{opacity:0}.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-input,.datetime-input-container.datetime-in-table.datetime-invalid:not(.datetime-focus):not(:hover):not(.force-invalid) .datetime-label{color:var(--color-text-negative)}.datetime-input-container.datetime-in-table:hover .datetime-dropdown-icon,.datetime-input-container.datetime-in-table.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-input-container:hover{background-color:var(--color-surface-neutral-hover)}.datetime-input-container:hover .datetime-bg-icon{color:var(--color-surface-neutral-hover)}.datetime-input-container.datetime-focus{background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-focus:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-focus.datetime-billing .datetime-label{color:#fff!important}.datetime-input-container.datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-focus .datetime-input{color:var(--color-text-inverse);opacity:1;pointer-events:auto}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part{height:18px;color:#ffffffb3}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.filled{color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-part.highlighted{background-color:#ffffff4d;color:#fff}.datetime-input-container.datetime-focus .datetime-input .datetime-input-separator{color:#ffffffb3}.datetime-input-container.datetime-popover-open .datetime-dropdown-icon{transform:rotateX(180deg)}.datetime-input-container.datetime-has-text .datetime-input{opacity:1;pointer-events:auto!important}.datetime-input-container.datetime-has-text.datetime-disabled .datetime-input{pointer-events:none!important}.datetime-input-container.datetime-has-text:not(.datetime-in-table):not(.datetime-billing) .datetime-label{transform:translateY(-20px);font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-input-container.datetime-has-text.datetime-in-table:not(.datetime-billing) .datetime-label{opacity:0}.datetime-input-container.datetime-valid:not(.datetime-disabled){background-color:var(--color-surface-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover{background-color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-positive);color:var(--color-surface-positive-hover)}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#0b49d1}.datetime-input-container.datetime-valid:not(.datetime-disabled):hover .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus{background-color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-positive-focus)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-valid:not(.datetime-disabled).datetime-focus .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-positive)}.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-valid:not(.datetime-disabled) .datetime-icon:hover{color:#0b49d1}.datetime-input-container.datetime-invalid:not(.datetime-disabled){background-color:var(--color-surface-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-error-message{opacity:1;transform:translateY(0)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover{background-color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon{background-color:var(--color-icon-negative);color:var(--color-surface-negative-hover)}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover .datetime-bg-icon:hover{background-color:#c20c0c}.datetime-input-container.datetime-invalid:not(.datetime-disabled):hover.datetime-has-text .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date{background-color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-negative-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-bg-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-separator,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-text .datetime-cancel-button,.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus.datetime-has-date .datetime-cancel-button{opacity:1;pointer-events:auto}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date){background-color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-error-message{opacity:0}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon{background-color:var(--color-icon-inverse);color:var(--color-surface-neutral-focus)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-bg-icon:hover{background-color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-separator{background-color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon{color:var(--color-icon-inverse)}.datetime-input-container.datetime-invalid:not(.datetime-disabled).datetime-focus:not(.datetime-has-date) .datetime-icon:hover{color:#fff}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-separator{background-color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon{color:var(--color-icon-negative)}.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-dropdown-icon:hover,.datetime-input-container.datetime-invalid:not(.datetime-disabled) .datetime-icon:hover{color:#c20c0c}.datetime-input-container.datetime-disabled{cursor:default;pointer-events:none}.datetime-input-container.datetime-disabled .datetime-icon,.datetime-input-container.datetime-disabled .datetime-dropdown-icon{cursor:default}.datetime-input-container.datetime-disabled:not(.datetime-in-table){background-color:var(--color-surface-disable)}.datetime-input-container.datetime-disabled.datetime-in-table{background-color:transparent}.datetime-input-container.datetime-disabled .datetime-label{color:var(--color-text-subtle)!important}.datetime-input-container.datetime-disabled .datetime-icon{color:var(--color-icon-disable)}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-label{color:var(--color-text-neutral)!important}.datetime-input-container.datetime-disabled.datetime-has-text .datetime-icon{color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-separator{background-color:var(--color-icon-neutral)}.datetime-input-container.datetime-disabled .datetime-input{color:var(--color-text)!important}.datetime-input-container.datetime-required .datetime-label:after{content:\" *\";color:var(--color-text-negative)}.datetime-icon-container{display:flex;align-items:center;justify-content:center;gap:4px;width:max-content}.datetime-icon-container.hidden{display:none}.datetime-icon-container .datetime-icon{order:1;cursor:pointer}.datetime-icon-container .datetime-separator{height:14px;width:1px;border-radius:2px;background-color:var(--color-icon-neutral);transition:background-color .1s ease-in-out;opacity:40%;order:2;margin-right:4px}.datetime-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:var(--color-icon-neutral);transition:color .1s ease-in-out,opacity .1s ease-in-out,transform .15s ease-in-out}.datetime-label{position:absolute;display:flex;gap:4px;left:27px;font-size:14px;line-height:18px;font-weight:400;pointer-events:none;padding:.25rem 6px;color:var(--color-text);transition:transform .1s ease-in-out,font-weight .1s ease-in-out,color .1s ease-in-out,font-size .1s ease-in-out,opacity .1s ease-in-out;transform:translateY(0);-webkit-user-select:none;user-select:none}.datetime-icon-hidden .datetime-label{left:0}.datetime-bg-icon{background-color:var(--color-icon-neutral);color:var(--color-surface-neutral);border-radius:1px;height:18px;width:18px;padding:0;display:grid;place-items:center;transition:background-color .1s ease-in-out,color .1s ease-in-out,opacity .1s ease-in-out,transform .1s ease-in-out;transform-box:border-box;transform-origin:center;will-change:transform}.datetime-bg-icon:focus-visible{outline:none}.datetime-bg-icon svg{transition:transform .1s ease-in-out}.datetime-bg-icon:hover{transform:scale(1.2222222222)}.datetime-bg-icon:hover svg{transform:scale(.8181818182)}.datetime-bg-icon:active{transform:scale(1)}.datetime-cancel-button{position:absolute;right:26px;top:4px;opacity:0;transition:opacity .1s ease-in-out;pointer-events:none}.datetime-dropdown-icon{position:absolute;right:4px;top:4px;transform:rotateX(0);cursor:pointer}.datetime-size-22{height:22px!important;padding-left:0}.datetime-size-22 .datetime-bg-icon{height:14px!important;width:14px!important;padding:2px!important;right:22px!important}.datetime-size-22 .datetime-icon-container{height:22px!important;padding-top:2px;padding-bottom:2px;padding-left:4px!important}.datetime-size-22 .datetime-input{padding-top:2px;padding-bottom:2px}.datetime-size-22 .datetime-label{padding-top:2px;padding-bottom:2px;padding-left:0!important}.datetime-size-22 .datetime-icon{height:14px!important;width:14px!important}.datetime-size-22.datetime-has-text .datetime-label,.datetime-size-22.datetime-focus .datetime-label{transform:translateY(-18px)!important}.datetime-error-message{position:absolute;bottom:-16px;right:6px;font-size:11px;font-weight:600;opacity:0;-webkit-user-select:none;user-select:none;transition:opacity .1s ease-in-out,transform .1s ease-in-out;color:var(--color-text-negative);transform:translateY(-10px);pointer-events:none}.datetime-input-listener{opacity:0;pointer-events:none;position:absolute;inset:0;font-size:16px}.datetime-billing .datetime-separator{order:0;margin-right:0;margin-left:4px}.datetime-billing .datetime-cancel-button{right:4px}.datetime-billing .datetime-label{left:0;font-weight:600;font-size:11px;color:var(--color-text-heading)!important}.datetime-billing .datetime-icon-container{order:2}.datetime-billing .datetime-input{margin-left:auto;width:max-content}.datetime-billing .datetime-error-message{bottom:4px!important;right:32px!important;transform:translateY(0)!important}.datetime-billing.datetime-focus .datetime-error-message,.datetime-billing.datetime-has-text .datetime-error-message{opacity:0!important}.datetime-billing .datetime-dropdown-icon,.datetime-billing:hover .datetime-icon,.datetime-billing.datetime-focus .datetime-icon{opacity:0}.datetime-billing:hover .datetime-dropdown-icon,.datetime-billing.datetime-focus .datetime-dropdown-icon{opacity:1}.datetime-billing.datetime-has-text .datetime-dropdown-icon{opacity:0!important;pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container{pointer-events:none!important}.datetime-billing.datetime-has-text:hover .datetime-icon-container .datetime-icon,.datetime-billing.datetime-has-text.datetime-focus .datetime-icon-container .datetime-icon{opacity:0!important}.datetime-input{font-size:14px;line-height:18px;font-weight:400;width:100%;opacity:0;pointer-events:none;transition:color .1s cubic-bezier(.46,.03,.51,.95),opacity .1s cubic-bezier(.46,.03,.51,.95);-webkit-user-select:none;user-select:none}.datetime-input .datetime-input-separator{background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part{position:relative;background-color:transparent;transition:color .1s cubic-bezier(.46,.03,.51,.95),background-color .1s cubic-bezier(.46,.03,.51,.95)}.datetime-input .datetime-input-part.time-am-pm{margin-left:4px}.datetime-input .datetime-input-part:after{content:\"\";inset:0 -3px;position:absolute}.datetime-input.selected .datetime-input-part,.datetime-input.selected .datetime-input-separator{background-color:#ffffff4d}.datetime-input.selected .time-am-pm{margin-left:0!important;padding-left:4px!important}\n"] }]
|
|
8783
9133
|
}], ctorParameters: () => [], propDecorators: { inputListener: [{
|
|
8784
9134
|
type: ViewChild,
|
|
8785
9135
|
args: ['inputListener']
|
|
@@ -12865,5 +13215,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
|
|
|
12865
13215
|
* Generated bundle index. Do not edit.
|
|
12866
13216
|
*/
|
|
12867
13217
|
|
|
12868
|
-
export { AvatarComponent, CaScrollableComponent, CaiInputDatetimePickerComponent, CopyComponent, CounterComponent, DEFAULT_CROP_ZOOM, DEFAULT_DUAL_DROP_ZONES, DOCS_OR_MEDIA_VARIANTS, DROP_ZONE_CARD_SLIDER, DROP_ZONE_CARD_SLIDER_ITEM_WITH_GAP_PX, DROP_ZONE_NARROW_BREAKPOINT_PX, DUAL_DROP_TARGETS, DispatchDropdownComponent, DispatchLocationComponent, DispatchStatus, DocumentThumbnailHelper, DropZoneComponent, DropdownTypes, FILE_PROCESSING_CONCURRENCY, IMAGE_PREVIEW_CSS_WIDTH, IMAGE_PREVIEW_VARIANTS, IMAGE_RESIZE_THRESHOLD_BYTES, INPUT_CHARACTER_SETS, InputAddressComponent, InputComponent, IntervalDropdownComponent, ListContactDropdownComponent, PDFJS_ASSET_BASE, PmComponent, RatingReviewComponent, ReviewModalComponent, SelectedBusinessFieldComponent, SignatureComponent, StickyScrollbarComponent, THUMBNAIL_MIME, THUMBNAIL_QUALITY, THUMBNAIL_WIDTH, TabOptionDropdownComponent, TextAreaComponent, VIDEO_THUMBNAIL_TIMEOUT_MS, eScrollState, ignoreWhenAutofilled, sizes };
|
|
13218
|
+
export { AvatarComponent, CaScrollableComponent, CaiInputDatetimePickerComponent, CopyComponent, CounterComponent, DATE_FORMAT_PATTERNS, DATE_PART_PLACEHOLDERS, DEFAULT_CROP_ZOOM, DEFAULT_DATE_FORMAT_PATTERN, DEFAULT_DUAL_DROP_ZONES, DEFAULT_NUMBER_FORMAT, DEFAULT_PHONE_DIAL_CODE, DEFAULT_TIME_FORMAT, DOCS_OR_MEDIA_VARIANTS, DROP_ZONE_CARD_SLIDER, DROP_ZONE_CARD_SLIDER_ITEM_WITH_GAP_PX, DROP_ZONE_NARROW_BREAKPOINT_PX, DUAL_DROP_TARGETS, DateFormats, DispatchDropdownComponent, DispatchLocationComponent, DispatchStatus, DocumentThumbnailHelper, DropZoneComponent, DropdownTypes, FILE_PROCESSING_CONCURRENCY, IMAGE_PREVIEW_CSS_WIDTH, IMAGE_PREVIEW_VARIANTS, IMAGE_RESIZE_THRESHOLD_BYTES, INPUT_CHARACTER_SETS, InputAddressComponent, InputComponent, IntervalDropdownComponent, ListContactDropdownComponent, NUMBER_FORMAT_SEPARATORS, NumberFormats, PDFJS_ASSET_BASE, PHONE_COUNTRIES, PHONE_MASK, PHONE_MAX_DIGITS, PHONE_TWO_DIGIT_DIAL_CODES, PmComponent, RatingReviewComponent, ReviewModalComponent, SelectedBusinessFieldComponent, SignatureComponent, StickyScrollbarComponent, THUMBNAIL_MIME, THUMBNAIL_QUALITY, THUMBNAIL_WIDTH, TIME_FORMAT_PATTERNS, TabOptionDropdownComponent, TextAreaComponent, TimeFormats, VIDEO_THUMBNAIL_TIMEOUT_MS, eScrollState, getDateFormatPattern, ignoreWhenAutofilled, sizes };
|
|
12869
13219
|
//# sourceMappingURL=carriera-intern.mjs.map
|