@fkui/vue-labs 5.44.0 → 5.45.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.
@@ -158,7 +158,7 @@ const validators = [hoursMinutesValidator, greaterThanTimeValidator, lessThanTim
158
158
  for (const validator of validators) {
159
159
  logic.ValidationService.registerValidator(validator);
160
160
  }
161
- const _sfc_main$1 = vue.defineComponent({
161
+ const _sfc_main = vue.defineComponent({
162
162
  name: "XTimeTextField",
163
163
  extends: vue$1.FTextField,
164
164
  mixins: [vue$1.TranslationMixin],
@@ -192,73 +192,10 @@ const _sfc_main$1 = vue.defineComponent({
192
192
  logic.ValidationService.validateElement(inputElement);
193
193
  }
194
194
  });
195
- const _sfc_main = vue.defineComponent({
196
- name: "XSearchBar",
197
- components: {
198
- FIcon: vue$1.FIcon,
199
- FSearchTextField: vue$1.FSearchTextField
200
- },
201
- props: {
202
- modelValue: {
203
- type: String,
204
- required: true
205
- },
206
- maxLength: {
207
- type: Number,
208
- default: 20
209
- }
210
- },
211
- emits: ["update:modelValue", "changedValue"],
212
- computed: {
213
- value: {
214
- get() {
215
- return this.modelValue;
216
- },
217
- set(value) {
218
- if (this.value !== value) {
219
- this.$emit("changedValue", [this.value, value]);
220
- }
221
- this.$emit("update:modelValue", value);
222
- }
223
- }
224
- }
225
- });
226
- const _export_sfc = (sfc, props) => {
227
- const target = sfc.__vccOpts || sfc;
228
- for (const [key, val] of props) {
229
- target[key] = val;
230
- }
231
- return target;
232
- };
233
- const _hoisted_1 = {
234
- class: "button button--primary search-bar-button",
235
- type: "submit",
236
- "data-test": "search-bar-submit"
237
- };
238
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
239
- const _component_f_icon = vue.resolveComponent("f-icon");
240
- const _component_f_search_text_field = vue.resolveComponent("f-search-text-field");
241
- return vue.openBlock(), vue.createBlock(_component_f_search_text_field, {
242
- modelValue: _ctx.value,
243
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
244
- class: "x-search-bar",
245
- maxlength: _ctx.maxLength
246
- }, {
247
- default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "default")]),
248
- tooltip: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "tooltip")]),
249
- "input-right": vue.withCtx(() => [vue.createElementVNode("button", _hoisted_1, [vue.createVNode(_component_f_icon, {
250
- name: "search",
251
- library: "f"
252
- }), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("span", null, [vue.renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = vue.createTextVNode(" Sök "))])])])]),
253
- _: 3
254
- }, 8, ["modelValue", "maxlength"]);
255
- }
256
- const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
257
195
  exports.HOURS_MINUTES_REGEXP = HOURS_MINUTES_REGEXP;
258
196
  exports.HOURS_MINUTES_WITHOUT_COLON_REGEXP = HOURS_MINUTES_WITHOUT_COLON_REGEXP;
259
197
  exports.HoursMinutesValidatorUtils = HoursMinutesValidatorUtils;
260
- exports.XSearchBar = XSearchBar;
261
- exports.XTimeTextField = _sfc_main$1;
198
+ exports.XTimeTextField = _sfc_main;
262
199
  exports.forgivingParseTimeToNumber = forgivingParseTimeToNumber;
263
200
  exports.formatNumberToTime = formatNumberToTime;
264
201
  exports.hoursMinutesStringToMinutes = hoursMinutesStringToMinutes;
@@ -1 +1 @@
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":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\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\n/**\n * @public\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\n/**\n * @public\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\n/**\n * @public\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 *\n * @public\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 * @public\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 * @public\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/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\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\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\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/**\n * @public\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 } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction, useTextFieldSetup } 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(props) {\n return useTextFieldSetup(props);\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","useTextFieldSetup","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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"}
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"],"sourcesContent":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\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\n/**\n * @public\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\n/**\n * @public\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\n/**\n * @public\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 *\n * @public\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 * @public\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 * @public\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/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\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\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\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/**\n * @public\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 } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction, useTextFieldSetup } 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(props) {\n return useTextFieldSetup(props);\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"],"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","useTextFieldSetup","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { isEmpty, stripWhitespace, TranslationService, isSet, ValidationService } from "@fkui/logic";
2
- import { defineComponent, resolveComponent, openBlock, createBlock, withCtx, renderSlot, createElementVNode, createVNode, createTextVNode } from "vue";
3
- import { FTextField, TranslationMixin, useTextFieldSetup, FIcon, FSearchTextField } from "@fkui/vue";
2
+ import { defineComponent } from "vue";
3
+ import { FTextField, TranslationMixin, useTextFieldSetup } from "@fkui/vue";
4
4
  const HOURS_MINUTES_REGEXP = /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;
5
5
  const HOURS_MINUTES_WITHOUT_COLON_REGEXP = /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;
6
6
  function findMatch(regexps, value) {
@@ -156,7 +156,7 @@ const validators = [hoursMinutesValidator, greaterThanTimeValidator, lessThanTim
156
156
  for (const validator of validators) {
157
157
  ValidationService.registerValidator(validator);
158
158
  }
159
- const _sfc_main$1 = defineComponent({
159
+ const _sfc_main = defineComponent({
160
160
  name: "XTimeTextField",
161
161
  extends: FTextField,
162
162
  mixins: [TranslationMixin],
@@ -190,74 +190,11 @@ const _sfc_main$1 = defineComponent({
190
190
  ValidationService.validateElement(inputElement);
191
191
  }
192
192
  });
193
- const _sfc_main = defineComponent({
194
- name: "XSearchBar",
195
- components: {
196
- FIcon,
197
- FSearchTextField
198
- },
199
- props: {
200
- modelValue: {
201
- type: String,
202
- required: true
203
- },
204
- maxLength: {
205
- type: Number,
206
- default: 20
207
- }
208
- },
209
- emits: ["update:modelValue", "changedValue"],
210
- computed: {
211
- value: {
212
- get() {
213
- return this.modelValue;
214
- },
215
- set(value) {
216
- if (this.value !== value) {
217
- this.$emit("changedValue", [this.value, value]);
218
- }
219
- this.$emit("update:modelValue", value);
220
- }
221
- }
222
- }
223
- });
224
- const _export_sfc = (sfc, props) => {
225
- const target = sfc.__vccOpts || sfc;
226
- for (const [key, val] of props) {
227
- target[key] = val;
228
- }
229
- return target;
230
- };
231
- const _hoisted_1 = {
232
- class: "button button--primary search-bar-button",
233
- type: "submit",
234
- "data-test": "search-bar-submit"
235
- };
236
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
237
- const _component_f_icon = resolveComponent("f-icon");
238
- const _component_f_search_text_field = resolveComponent("f-search-text-field");
239
- return openBlock(), createBlock(_component_f_search_text_field, {
240
- modelValue: _ctx.value,
241
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
242
- class: "x-search-bar",
243
- maxlength: _ctx.maxLength
244
- }, {
245
- default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
246
- tooltip: withCtx(() => [renderSlot(_ctx.$slots, "tooltip")]),
247
- "input-right": withCtx(() => [createElementVNode("button", _hoisted_1, [createVNode(_component_f_icon, {
248
- name: "search",
249
- library: "f"
250
- }), _cache[2] || (_cache[2] = createTextVNode()), createElementVNode("span", null, [renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = createTextVNode(" Sök "))])])])]),
251
- _: 3
252
- }, 8, ["modelValue", "maxlength"]);
253
- }
254
- const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
255
193
  export {
256
194
  HOURS_MINUTES_REGEXP,
257
195
  HOURS_MINUTES_WITHOUT_COLON_REGEXP,
258
196
  HoursMinutesValidatorUtils,
259
- XSearchBar,
260
- _sfc_main$1 as XTimeTextField,
197
+ _sfc_main as XTimeTextField,
261
198
  forgivingParseTimeToNumber,
262
199
  formatNumberToTime,
263
200
  hoursMinutesStringToMinutes,
@@ -1 +1 @@
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":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\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\n/**\n * @public\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\n/**\n * @public\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\n/**\n * @public\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 *\n * @public\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 * @public\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 * @public\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/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\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\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\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/**\n * @public\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 } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction, useTextFieldSetup } 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(props) {\n return useTextFieldSetup(props);\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","useTextFieldSetup","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":";;;AAGO,MAAMA,uBACT;AAKG,MAAMC,qCACT;ACEJ,SAASC,UAAUC,SAAmBC,OAAwC;AAC1E,aAAWC,UAAUF,SAAS;AACpB,UAAAG,QAAQF,MAAME,MAAMD,MAAM;AAEhC,QAAIC,OAAO;AACA,aAAAA;AAAAA,IACX;AAAA,EACJ;AAEO,SAAA;AACX;AAEA,SAASC,gBAAgBH,OAA2BI,YAAY,GAAW;AAAA,MAAAC;AACvEL,WAAAK,SAAQL,mBAASK,WAAA,SAAAA,SAAA;AACV,SAAAL,MAAMM,SAASF,WAAW,GAAG;AACxC;AAKgB,SAAAG,4BACZC,aACAC,iBAAiB,OACC;AAClB,MAAIC,QAAQF,YAAYG,KAAK,CAAC,GAAG;AACtB,WAAA;AAAA,EACX;AAEA,QAAM,CAACC,OAAOC,OAAO,IAAIC,kBAAkBN,aAAaC,cAAc,EAAEM,IACnEf,WAAUgB,SAAShB,OAAO,EAAE,CACjC;AACM,QAAAiB,eAAeL,QAAQ,KAAKC;AAElC,SAAO,CAACK,MAAMD,YAAY,IAAIA,eAAe;AACjD;AAKO,SAASE,4BACZnB,OACkB;AAClB,MAAIQ,cAAc;AAClB,QAAMY,YAAYpB,UAAS,QAATA,UAAAA,SAAAA,QAASqB;AACvB,MAAA,CAACH,MAAME,SAAS,GAAG;AACnB,UAAM;AAAA,MAAER;AAAAA,MAAOC;AAAAA,IAAQ,IAAIS,gBAAgBF,SAAS;AACpDZ,kBAAc,CAACI,OAAOC,OAAO,EACxBE,IAAKf,YAAUuB,OAAOvB,MAAK,EAAEM,SAAS,GAAG,GAAG,CAAC,EAC7CkB,KAAK,GAAG;AAAA,EACjB;AAEA,SAAOC,gBAAgBjB,WAAW;AACtC;AAKgB,SAAAM,kBACZN,aACAC,iBAAiB,OACT;;AACR,QAAMV,UAAUU,iBACV,CAACZ,oCAAoCD,oBAAoB,IACzD,CAACA,oBAAoB;AAC3B,QAAMM,QAAQJ,UAAUC,SAAS0B,gBAAgBjB,WAAW,CAAC;AAE7D,MAAI,CAACN,OAAO;AACD,WAAA,CAAC,IAAI,EAAE;AAAA,EAClB;AAEA,QAAMU,QAAQT,iBAAgBD,oCAAOwB,WAAPxB,mBAAeU,KAAK;AAClD,QAAMC,UAAUV,iBAAgBD,oCAAOwB,WAAPxB,mBAAeW,OAAO;AAE/C,SAAA,CAACD,OAAOC,OAAO;AAC1B;AAUO,SAASc,4BAA4B3B,OAAuB;AACzD,QAAA,CAACY,OAAOC,OAAO,IAAIC,kBACrBK,4BAA4BnB,KAAK,CACrC,EAAEe,IAAIa,MAAM;AAEZ,SAAOC,mBAAmBC,SAASC,UAC/B,6CACA,4CACA;AAAA,IAAEnB;AAAAA,IAAOC;AAAAA,EAAQ,CACrB;AACJ;AAcO,SAASmB,uBACTC,QACG;AACN,QAAMpB,UAAUoB,OACXC,OAAQlC,WAA2BmC,MAAMnC,KAAK,KAAK,CAACkB,MAAMlB,KAAK,CAAC,EAChEoC,OAAO,CAACC,KAAKrC,UAAUqC,MAAMrC,OAAO,CAAC;AAE1C,SAAOa,UAAU;AACrB;AAcO,SAASS,mBAAmBW,QAGjC;AACE,QAAMpB,UAAUoB,OACXC,OAAQlC,WAA2BmC,MAAMnC,KAAK,KAAK,CAACkB,MAAMlB,KAAK,CAAC,EAChEoC,OAAO,CAACC,KAAKrC,UAAUqC,MAAMrC,OAAO,CAAC;AAEnC,SAAA;AAAA,IACHY,OAAO0B,KAAKC,MAAM1B,UAAU,EAAE;AAAA,IAC9BA,SAASA,UAAU;AAAA,EACvB;AACJ;AC3IO,SAAS2B,mBACZxC,OAC8B;AAC9B,MAAI,OAAOA,UAAU,YAAYkB,MAAMlB,KAAK,GAAG;AACpC,WAAA;AAAA,EACX;AAEA,SAAOmB,4BAA4BnB,KAAK;AAC5C;AAEA,SAASyC,6BACLzC,OACAS,gBACkB;AAAA,MAAAiC;AACd,MAAA,OAAO1C,UAAU,UAAU;AACpB,WAAA;AAAA,EACX;AAEA,QAAM2C,eACFD,wBAAAnC,4BAA4BP,OAAOS,cAAc,OAAKiC,QAAAA,0BAAAA,SAAAA,wBAAArB;AAE1D,SAAO,CAACH,MAAMyB,WAAW,IAAIA,cAAc;AAC/C;AAKO,SAASC,kBAAkB5C,OAA2C;AAClE,SAAAyC,6BAA6BzC,OAAO,KAAK;AACpD;AAKO,SAAS6C,2BACZ7C,OACkB;AACX,SAAAyC,6BAA6BzC,OAAO,IAAI;AACnD;AC7CO,MAAM8C,2BAA2B;AAAA,EACpC,OAAcC,SACV/C,OACAgD,QACAC,MACAC,SACO;AACP,QAAIlD,UAAU,IAAI;AACP,aAAA;AAAA,IACX;AAEM,UAAAmD,QAAQH,OAAOC,IAAI;AACrB,QAAA,CAACd,MAAMgB,KAAK,GAAG;AACR,aAAA;AAAA,IACX;AAEM,UAAAC,gBACFN,2BAA2BO,oBAAoBL,MAAM;AACzD,UAAMM,gBAAgBF,cAAc7B,OAAOyB,OAAOC,IAAI,CAAC,CAAC;AACpD,QAAA,CAACd,MAAMmB,aAAa,GAAG;AACvB,YAAM,IAAIC,MAAM,UAAUN,IAAI,mBAAmB;AAAA,IACrD;AAEM,UAAAO,gBAAgBJ,cAAcpD,KAAK;AACrC,QAAA,CAACmC,MAAMqB,aAAa,GAAG;AAChB,aAAA;AAAA,IACX;AAEO,WAAAN,QAAQM,eAAeF,aAAa;AAAA,EAC/C;AAAA,EAEA,OAAcD,oBACVL,QAC4D;;AAExD,QAAA,CAACb,MAAMa,MAAM,KACb,CAACS,MAAMC,QAAQV,OAAOW,MAAM,KAC5B,CAACxB,OAAMa,YAAOW,WAAPX,mBAAgB,EAAE,KACzB,OAAOA,OAAOW,OAAO,CAAC,MAAM,YAC9B;AACS,aAAAf;AAAAA,IACX;AAEO,WAAAI,OAAOW,OAAO,CAAC;AAAA,EAG1B;AACJ;AC7CO,MAAMC,wBAAmC;AAAA,EAC5CX,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AAEH,WAAAtC,QAAQV,KAAK,KACbmC,MAAMW,2BAA2BO,oBAAoBL,MAAM,EAAEhD,KAAK,CAAC;AAAA,EAE3E;AACJ;ACdO,MAAM+D,2BAAsC;AAAA,EAC/Cd,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,SACA,CAAChD,QAAemD,UAAkB;AAC9B,aAAOnD,SAAQmD;AAAAA,IACnB,CACJ;AAAA,EACJ;AACJ;AChBO,MAAMa,wBAAmC;AAAA,EAC5Cf,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,SACA,CAAChD,QAAemD,UAAkB;AAC9B,aAAOnD,SAAQmD;AAAAA,IACnB,CACJ;AAAA,EACJ;AACJ;AChBO,MAAMc,mBAA8B;AAAA,EACvChB,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,KAAKC,MACL,CAACjD,QAAemD,UAAkB;AAC9B,aAAOnD,UAASmD;AAAAA,IACpB,CACJ;AAAA,EACJ;AACJ;AChBO,MAAMe,mBAA8B;AAAA,EACvCjB,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,KAAKC,MACL,CAACjD,QAAemD,UAAkB;AAC9B,aAAOnD,UAASmD;AAAAA,IACpB,CACJ;AAAA,EACJ;AACJ;ACjBA,MAAMgB,aAA0B,CAC5BP,uBACAG,0BACAC,uBACAC,kBACAC,gBAAA;AAGJ,WAAWE,aAAaD,YAAY;AAChCE,oBAAkBC,kBAAkBF,SAAS;AACjD;ACVA,MAAA,cAAeG,gBAAgB;AAAA,EAC3BtB,MAAM;AAAA,EACNuB,SAASC;AAAAA,EACTC,QAAQ,CAACC,gBAAgB;AAAA,EACzBC,OAAO;AAAA,IACHC,WAAW;AAAA,MACPC,MAAMC;AAAAA,MACNC,UAAU;AAAA,MACVC,SAASzC;AAAAA,IACb;AAAA,IACAmB,QAAQ;AAAA,MACJmB,MAAMC;AAAAA,MACNC,UAAU;AAAA,MACVC,SAASrC;AAAAA,IACb;AAAA,EACJ;AAAA,EACAsC,MAAMN,OAAO;AACT,WAAOO,kBAAkBP,KAAK;AAAA,EAClC;AAAA,EACAQ,UAAU;AACN,UAAMC,eAAiC,KAAKC,IAAIC,cAAc,OAAO;AAEjE,QAAA,CAACpD,MAAMkD,YAAY,GAAG;AACtB,YAAM,IAAI9B,MAAM,0DAA0D,KAAK+B,IAAIE,EAAE,EAAE;AAAA,IAC3F;AAEkBnB,sBAAAoB,uBACdJ,cACA;AAAA,MACIjF,WAAW;AAAA,QAAEsF,QAAQ;AAAA,MAAG;AAAA,MACxBC,cAAc,CAAA;AAAA,IAClB,GACA,IACJ;AAEaN,iBAAAO,aAAa,aAAa,SAAS;AAEhDvB,sBAAkBwB,gBAAgBR,YAAY;AAAA,EAClD;AACJ,CAAC;ACrBD,MAAA,YAAed,gBAAgB;AAAA,EAC3BtB,MAAM;AAAA,EACN6C,YAAY;AAAA,IACRC;AAAAA,IACAC;AAAAA,EACJ;AAAA,EACApB,OAAO;AAAA,IACHqB,YAAY;AAAA,MACRnB,MAAMvD;AAAAA,MACNyD,UAAU;AAAA,IACd;AAAA,IACA5E,WAAW;AAAA,MACP0E,MAAMlD;AAAAA,MACNqD,SAAS;AAAA,IACb;AAAA,EACJ;AAAA,EACAiB,OAAO,CAAC,qBAAqB,cAAc;AAAA,EAC3CC,UAAU;AAAA,IACNnG,OAAO;AAAA,MACHoG,MAAM;AACF,eAAO,KAAKH;AAAAA,MAChB;AAAA,MACAI,IAAIrG,OAAe;AACX,YAAA,KAAKA,UAAUA,OAAO;AAMtB,eAAKsG,MAAM,gBAAgB,CAAC,KAAKtG,OAAOA,KAAK,CAAC;AAAA,QAClD;AAOK,aAAAsG,MAAM,qBAAqBtG,KAAK;AAAA,MACzC;AAAA,IACJ;AAAA,EACJ;AACJ,CAAC;;;;;;;;MAvDwEuG,aAAS;AAAA,EAACC,OAAA;AAAA,EAAA1B,MAAA;AAAA;;;;AAQzD,QAAA2B,iCAAAC,iBAAA,qBAAA;SAnB1BC,UACkC3G,GAAAA,YAAAA,gCAAAA;AAAAA,IAAOiG,YAAMW,KAAA5G;AAAAA,IAAgB,uBAAWI,OAAS,CAAA,MAAAyG,OAAA,CAAA,IAAAC,YAAAF,KAAA5G,QAAA8G;AAAAA,IAAAN,OAAA;AAAA,IAChEO,WAAOH,KAAAxG;AAAAA,EAAA,GAAA;AAAA,4BAIP4G,WAAOJ,KAEcK,QAAA,SAAA,CAAA,CAAA;AAAA,4BAErBD,WAAWJ,KAOTK,QAAA,SAAA,CAAA,CAAA;AAAA,mBALLC,QAA2C,MAAA,CAAtBC,mBAAA,UAAAZ,YAAA,CAAAa,YAASC,mBAAG;AAAA,MAAApE,MAAA;AAAA;IACjC,CAAA,GAAA4D,OAEI,CAAqC,MAAAA,OAAA,CAAA,IAAAS,oBAfzDH,mBAAA,QAAA,MAAA,CAAAH,WAAAJ,KAAAK,QAAA,eAAA,CAAA,GAAA,MAAA,yDAAA,CAAA,CAAA;AAAA;;;;"}
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"],"sourcesContent":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\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\n/**\n * @public\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\n/**\n * @public\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\n/**\n * @public\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 *\n * @public\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 * @public\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 * @public\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/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\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\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\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/**\n * @public\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 } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction, useTextFieldSetup } 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(props) {\n return useTextFieldSetup(props);\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"],"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","useTextFieldSetup","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement"],"mappings":";;;AAGO,MAAMA,uBACT;AAKG,MAAMC,qCACT;ACEJ,SAASC,UAAUC,SAAmBC,OAAwC;AAC1E,aAAWC,UAAUF,SAAS;AACpB,UAAAG,QAAQF,MAAME,MAAMD,MAAM;AAEhC,QAAIC,OAAO;AACA,aAAAA;AAAAA,IACX;AAAA,EACJ;AAEO,SAAA;AACX;AAEA,SAASC,gBAAgBH,OAA2BI,YAAY,GAAW;AAAA,MAAAC;AACvEL,WAAAK,SAAQL,mBAASK,WAAA,SAAAA,SAAA;AACV,SAAAL,MAAMM,SAASF,WAAW,GAAG;AACxC;AAKgB,SAAAG,4BACZC,aACAC,iBAAiB,OACC;AAClB,MAAIC,QAAQF,YAAYG,KAAK,CAAC,GAAG;AACtB,WAAA;AAAA,EACX;AAEA,QAAM,CAACC,OAAOC,OAAO,IAAIC,kBAAkBN,aAAaC,cAAc,EAAEM,IACnEf,WAAUgB,SAAShB,OAAO,EAAE,CACjC;AACM,QAAAiB,eAAeL,QAAQ,KAAKC;AAElC,SAAO,CAACK,MAAMD,YAAY,IAAIA,eAAe;AACjD;AAKO,SAASE,4BACZnB,OACkB;AAClB,MAAIQ,cAAc;AAClB,QAAMY,YAAYpB,UAAS,QAATA,UAAAA,SAAAA,QAASqB;AACvB,MAAA,CAACH,MAAME,SAAS,GAAG;AACnB,UAAM;AAAA,MAAER;AAAAA,MAAOC;AAAAA,IAAQ,IAAIS,gBAAgBF,SAAS;AACpDZ,kBAAc,CAACI,OAAOC,OAAO,EACxBE,IAAKf,YAAUuB,OAAOvB,MAAK,EAAEM,SAAS,GAAG,GAAG,CAAC,EAC7CkB,KAAK,GAAG;AAAA,EACjB;AAEA,SAAOC,gBAAgBjB,WAAW;AACtC;AAKgB,SAAAM,kBACZN,aACAC,iBAAiB,OACT;;AACR,QAAMV,UAAUU,iBACV,CAACZ,oCAAoCD,oBAAoB,IACzD,CAACA,oBAAoB;AAC3B,QAAMM,QAAQJ,UAAUC,SAAS0B,gBAAgBjB,WAAW,CAAC;AAE7D,MAAI,CAACN,OAAO;AACD,WAAA,CAAC,IAAI,EAAE;AAAA,EAClB;AAEA,QAAMU,QAAQT,iBAAgBD,oCAAOwB,WAAPxB,mBAAeU,KAAK;AAClD,QAAMC,UAAUV,iBAAgBD,oCAAOwB,WAAPxB,mBAAeW,OAAO;AAE/C,SAAA,CAACD,OAAOC,OAAO;AAC1B;AAUO,SAASc,4BAA4B3B,OAAuB;AACzD,QAAA,CAACY,OAAOC,OAAO,IAAIC,kBACrBK,4BAA4BnB,KAAK,CACrC,EAAEe,IAAIa,MAAM;AAEZ,SAAOC,mBAAmBC,SAASC,UAC/B,6CACA,4CACA;AAAA,IAAEnB;AAAAA,IAAOC;AAAAA,EAAQ,CACrB;AACJ;AAcO,SAASmB,uBACTC,QACG;AACN,QAAMpB,UAAUoB,OACXC,OAAQlC,WAA2BmC,MAAMnC,KAAK,KAAK,CAACkB,MAAMlB,KAAK,CAAC,EAChEoC,OAAO,CAACC,KAAKrC,UAAUqC,MAAMrC,OAAO,CAAC;AAE1C,SAAOa,UAAU;AACrB;AAcO,SAASS,mBAAmBW,QAGjC;AACE,QAAMpB,UAAUoB,OACXC,OAAQlC,WAA2BmC,MAAMnC,KAAK,KAAK,CAACkB,MAAMlB,KAAK,CAAC,EAChEoC,OAAO,CAACC,KAAKrC,UAAUqC,MAAMrC,OAAO,CAAC;AAEnC,SAAA;AAAA,IACHY,OAAO0B,KAAKC,MAAM1B,UAAU,EAAE;AAAA,IAC9BA,SAASA,UAAU;AAAA,EACvB;AACJ;AC3IO,SAAS2B,mBACZxC,OAC8B;AAC9B,MAAI,OAAOA,UAAU,YAAYkB,MAAMlB,KAAK,GAAG;AACpC,WAAA;AAAA,EACX;AAEA,SAAOmB,4BAA4BnB,KAAK;AAC5C;AAEA,SAASyC,6BACLzC,OACAS,gBACkB;AAAA,MAAAiC;AACd,MAAA,OAAO1C,UAAU,UAAU;AACpB,WAAA;AAAA,EACX;AAEA,QAAM2C,eACFD,wBAAAnC,4BAA4BP,OAAOS,cAAc,OAAKiC,QAAAA,0BAAAA,SAAAA,wBAAArB;AAE1D,SAAO,CAACH,MAAMyB,WAAW,IAAIA,cAAc;AAC/C;AAKO,SAASC,kBAAkB5C,OAA2C;AAClE,SAAAyC,6BAA6BzC,OAAO,KAAK;AACpD;AAKO,SAAS6C,2BACZ7C,OACkB;AACX,SAAAyC,6BAA6BzC,OAAO,IAAI;AACnD;AC7CO,MAAM8C,2BAA2B;AAAA,EACpC,OAAcC,SACV/C,OACAgD,QACAC,MACAC,SACO;AACP,QAAIlD,UAAU,IAAI;AACP,aAAA;AAAA,IACX;AAEM,UAAAmD,QAAQH,OAAOC,IAAI;AACrB,QAAA,CAACd,MAAMgB,KAAK,GAAG;AACR,aAAA;AAAA,IACX;AAEM,UAAAC,gBACFN,2BAA2BO,oBAAoBL,MAAM;AACzD,UAAMM,gBAAgBF,cAAc7B,OAAOyB,OAAOC,IAAI,CAAC,CAAC;AACpD,QAAA,CAACd,MAAMmB,aAAa,GAAG;AACvB,YAAM,IAAIC,MAAM,UAAUN,IAAI,mBAAmB;AAAA,IACrD;AAEM,UAAAO,gBAAgBJ,cAAcpD,KAAK;AACrC,QAAA,CAACmC,MAAMqB,aAAa,GAAG;AAChB,aAAA;AAAA,IACX;AAEO,WAAAN,QAAQM,eAAeF,aAAa;AAAA,EAC/C;AAAA,EAEA,OAAcD,oBACVL,QAC4D;;AAExD,QAAA,CAACb,MAAMa,MAAM,KACb,CAACS,MAAMC,QAAQV,OAAOW,MAAM,KAC5B,CAACxB,OAAMa,YAAOW,WAAPX,mBAAgB,EAAE,KACzB,OAAOA,OAAOW,OAAO,CAAC,MAAM,YAC9B;AACS,aAAAf;AAAAA,IACX;AAEO,WAAAI,OAAOW,OAAO,CAAC;AAAA,EAG1B;AACJ;AC7CO,MAAMC,wBAAmC;AAAA,EAC5CX,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AAEH,WAAAtC,QAAQV,KAAK,KACbmC,MAAMW,2BAA2BO,oBAAoBL,MAAM,EAAEhD,KAAK,CAAC;AAAA,EAE3E;AACJ;ACdO,MAAM+D,2BAAsC;AAAA,EAC/Cd,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,SACA,CAAChD,QAAemD,UAAkB;AAC9B,aAAOnD,SAAQmD;AAAAA,IACnB,CACJ;AAAA,EACJ;AACJ;AChBO,MAAMa,wBAAmC;AAAA,EAC5Cf,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,SACA,CAAChD,QAAemD,UAAkB;AAC9B,aAAOnD,SAAQmD;AAAAA,IACnB,CACJ;AAAA,EACJ;AACJ;AChBO,MAAMc,mBAA8B;AAAA,EACvChB,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,KAAKC,MACL,CAACjD,QAAemD,UAAkB;AAC9B,aAAOnD,UAASmD;AAAAA,IACpB,CACJ;AAAA,EACJ;AACJ;AChBO,MAAMe,mBAA8B;AAAA,EACvCjB,MAAM;AAAA,EACNY,WACI7D,OACA8D,UACAd,QACO;AACP,WAAOF,2BAA2BC,SAC9B/C,OACAgD,QACA,KAAKC,MACL,CAACjD,QAAemD,UAAkB;AAC9B,aAAOnD,UAASmD;AAAAA,IACpB,CACJ;AAAA,EACJ;AACJ;ACjBA,MAAMgB,aAA0B,CAC5BP,uBACAG,0BACAC,uBACAC,kBACAC,gBAAA;AAGJ,WAAWE,aAAaD,YAAY;AAChCE,oBAAkBC,kBAAkBF,SAAS;AACjD;ACVA,MAAA,YAAeG,gBAAgB;AAAA,EAC3BtB,MAAM;AAAA,EACNuB,SAASC;AAAAA,EACTC,QAAQ,CAACC,gBAAgB;AAAA,EACzBC,OAAO;AAAA,IACHC,WAAW;AAAA,MACPC,MAAMC;AAAAA,MACNC,UAAU;AAAA,MACVC,SAASzC;AAAAA,IACb;AAAA,IACAmB,QAAQ;AAAA,MACJmB,MAAMC;AAAAA,MACNC,UAAU;AAAA,MACVC,SAASrC;AAAAA,IACb;AAAA,EACJ;AAAA,EACAsC,MAAMN,OAAO;AACT,WAAOO,kBAAkBP,KAAK;AAAA,EAClC;AAAA,EACAQ,UAAU;AACN,UAAMC,eAAiC,KAAKC,IAAIC,cAAc,OAAO;AAEjE,QAAA,CAACpD,MAAMkD,YAAY,GAAG;AACtB,YAAM,IAAI9B,MAAM,0DAA0D,KAAK+B,IAAIE,EAAE,EAAE;AAAA,IAC3F;AAEkBnB,sBAAAoB,uBACdJ,cACA;AAAA,MACIjF,WAAW;AAAA,QAAEsF,QAAQ;AAAA,MAAG;AAAA,MACxBC,cAAc,CAAA;AAAA,IAClB,GACA,IACJ;AAEaN,iBAAAO,aAAa,aAAa,SAAS;AAEhDvB,sBAAkBwB,gBAAgBR,YAAY;AAAA,EAClD;AACJ,CAAC;"}
@@ -108,624 +108,6 @@ export declare function parseTimeToNumber(value?: string | null): number | undef
108
108
  */
109
109
  export declare function splitHoursMinutes(valueString: string, extraForgiving?: boolean): string[];
110
110
 
111
- export declare const XSearchBar: DefineComponent<ExtractPropTypes< {
112
- modelValue: {
113
- type: StringConstructor;
114
- required: true;
115
- };
116
- maxLength: {
117
- type: NumberConstructor;
118
- default: number;
119
- };
120
- }>, {}, {}, {
121
- value: {
122
- get(): string;
123
- set(value: string): void;
124
- };
125
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("update:modelValue" | "changedValue")[], "update:modelValue" | "changedValue", PublicProps, Readonly<ExtractPropTypes< {
126
- modelValue: {
127
- type: StringConstructor;
128
- required: true;
129
- };
130
- maxLength: {
131
- type: NumberConstructor;
132
- default: number;
133
- };
134
- }>> & Readonly<{
135
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
136
- onChangedValue?: ((...args: any[]) => any) | undefined;
137
- }>, {
138
- maxLength: number;
139
- }, {}, {
140
- FIcon: DefineComponent<ExtractPropTypes< {
141
- name: {
142
- type: StringConstructor;
143
- required: true;
144
- };
145
- library: {
146
- type: StringConstructor;
147
- required: false;
148
- default: string;
149
- };
150
- flip: {
151
- type: PropType<string>;
152
- default: null;
153
- required: false;
154
- validator(value: string): boolean;
155
- };
156
- rotate: {
157
- type: PropType<string>;
158
- default: null;
159
- required: false;
160
- validator(value: string): boolean;
161
- };
162
- }>, {}, {}, {
163
- spriteKey(): string;
164
- spriteId(): string;
165
- modifiers(): string[];
166
- ariaHidden(): "true" | undefined;
167
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
168
- name: {
169
- type: StringConstructor;
170
- required: true;
171
- };
172
- library: {
173
- type: StringConstructor;
174
- required: false;
175
- default: string;
176
- };
177
- flip: {
178
- type: PropType<string>;
179
- default: null;
180
- required: false;
181
- validator(value: string): boolean;
182
- };
183
- rotate: {
184
- type: PropType<string>;
185
- default: null;
186
- required: false;
187
- validator(value: string): boolean;
188
- };
189
- }>> & Readonly<{}>, {
190
- library: string;
191
- flip: string;
192
- rotate: string;
193
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
194
- FSearchTextField: DefineComponent<ExtractPropTypes< {
195
- id: {
196
- type: StringConstructor;
197
- required: false;
198
- default: () => string;
199
- };
200
- modelValue: {
201
- type: StringConstructor;
202
- required: false;
203
- default: string;
204
- };
205
- clearableScreenReaderText: {
206
- type: StringConstructor;
207
- required: false;
208
- default: string;
209
- };
210
- maxLength: {
211
- type: NumberConstructor;
212
- default: number;
213
- };
214
- }>, {}, {
215
- defaultText: string;
216
- }, {
217
- canClear(): boolean;
218
- }, {
219
- clear(): void;
220
- onInput(event: Event): void;
221
- onChange(event: Event): void;
222
- onBlur(event: Event): void;
223
- onUpdate(event: Event): void;
224
- }, ComponentOptionsMixin, ComponentOptionsMixin, ("blur" | "change" | "update:modelValue" | "update")[], "blur" | "change" | "update:modelValue" | "update", PublicProps, Readonly<ExtractPropTypes< {
225
- id: {
226
- type: StringConstructor;
227
- required: false;
228
- default: () => string;
229
- };
230
- modelValue: {
231
- type: StringConstructor;
232
- required: false;
233
- default: string;
234
- };
235
- clearableScreenReaderText: {
236
- type: StringConstructor;
237
- required: false;
238
- default: string;
239
- };
240
- maxLength: {
241
- type: NumberConstructor;
242
- default: number;
243
- };
244
- }>> & Readonly<{
245
- onBlur?: ((...args: any[]) => any) | undefined;
246
- onChange?: ((...args: any[]) => any) | undefined;
247
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
248
- onUpdate?: ((...args: any[]) => any) | undefined;
249
- }>, {
250
- id: string;
251
- modelValue: string;
252
- maxLength: number;
253
- clearableScreenReaderText: string;
254
- }, {}, {
255
- FTextField: DefineComponent<ExtractPropTypes< {
256
- id: {
257
- type: StringConstructor;
258
- required: false;
259
- default: () => string;
260
- };
261
- inline: {
262
- type: BooleanConstructor;
263
- required: false;
264
- default: boolean;
265
- };
266
- modelValue: {
267
- type: (StringConstructor | NumberConstructor)[];
268
- required: false;
269
- default: string;
270
- };
271
- type: {
272
- type: StringConstructor;
273
- required: false;
274
- default: string;
275
- };
276
- formatter: {
277
- type: PropType<FormatFunction<any>>;
278
- required: false;
279
- default: undefined;
280
- };
281
- parser: {
282
- type: PropType<ParseFunction<any>>;
283
- required: false;
284
- default: undefined;
285
- };
286
- labelWidth: {
287
- type: StringConstructor;
288
- required: false;
289
- default: string;
290
- };
291
- inputWidth: {
292
- type: StringConstructor;
293
- required: false;
294
- default: string;
295
- };
296
- options: {
297
- type: PropType<string[] | undefined>;
298
- required: false;
299
- default: () => undefined;
300
- };
301
- }>, {
302
- textFieldTableMode: boolean;
303
- viewValue: Ref<string, string>;
304
- onOptionSelected: (value: string) => void;
305
- dropdownId: string;
306
- dropdownIsOpen: Readonly<Ref<boolean, boolean>>;
307
- dropdownOptions: Readonly<Ref<string[], string[]>>;
308
- activeOptionId: string;
309
- activeOption: Readonly<Ref<string | null, string | null>>;
310
- toggleDropdown: () => void;
311
- selectOption: (value: string) => void;
312
- closeDropdown: () => void;
313
- }, {
314
- showErrorPopup: boolean;
315
- lastModelValue: unknown;
316
- validationMessage: string;
317
- validityMode: string;
318
- isAfterInitialRender: boolean;
319
- defaultText: string;
320
- descriptionText: string;
321
- descriptionScreenReaderText: string;
322
- discreteDescriptionText: string;
323
- discreteDescriptionScreenReaderText: string;
324
- }, {
325
- showPopupError(): boolean;
326
- labelClass(): string;
327
- isValid(): boolean;
328
- hasError(): boolean;
329
- rootClass(): Record<string, boolean>;
330
- labelWrapperClass(): string | undefined;
331
- inputWrapperClass(): string | undefined;
332
- isModelUpdatedProgrammatically(): boolean;
333
- }, {
334
- onDropdownSelect(value: string): void;
335
- onDropdownClose(): void;
336
- getErrorPopupAnchor(): HTMLElement;
337
- closePopupError(): void;
338
- onChange(): Promise<void>;
339
- onFocus(): void;
340
- onBlur(): Promise<void>;
341
- onValidity({ detail }: CustomEvent<ValidityEvent>): Promise<void>;
342
- onPendingValidity(): void;
343
- onValidationConfigUpdate(): Promise<void>;
344
- resolveNewModelValue(viewValue: string): unknown;
345
- syncViewValueAfterModelUpdate(newModelValue: unknown): void | never;
346
- triggerComponentValidityEvent(validityEvent: ValidityEvent): void;
347
- setViewValueToFormattedValueOrFallbackToValue(): void;
348
- }, ComponentOptionsMixin, ComponentOptionsMixin, ("blur" | "change" | "update:modelValue" | "update")[], "blur" | "change" | "update:modelValue" | "update", PublicProps, Readonly<ExtractPropTypes< {
349
- id: {
350
- type: StringConstructor;
351
- required: false;
352
- default: () => string;
353
- };
354
- inline: {
355
- type: BooleanConstructor;
356
- required: false;
357
- default: boolean;
358
- };
359
- modelValue: {
360
- type: (StringConstructor | NumberConstructor)[];
361
- required: false;
362
- default: string;
363
- };
364
- type: {
365
- type: StringConstructor;
366
- required: false;
367
- default: string;
368
- };
369
- formatter: {
370
- type: PropType<FormatFunction<any>>;
371
- required: false;
372
- default: undefined;
373
- };
374
- parser: {
375
- type: PropType<ParseFunction<any>>;
376
- required: false;
377
- default: undefined;
378
- };
379
- labelWidth: {
380
- type: StringConstructor;
381
- required: false;
382
- default: string;
383
- };
384
- inputWidth: {
385
- type: StringConstructor;
386
- required: false;
387
- default: string;
388
- };
389
- options: {
390
- type: PropType<string[] | undefined>;
391
- required: false;
392
- default: () => undefined;
393
- };
394
- }>> & Readonly<{
395
- onBlur?: ((...args: any[]) => any) | undefined;
396
- onChange?: ((...args: any[]) => any) | undefined;
397
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
398
- onUpdate?: ((...args: any[]) => any) | undefined;
399
- }>, {
400
- type: string;
401
- id: string;
402
- modelValue: string | number;
403
- inline: boolean;
404
- options: string[] | undefined;
405
- labelWidth: string;
406
- formatter: FormatFunction<any>;
407
- parser: ParseFunction<any>;
408
- inputWidth: string;
409
- }, {}, {
410
- FLabel: DefineComponent<ExtractPropTypes< {
411
- for: {
412
- type: PropType<string | undefined>;
413
- required: false;
414
- default: undefined;
415
- };
416
- }>, void, {
417
- descriptionClass: string[];
418
- discreteDescriptionClass: string[];
419
- }, {
420
- forProperty(): string | undefined;
421
- hasDefaultSlot(): boolean;
422
- hasErrorMessageSlot(): boolean;
423
- hasDescriptionSlot(): boolean;
424
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
425
- for: {
426
- type: PropType<string | undefined>;
427
- required: false;
428
- default: undefined;
429
- };
430
- }>> & Readonly<{}>, {
431
- for: string | undefined;
432
- }, {}, {
433
- FIcon: DefineComponent<ExtractPropTypes< {
434
- name: {
435
- type: StringConstructor;
436
- required: true;
437
- };
438
- library: {
439
- type: StringConstructor;
440
- required: false;
441
- default: string;
442
- };
443
- flip: {
444
- type: PropType<string>;
445
- default: null;
446
- required: false;
447
- validator(value: string): boolean;
448
- };
449
- rotate: {
450
- type: PropType<string>;
451
- default: null;
452
- required: false;
453
- validator(value: string): boolean;
454
- };
455
- }>, {}, {}, {
456
- spriteKey(): string;
457
- spriteId(): string;
458
- modifiers(): string[];
459
- ariaHidden(): "true" | undefined;
460
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
461
- name: {
462
- type: StringConstructor;
463
- required: true;
464
- };
465
- library: {
466
- type: StringConstructor;
467
- required: false;
468
- default: string;
469
- };
470
- flip: {
471
- type: PropType<string>;
472
- default: null;
473
- required: false;
474
- validator(value: string): boolean;
475
- };
476
- rotate: {
477
- type: PropType<string>;
478
- default: null;
479
- required: false;
480
- validator(value: string): boolean;
481
- };
482
- }>> & Readonly<{}>, {
483
- library: string;
484
- flip: string;
485
- rotate: string;
486
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
487
- }, {}, string, ComponentProvideOptions, true, {}, any>;
488
- FIcon: DefineComponent<ExtractPropTypes< {
489
- name: {
490
- type: StringConstructor;
491
- required: true;
492
- };
493
- library: {
494
- type: StringConstructor;
495
- required: false;
496
- default: string;
497
- };
498
- flip: {
499
- type: PropType<string>;
500
- default: null;
501
- required: false;
502
- validator(value: string): boolean;
503
- };
504
- rotate: {
505
- type: PropType<string>;
506
- default: null;
507
- required: false;
508
- validator(value: string): boolean;
509
- };
510
- }>, {}, {}, {
511
- spriteKey(): string;
512
- spriteId(): string;
513
- modifiers(): string[];
514
- ariaHidden(): "true" | undefined;
515
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
516
- name: {
517
- type: StringConstructor;
518
- required: true;
519
- };
520
- library: {
521
- type: StringConstructor;
522
- required: false;
523
- default: string;
524
- };
525
- flip: {
526
- type: PropType<string>;
527
- default: null;
528
- required: false;
529
- validator(value: string): boolean;
530
- };
531
- rotate: {
532
- type: PropType<string>;
533
- default: null;
534
- required: false;
535
- validator(value: string): boolean;
536
- };
537
- }>> & Readonly<{}>, {
538
- library: string;
539
- flip: string;
540
- rotate: string;
541
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
542
- IPopupError: DefineComponent<ExtractPropTypes< {
543
- isOpen: {
544
- type: BooleanConstructor;
545
- required: true;
546
- };
547
- errorMessage: {
548
- type: StringConstructor;
549
- required: false;
550
- default: string;
551
- };
552
- anchor: {
553
- type: PropType<HTMLElement | null | undefined>;
554
- required: false;
555
- default: undefined;
556
- };
557
- }>, {}, IPopupErrorData, {
558
- popupClasses(): string[];
559
- arrowClass(): string;
560
- errorStyle(): string;
561
- }, {
562
- onResize(): void;
563
- onKeyEsc(event: KeyboardEvent): void;
564
- onClose(): void;
565
- setArrowOffset(): void;
566
- toggleIsOpen(isOpen: boolean): Promise<void>;
567
- }, ComponentOptionsMixin, ComponentOptionsMixin, "close"[], "close", PublicProps, Readonly<ExtractPropTypes< {
568
- isOpen: {
569
- type: BooleanConstructor;
570
- required: true;
571
- };
572
- errorMessage: {
573
- type: StringConstructor;
574
- required: false;
575
- default: string;
576
- };
577
- anchor: {
578
- type: PropType<HTMLElement | null | undefined>;
579
- required: false;
580
- default: undefined;
581
- };
582
- }>> & Readonly<{
583
- onClose?: ((...args: any[]) => any) | undefined;
584
- }>, {
585
- anchor: HTMLElement | null | undefined;
586
- errorMessage: string;
587
- }, {}, {
588
- FIcon: DefineComponent<ExtractPropTypes< {
589
- name: {
590
- type: StringConstructor;
591
- required: true;
592
- };
593
- library: {
594
- type: StringConstructor;
595
- required: false;
596
- default: string;
597
- };
598
- flip: {
599
- type: PropType<string>;
600
- default: null;
601
- required: false;
602
- validator(value: string): boolean;
603
- };
604
- rotate: {
605
- type: PropType<string>;
606
- default: null;
607
- required: false;
608
- validator(value: string): boolean;
609
- };
610
- }>, {}, {}, {
611
- spriteKey(): string;
612
- spriteId(): string;
613
- modifiers(): string[];
614
- ariaHidden(): "true" | undefined;
615
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
616
- name: {
617
- type: StringConstructor;
618
- required: true;
619
- };
620
- library: {
621
- type: StringConstructor;
622
- required: false;
623
- default: string;
624
- };
625
- flip: {
626
- type: PropType<string>;
627
- default: null;
628
- required: false;
629
- validator(value: string): boolean;
630
- };
631
- rotate: {
632
- type: PropType<string>;
633
- default: null;
634
- required: false;
635
- validator(value: string): boolean;
636
- };
637
- }>> & Readonly<{}>, {
638
- library: string;
639
- flip: string;
640
- rotate: string;
641
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
642
- }, {}, string, ComponentProvideOptions, true, {}, any>;
643
- IComboboxDropdown: DefineComponent< {
644
- id: string;
645
- isOpen: boolean;
646
- options: string[];
647
- activeOption: string | null;
648
- activeOptionId: string;
649
- inputNode: HTMLInputElement;
650
- }, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
651
- close: () => any;
652
- select: (option: string) => any;
653
- }, string, PublicProps, Readonly<{
654
- id: string;
655
- isOpen: boolean;
656
- options: string[];
657
- activeOption: string | null;
658
- activeOptionId: string;
659
- inputNode: HTMLInputElement;
660
- }> & Readonly<{
661
- onClose?: (() => any) | undefined;
662
- onSelect?: ((option: string) => any) | undefined;
663
- }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
664
- listbox: HTMLUListElement;
665
- }, HTMLDivElement>;
666
- IComboboxToggleButton: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
667
- toggle: () => any;
668
- }, string, PublicProps, Readonly<{}> & Readonly<{
669
- onToggle?: (() => any) | undefined;
670
- }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, HTMLButtonElement>;
671
- }, {}, string, ComponentProvideOptions, true, {}, any>;
672
- FIcon: DefineComponent<ExtractPropTypes< {
673
- name: {
674
- type: StringConstructor;
675
- required: true;
676
- };
677
- library: {
678
- type: StringConstructor;
679
- required: false;
680
- default: string;
681
- };
682
- flip: {
683
- type: PropType<string>;
684
- default: null;
685
- required: false;
686
- validator(value: string): boolean;
687
- };
688
- rotate: {
689
- type: PropType<string>;
690
- default: null;
691
- required: false;
692
- validator(value: string): boolean;
693
- };
694
- }>, {}, {}, {
695
- spriteKey(): string;
696
- spriteId(): string;
697
- modifiers(): string[];
698
- ariaHidden(): "true" | undefined;
699
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
700
- name: {
701
- type: StringConstructor;
702
- required: true;
703
- };
704
- library: {
705
- type: StringConstructor;
706
- required: false;
707
- default: string;
708
- };
709
- flip: {
710
- type: PropType<string>;
711
- default: null;
712
- required: false;
713
- validator(value: string): boolean;
714
- };
715
- rotate: {
716
- type: PropType<string>;
717
- default: null;
718
- required: false;
719
- validator(value: string): boolean;
720
- };
721
- }>> & Readonly<{}>, {
722
- library: string;
723
- flip: string;
724
- rotate: string;
725
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
726
- }, {}, string, ComponentProvideOptions, true, {}, any>;
727
- }, {}, string, ComponentProvideOptions, true, {}, any>;
728
-
729
111
  export declare const XTimeTextField: DefineComponent<ExtractPropTypes< {
730
112
  formatter: {
731
113
  type: PropType<FormatFunction<HoursMinutesString>>;
@@ -795,6 +177,11 @@ type: PropType<string[] | undefined>;
795
177
  required: false;
796
178
  default: () => undefined;
797
179
  };
180
+ disabled: {
181
+ type: BooleanConstructor;
182
+ required: false;
183
+ default: boolean;
184
+ };
798
185
  }>, {
799
186
  textFieldTableMode: boolean;
800
187
  viewValue: Ref<string, string>;
@@ -888,6 +275,11 @@ type: PropType<string[] | undefined>;
888
275
  required: false;
889
276
  default: () => undefined;
890
277
  };
278
+ disabled: {
279
+ type: BooleanConstructor;
280
+ required: false;
281
+ default: boolean;
282
+ };
891
283
  }>> & Readonly<{
892
284
  onBlur?: ((...args: any[]) => any) | undefined;
893
285
  onChange?: ((...args: any[]) => any) | undefined;
@@ -898,6 +290,7 @@ type: string;
898
290
  id: string;
899
291
  modelValue: string | number;
900
292
  inline: boolean;
293
+ disabled: boolean;
901
294
  options: string[] | undefined;
902
295
  labelWidth: string;
903
296
  formatter: FormatFunction<any>;
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.48.0"
8
+ "packageVersion": "7.48.1"
9
9
  }
10
10
  ]
11
11
  }
package/dummy.css ADDED
@@ -0,0 +1 @@
1
+ /* dummy css file while there is no actual style generated by any component */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fkui/vue-labs",
3
- "version": "5.44.0",
3
+ "version": "5.45.0",
4
4
  "description": "Experimental and unstable FKUI components",
5
5
  "keywords": [
6
6
  "fkui",
@@ -23,13 +23,14 @@
23
23
  "import": "./dist/esm/index.esm.js"
24
24
  },
25
25
  "./pageobject/*": "./pageobject/*",
26
- "./style.css": "./dist/esm/vue-labs.css"
26
+ "./style.css": "./dummy.css"
27
27
  },
28
28
  "main": "./dist/cjs/index.cjs.js",
29
29
  "module": "./dist/esm/index.esm.js",
30
30
  "types": "./dist/types/index.d.ts",
31
31
  "files": [
32
32
  "dist",
33
+ "dummy.css",
33
34
  "htmlvalidate",
34
35
  "pageobject/**/*.{js,js.map,d.ts}",
35
36
  "!**/examples/**",
@@ -71,5 +72,5 @@
71
72
  "node": ">= 20",
72
73
  "npm": ">= 7"
73
74
  },
74
- "gitHead": "f04fd4b699713829d5bf82eda42dc59c99a1bec3"
75
+ "gitHead": "8acf0ec98104671d8411346256fa664abf2e94af"
75
76
  }
@@ -1,18 +0,0 @@
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
- }
@@ -1,18 +0,0 @@
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
- }