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