@fkui/vue-labs 5.37.3 → 5.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,5 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, Symbol.toStringTag, {
4
- value: "Module"
5
- });
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
3
  const logic = require("@fkui/logic");
7
4
  const vue = require("vue");
8
5
  const vue$1 = require("@fkui/vue");
@@ -26,7 +23,7 @@ function hoursMinutesStringToMinutes(valueString, extraForgiving = false) {
26
23
  if (logic.isEmpty(valueString.trim())) {
27
24
  return void 0;
28
25
  }
29
- const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(value => parseInt(value, 10));
26
+ const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map((value) => parseInt(value, 10));
30
27
  const totalMinutes = hours * 60 + minutes;
31
28
  return !isNaN(totalMinutes) ? totalMinutes : void 0;
32
29
  }
@@ -38,7 +35,7 @@ function minutesToHoursMinutesString(value) {
38
35
  hours,
39
36
  minutes
40
37
  } = minutesToObject(safeValue);
41
- valueString = [hours, minutes].map(value2 => String(value2).padStart(2, "0")).join(":");
38
+ valueString = [hours, minutes].map((value2) => String(value2).padStart(2, "0")).join(":");
42
39
  }
43
40
  return logic.stripWhitespace(valueString);
44
41
  }
@@ -61,11 +58,11 @@ function minutesToUserFriendlyString(value) {
61
58
  });
62
59
  }
63
60
  function minutesToHoursFloat(...values) {
64
- const minutes = values.filter(value => logic.isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
61
+ const minutes = values.filter((value) => logic.isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
65
62
  return minutes / 60;
66
63
  }
67
64
  function minutesToObject(...values) {
68
- const minutes = values.filter(value => logic.isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
65
+ const minutes = values.filter((value) => logic.isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
69
66
  return {
70
67
  hours: Math.floor(minutes / 60),
71
68
  minutes: minutes % 60
@@ -245,7 +242,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
245
242
  const _component_f_search_text_field = vue.resolveComponent("f-search-text-field");
246
243
  return vue.openBlock(), vue.createBlock(_component_f_search_text_field, {
247
244
  modelValue: _ctx.value,
248
- "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => _ctx.value = $event),
245
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
249
246
  class: "x-search-bar",
250
247
  maxlength: _ctx.maxLength
251
248
  }, {
@@ -254,12 +251,11 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
254
251
  "input-right": vue.withCtx(() => [vue.createElementVNode("button", _hoisted_1, [vue.createVNode(_component_f_icon, {
255
252
  name: "search",
256
253
  library: "f"
257
- }), vue.createTextVNode(), vue.createElementVNode("span", null, [vue.renderSlot(_ctx.$slots, "button-text", {}, () => [vue.createTextVNode(" Sök ")])])])]),
254
+ }), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("span", null, [vue.renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = vue.createTextVNode(" Sök "))])])])]),
258
255
  _: 3
259
- /* FORWARDED */
260
256
  }, 8, ["modelValue", "maxlength"]);
261
257
  }
262
- const XSearchBar = /* @__PURE__ */_export_sfc(_sfc_main, [["render", _sfc_render]]);
258
+ const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
263
259
  exports.HOURS_MINUTES_REGEXP = HOURS_MINUTES_REGEXP;
264
260
  exports.HOURS_MINUTES_WITHOUT_COLON_REGEXP = HOURS_MINUTES_WITHOUT_COLON_REGEXP;
265
261
  exports.HoursMinutesValidatorUtils = HoursMinutesValidatorUtils;
@@ -273,4 +269,5 @@ exports.minutesToHoursMinutesString = minutesToHoursMinutesString;
273
269
  exports.minutesToObject = minutesToObject;
274
270
  exports.minutesToUserFriendlyString = minutesToUserFriendlyString;
275
271
  exports.parseTimeToNumber = parseTimeToNumber;
276
- exports.splitHoursMinutes = splitHoursMinutes;
272
+ exports.splitHoursMinutes = splitHoursMinutes;
273
+ //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","logic","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","value2","String","join","stripWhitespace","_a","groups","_b","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","_sfc_main$1","vue","defineComponent","extends","vue$1","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","textFieldTableMode","inject","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement","_sfc_main","components","FIcon","FSearchTextField","modelValue","emits","computed","get","set","$emit","_hoisted_1","class","_component_f_search_text_field","resolveComponent","openBlock","createBlock","_ctx","_cache","$event","maxlength","withCtx","renderSlot","$slots","tooltip","createElementVNode","createVNode","_component_f_icon","library","createTextVNode","_"],"sources":["../src/components/XTimeTextField/utils/constants.ts","../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../src/components/XTimeTextField/validators/MinTimeValidator.ts","../src/components/XTimeTextField/validators/index.ts","../src/components/XTimeTextField/XTimeTextField.vue","../src/components/XSearchBar/XSearchBar.vue"],"sourcesContent":["export const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n// A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\nexport type HoursMinutesString = string;\n\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, inject } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup() {\n return {\n textFieldTableMode: inject(\"textFieldTableMode\", false) as boolean,\n };\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n","<template>\n <f-search-text-field v-model=\"value\" class=\"x-search-bar\" :maxlength=\"maxLength\">\n <template #default>\n <!-- @slot Slot for input label -->\n <slot></slot>\n </template>\n <template #tooltip>\n <!-- @slot Slot for tooltip -->\n <slot name=\"tooltip\"></slot>\n </template>\n <template #input-right>\n <button class=\"button button--primary search-bar-button\" type=\"submit\" data-test=\"search-bar-submit\">\n <f-icon name=\"search\" library=\"f\"></f-icon>\n <span>\n <!-- @slot Slot for text in button -->\n <slot name=\"button-text\"> Sök </slot>\n </span>\n </button>\n </template>\n </f-search-text-field>\n</template>\n<script lang=\"ts\">\nimport { FIcon, FSearchTextField } from \"@fkui/vue\";\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"XSearchBar\",\n components: {\n FIcon,\n FSearchTextField,\n },\n props: {\n modelValue: {\n type: String,\n required: true,\n },\n maxLength: {\n type: Number,\n default: 20,\n },\n },\n emits: [\"update:modelValue\", \"changedValue\"],\n computed: {\n value: {\n get() {\n return this.modelValue;\n },\n set(value: string) {\n if (this.value !== value) {\n /**\n * Event that is dispatched when the value is changed and differs from the previous value.\n *\n * @event changedValue\n */\n this.$emit(\"changedValue\", [this.value, value]);\n }\n /**\n * V-model event.\n *\n * @event update:modelValue\n * @type {string}\n */\n this.$emit(\"update:modelValue\", value);\n },\n },\n },\n});\n</script>\n<style lang=\"scss\">\n@import \"./XSearchBar.scss\";\n</style>\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/components/XTimeTextField/utils/constants.ts","../../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../../src/components/XTimeTextField/validators/MinTimeValidator.ts","../../src/components/XTimeTextField/validators/index.ts","../../src/components/XTimeTextField/XTimeTextField.vue","../../src/components/XSearchBar/XSearchBar.vue"],"sourcesContent":["export const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n// A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\nexport type HoursMinutesString = string;\n\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, inject } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup() {\n return {\n textFieldTableMode: inject(\"textFieldTableMode\", false) as boolean,\n };\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n","<template>\n <f-search-text-field v-model=\"value\" class=\"x-search-bar\" :maxlength=\"maxLength\">\n <template #default>\n <!-- @slot Slot for input label -->\n <slot></slot>\n </template>\n <template #tooltip>\n <!-- @slot Slot for tooltip -->\n <slot name=\"tooltip\"></slot>\n </template>\n <template #input-right>\n <button class=\"button button--primary search-bar-button\" type=\"submit\" data-test=\"search-bar-submit\">\n <f-icon name=\"search\" library=\"f\"></f-icon>\n <span>\n <!-- @slot Slot for text in button -->\n <slot name=\"button-text\"> Sök </slot>\n </span>\n </button>\n </template>\n </f-search-text-field>\n</template>\n<script lang=\"ts\">\nimport { FIcon, FSearchTextField } from \"@fkui/vue\";\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"XSearchBar\",\n components: {\n FIcon,\n FSearchTextField,\n },\n props: {\n modelValue: {\n type: String,\n required: true,\n },\n maxLength: {\n type: Number,\n default: 20,\n },\n },\n emits: [\"update:modelValue\", \"changedValue\"],\n computed: {\n value: {\n get() {\n return this.modelValue;\n },\n set(value: string) {\n if (this.value !== value) {\n /**\n * Event that is dispatched when the value is changed and differs from the previous value.\n *\n * @event changedValue\n */\n this.$emit(\"changedValue\", [this.value, value]);\n }\n /**\n * V-model event.\n *\n * @event update:modelValue\n * @type {string}\n */\n this.$emit(\"update:modelValue\", value);\n },\n },\n },\n});\n</script>\n<style lang=\"scss\">\n@import \"./XSearchBar.scss\";\n</style>\n"],"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","String","join","stripWhitespace","groups","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","textFieldTableMode","inject","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement","components","FIcon","FSearchTextField","modelValue","emits","computed","get","set","$emit","_hoisted_1","class","_component_f_search_text_field","_resolveComponent","_openBlock","_ctx","_cache","$event","maxlength","_renderSlot","$slots","_withCtx","_createElementVNode","_createVNode","_component_f_icon","_createTextVNode"],"mappings":"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"}
@@ -21,7 +21,7 @@ function hoursMinutesStringToMinutes(valueString, extraForgiving = false) {
21
21
  if (isEmpty(valueString.trim())) {
22
22
  return void 0;
23
23
  }
24
- const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(value => parseInt(value, 10));
24
+ const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map((value) => parseInt(value, 10));
25
25
  const totalMinutes = hours * 60 + minutes;
26
26
  return !isNaN(totalMinutes) ? totalMinutes : void 0;
27
27
  }
@@ -33,7 +33,7 @@ function minutesToHoursMinutesString(value) {
33
33
  hours,
34
34
  minutes
35
35
  } = minutesToObject(safeValue);
36
- valueString = [hours, minutes].map(value2 => String(value2).padStart(2, "0")).join(":");
36
+ valueString = [hours, minutes].map((value2) => String(value2).padStart(2, "0")).join(":");
37
37
  }
38
38
  return stripWhitespace(valueString);
39
39
  }
@@ -56,11 +56,11 @@ function minutesToUserFriendlyString(value) {
56
56
  });
57
57
  }
58
58
  function minutesToHoursFloat(...values) {
59
- const minutes = values.filter(value => isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
59
+ const minutes = values.filter((value) => isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
60
60
  return minutes / 60;
61
61
  }
62
62
  function minutesToObject(...values) {
63
- const minutes = values.filter(value => isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
63
+ const minutes = values.filter((value) => isSet(value) && !isNaN(value)).reduce((sum, value) => sum + value, 0);
64
64
  return {
65
65
  hours: Math.floor(minutes / 60),
66
66
  minutes: minutes % 60
@@ -240,7 +240,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
240
240
  const _component_f_search_text_field = resolveComponent("f-search-text-field");
241
241
  return openBlock(), createBlock(_component_f_search_text_field, {
242
242
  modelValue: _ctx.value,
243
- "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => _ctx.value = $event),
243
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
244
244
  class: "x-search-bar",
245
245
  maxlength: _ctx.maxLength
246
246
  }, {
@@ -249,10 +249,25 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
249
249
  "input-right": withCtx(() => [createElementVNode("button", _hoisted_1, [createVNode(_component_f_icon, {
250
250
  name: "search",
251
251
  library: "f"
252
- }), createTextVNode(), createElementVNode("span", null, [renderSlot(_ctx.$slots, "button-text", {}, () => [createTextVNode(" Sök ")])])])]),
252
+ }), _cache[2] || (_cache[2] = createTextVNode()), createElementVNode("span", null, [renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = createTextVNode(" Sök "))])])])]),
253
253
  _: 3
254
- /* FORWARDED */
255
254
  }, 8, ["modelValue", "maxlength"]);
256
255
  }
257
- const XSearchBar = /* @__PURE__ */_export_sfc(_sfc_main, [["render", _sfc_render]]);
258
- export { HOURS_MINUTES_REGEXP, HOURS_MINUTES_WITHOUT_COLON_REGEXP, HoursMinutesValidatorUtils, XSearchBar, _sfc_main$1 as XTimeTextField, forgivingParseTimeToNumber, formatNumberToTime, hoursMinutesStringToMinutes, minutesToHoursFloat, minutesToHoursMinutesString, minutesToObject, minutesToUserFriendlyString, parseTimeToNumber, splitHoursMinutes };
256
+ const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
257
+ export {
258
+ HOURS_MINUTES_REGEXP,
259
+ HOURS_MINUTES_WITHOUT_COLON_REGEXP,
260
+ HoursMinutesValidatorUtils,
261
+ XSearchBar,
262
+ _sfc_main$1 as XTimeTextField,
263
+ forgivingParseTimeToNumber,
264
+ formatNumberToTime,
265
+ hoursMinutesStringToMinutes,
266
+ minutesToHoursFloat,
267
+ minutesToHoursMinutesString,
268
+ minutesToObject,
269
+ minutesToUserFriendlyString,
270
+ parseTimeToNumber,
271
+ splitHoursMinutes
272
+ };
273
+ //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","value2","String","join","stripWhitespace","_a","groups","_b","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","_sfc_main$1","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","textFieldTableMode","inject","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement","_sfc_main","components","FIcon","FSearchTextField","modelValue","emits","computed","get","set","$emit","_hoisted_1","class","_component_f_search_text_field","resolveComponent","openBlock","createBlock","_ctx","_cache","$event","maxlength","withCtx","renderSlot","$slots","tooltip","createElementVNode","createVNode","_component_f_icon","library","createTextVNode","_"],"sources":["../src/components/XTimeTextField/utils/constants.ts","../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../src/components/XTimeTextField/validators/MinTimeValidator.ts","../src/components/XTimeTextField/validators/index.ts","../src/components/XTimeTextField/XTimeTextField.vue","../src/components/XSearchBar/XSearchBar.vue"],"sourcesContent":["export const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n// A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\nexport type HoursMinutesString = string;\n\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, inject } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup() {\n return {\n textFieldTableMode: inject(\"textFieldTableMode\", false) as boolean,\n };\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n","<template>\n <f-search-text-field v-model=\"value\" class=\"x-search-bar\" :maxlength=\"maxLength\">\n <template #default>\n <!-- @slot Slot for input label -->\n <slot></slot>\n </template>\n <template #tooltip>\n <!-- @slot Slot for tooltip -->\n <slot name=\"tooltip\"></slot>\n </template>\n <template #input-right>\n <button class=\"button button--primary search-bar-button\" type=\"submit\" data-test=\"search-bar-submit\">\n <f-icon name=\"search\" library=\"f\"></f-icon>\n <span>\n <!-- @slot Slot for text in button -->\n <slot name=\"button-text\"> Sök </slot>\n </span>\n </button>\n </template>\n </f-search-text-field>\n</template>\n<script lang=\"ts\">\nimport { FIcon, FSearchTextField } from \"@fkui/vue\";\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"XSearchBar\",\n components: {\n FIcon,\n FSearchTextField,\n },\n props: {\n modelValue: {\n type: String,\n required: true,\n },\n maxLength: {\n type: Number,\n default: 20,\n },\n },\n emits: [\"update:modelValue\", \"changedValue\"],\n computed: {\n value: {\n get() {\n return this.modelValue;\n },\n set(value: string) {\n if (this.value !== value) {\n /**\n * Event that is dispatched when the value is changed and differs from the previous value.\n *\n * @event changedValue\n */\n this.$emit(\"changedValue\", [this.value, value]);\n }\n /**\n * V-model event.\n *\n * @event update:modelValue\n * @type {string}\n */\n this.$emit(\"update:modelValue\", value);\n },\n },\n },\n});\n</script>\n<style lang=\"scss\">\n@import \"./XSearchBar.scss\";\n</style>\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/components/XTimeTextField/utils/constants.ts","../../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../../src/components/XTimeTextField/validators/MinTimeValidator.ts","../../src/components/XTimeTextField/validators/index.ts","../../src/components/XTimeTextField/XTimeTextField.vue","../../src/components/XSearchBar/XSearchBar.vue"],"sourcesContent":["export const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n// A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\nexport type HoursMinutesString = string;\n\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, inject } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup() {\n return {\n textFieldTableMode: inject(\"textFieldTableMode\", false) as boolean,\n };\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n","<template>\n <f-search-text-field v-model=\"value\" class=\"x-search-bar\" :maxlength=\"maxLength\">\n <template #default>\n <!-- @slot Slot for input label -->\n <slot></slot>\n </template>\n <template #tooltip>\n <!-- @slot Slot for tooltip -->\n <slot name=\"tooltip\"></slot>\n </template>\n <template #input-right>\n <button class=\"button button--primary search-bar-button\" type=\"submit\" data-test=\"search-bar-submit\">\n <f-icon name=\"search\" library=\"f\"></f-icon>\n <span>\n <!-- @slot Slot for text in button -->\n <slot name=\"button-text\"> Sök </slot>\n </span>\n </button>\n </template>\n </f-search-text-field>\n</template>\n<script lang=\"ts\">\nimport { FIcon, FSearchTextField } from \"@fkui/vue\";\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"XSearchBar\",\n components: {\n FIcon,\n FSearchTextField,\n },\n props: {\n modelValue: {\n type: String,\n required: true,\n },\n maxLength: {\n type: Number,\n default: 20,\n },\n },\n emits: [\"update:modelValue\", \"changedValue\"],\n computed: {\n value: {\n get() {\n return this.modelValue;\n },\n set(value: string) {\n if (this.value !== value) {\n /**\n * Event that is dispatched when the value is changed and differs from the previous value.\n *\n * @event changedValue\n */\n this.$emit(\"changedValue\", [this.value, value]);\n }\n /**\n * V-model event.\n *\n * @event update:modelValue\n * @type {string}\n */\n this.$emit(\"update:modelValue\", value);\n },\n },\n },\n});\n</script>\n<style lang=\"scss\">\n@import \"./XSearchBar.scss\";\n</style>\n"],"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","String","join","stripWhitespace","groups","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","textFieldTableMode","inject","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement","components","FIcon","FSearchTextField","modelValue","emits","computed","get","set","$emit","_hoisted_1","class","_component_f_search_text_field","_resolveComponent","_openBlock","_ctx","_cache","$event","maxlength","_renderSlot","$slots","_withCtx","_createElementVNode","_createVNode","_component_f_icon","_createTextVNode"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ .x-search-bar .text-field__input-wrapper {
2
+ gap: 0;
3
+ }
4
+ .x-search-bar input {
5
+ border-right: 0;
6
+ border-top-right-radius: 0;
7
+ border-bottom-right-radius: 0;
8
+ }
9
+ .x-search-bar .button.button--primary {
10
+ margin-bottom: 0;
11
+ margin-top: 0;
12
+ border-top-left-radius: 0;
13
+ border-bottom-left-radius: 0;
14
+ width: auto;
15
+ padding: 0.25rem 0.75rem;
16
+ height: var(--f-height-large);
17
+ min-width: 6rem;
18
+ }