@fkui/vue-labs 5.43.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.
- package/dist/cjs/index.cjs.js +4 -69
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/esm/index.esm.js +6 -71
- package/dist/esm/index.esm.js.map +1 -1
- package/dist/types/index.d.ts +73 -569
- package/dist/types/tsdoc-metadata.json +1 -1
- package/dummy.css +1 -0
- package/package.json +4 -3
- package/dist/cjs/vue-labs.css +0 -18
- package/dist/esm/vue-labs.css +0 -18
package/dist/cjs/index.cjs.js
CHANGED
|
@@ -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
|
|
161
|
+
const _sfc_main = vue.defineComponent({
|
|
162
162
|
name: "XTimeTextField",
|
|
163
163
|
extends: vue$1.FTextField,
|
|
164
164
|
mixins: [vue$1.TranslationMixin],
|
|
@@ -174,10 +174,8 @@ const _sfc_main$1 = vue.defineComponent({
|
|
|
174
174
|
default: parseTimeToNumber
|
|
175
175
|
}
|
|
176
176
|
},
|
|
177
|
-
setup() {
|
|
178
|
-
return
|
|
179
|
-
textFieldTableMode: vue.inject("textFieldTableMode", false)
|
|
180
|
-
};
|
|
177
|
+
setup(props) {
|
|
178
|
+
return vue$1.useTextFieldSetup(props);
|
|
181
179
|
},
|
|
182
180
|
mounted() {
|
|
183
181
|
const inputElement = this.$el.querySelector("input");
|
|
@@ -194,73 +192,10 @@ const _sfc_main$1 = vue.defineComponent({
|
|
|
194
192
|
logic.ValidationService.validateElement(inputElement);
|
|
195
193
|
}
|
|
196
194
|
});
|
|
197
|
-
const _sfc_main = vue.defineComponent({
|
|
198
|
-
name: "XSearchBar",
|
|
199
|
-
components: {
|
|
200
|
-
FIcon: vue$1.FIcon,
|
|
201
|
-
FSearchTextField: vue$1.FSearchTextField
|
|
202
|
-
},
|
|
203
|
-
props: {
|
|
204
|
-
modelValue: {
|
|
205
|
-
type: String,
|
|
206
|
-
required: true
|
|
207
|
-
},
|
|
208
|
-
maxLength: {
|
|
209
|
-
type: Number,
|
|
210
|
-
default: 20
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
emits: ["update:modelValue", "changedValue"],
|
|
214
|
-
computed: {
|
|
215
|
-
value: {
|
|
216
|
-
get() {
|
|
217
|
-
return this.modelValue;
|
|
218
|
-
},
|
|
219
|
-
set(value) {
|
|
220
|
-
if (this.value !== value) {
|
|
221
|
-
this.$emit("changedValue", [this.value, value]);
|
|
222
|
-
}
|
|
223
|
-
this.$emit("update:modelValue", value);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
const _export_sfc = (sfc, props) => {
|
|
229
|
-
const target = sfc.__vccOpts || sfc;
|
|
230
|
-
for (const [key, val] of props) {
|
|
231
|
-
target[key] = val;
|
|
232
|
-
}
|
|
233
|
-
return target;
|
|
234
|
-
};
|
|
235
|
-
const _hoisted_1 = {
|
|
236
|
-
class: "button button--primary search-bar-button",
|
|
237
|
-
type: "submit",
|
|
238
|
-
"data-test": "search-bar-submit"
|
|
239
|
-
};
|
|
240
|
-
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
241
|
-
const _component_f_icon = vue.resolveComponent("f-icon");
|
|
242
|
-
const _component_f_search_text_field = vue.resolveComponent("f-search-text-field");
|
|
243
|
-
return vue.openBlock(), vue.createBlock(_component_f_search_text_field, {
|
|
244
|
-
modelValue: _ctx.value,
|
|
245
|
-
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
|
|
246
|
-
class: "x-search-bar",
|
|
247
|
-
maxlength: _ctx.maxLength
|
|
248
|
-
}, {
|
|
249
|
-
default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "default")]),
|
|
250
|
-
tooltip: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "tooltip")]),
|
|
251
|
-
"input-right": vue.withCtx(() => [vue.createElementVNode("button", _hoisted_1, [vue.createVNode(_component_f_icon, {
|
|
252
|
-
name: "search",
|
|
253
|
-
library: "f"
|
|
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 "))])])])]),
|
|
255
|
-
_: 3
|
|
256
|
-
}, 8, ["modelValue", "maxlength"]);
|
|
257
|
-
}
|
|
258
|
-
const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
|
|
259
195
|
exports.HOURS_MINUTES_REGEXP = HOURS_MINUTES_REGEXP;
|
|
260
196
|
exports.HOURS_MINUTES_WITHOUT_COLON_REGEXP = HOURS_MINUTES_WITHOUT_COLON_REGEXP;
|
|
261
197
|
exports.HoursMinutesValidatorUtils = HoursMinutesValidatorUtils;
|
|
262
|
-
exports.
|
|
263
|
-
exports.XTimeTextField = _sfc_main$1;
|
|
198
|
+
exports.XTimeTextField = _sfc_main;
|
|
264
199
|
exports.forgivingParseTimeToNumber = forgivingParseTimeToNumber;
|
|
265
200
|
exports.formatNumberToTime = formatNumberToTime;
|
|
266
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, 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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"}
|
|
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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"}
|
package/dist/esm/index.esm.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isEmpty, stripWhitespace, TranslationService, isSet, ValidationService } from "@fkui/logic";
|
|
2
|
-
import { defineComponent
|
|
3
|
-
import { FTextField, TranslationMixin,
|
|
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
|
|
159
|
+
const _sfc_main = defineComponent({
|
|
160
160
|
name: "XTimeTextField",
|
|
161
161
|
extends: FTextField,
|
|
162
162
|
mixins: [TranslationMixin],
|
|
@@ -172,10 +172,8 @@ const _sfc_main$1 = defineComponent({
|
|
|
172
172
|
default: parseTimeToNumber
|
|
173
173
|
}
|
|
174
174
|
},
|
|
175
|
-
setup() {
|
|
176
|
-
return
|
|
177
|
-
textFieldTableMode: inject("textFieldTableMode", false)
|
|
178
|
-
};
|
|
175
|
+
setup(props) {
|
|
176
|
+
return useTextFieldSetup(props);
|
|
179
177
|
},
|
|
180
178
|
mounted() {
|
|
181
179
|
const inputElement = this.$el.querySelector("input");
|
|
@@ -192,74 +190,11 @@ const _sfc_main$1 = defineComponent({
|
|
|
192
190
|
ValidationService.validateElement(inputElement);
|
|
193
191
|
}
|
|
194
192
|
});
|
|
195
|
-
const _sfc_main = defineComponent({
|
|
196
|
-
name: "XSearchBar",
|
|
197
|
-
components: {
|
|
198
|
-
FIcon,
|
|
199
|
-
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 = resolveComponent("f-icon");
|
|
240
|
-
const _component_f_search_text_field = resolveComponent("f-search-text-field");
|
|
241
|
-
return openBlock(), 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: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
|
|
248
|
-
tooltip: withCtx(() => [renderSlot(_ctx.$slots, "tooltip")]),
|
|
249
|
-
"input-right": withCtx(() => [createElementVNode("button", _hoisted_1, [createVNode(_component_f_icon, {
|
|
250
|
-
name: "search",
|
|
251
|
-
library: "f"
|
|
252
|
-
}), _cache[2] || (_cache[2] = createTextVNode()), createElementVNode("span", null, [renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = createTextVNode(" Sök "))])])])]),
|
|
253
|
-
_: 3
|
|
254
|
-
}, 8, ["modelValue", "maxlength"]);
|
|
255
|
-
}
|
|
256
|
-
const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
|
|
257
193
|
export {
|
|
258
194
|
HOURS_MINUTES_REGEXP,
|
|
259
195
|
HOURS_MINUTES_WITHOUT_COLON_REGEXP,
|
|
260
196
|
HoursMinutesValidatorUtils,
|
|
261
|
-
|
|
262
|
-
_sfc_main$1 as XTimeTextField,
|
|
197
|
+
_sfc_main as XTimeTextField,
|
|
263
198
|
forgivingParseTimeToNumber,
|
|
264
199
|
formatNumberToTime,
|
|
265
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, 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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"}
|
|
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":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { IPopupErrorData } from '@fkui/vue';
|
|
|
8
8
|
import { ParseFunction } from '@fkui/vue';
|
|
9
9
|
import { PropType } from 'vue';
|
|
10
10
|
import { PublicProps } from 'vue';
|
|
11
|
+
import { Ref } from 'vue';
|
|
11
12
|
import { ValidatorConfig } from '@fkui/logic';
|
|
12
13
|
import { ValidityEvent } from '@fkui/logic';
|
|
13
14
|
|
|
@@ -107,574 +108,6 @@ export declare function parseTimeToNumber(value?: string | null): number | undef
|
|
|
107
108
|
*/
|
|
108
109
|
export declare function splitHoursMinutes(valueString: string, extraForgiving?: boolean): string[];
|
|
109
110
|
|
|
110
|
-
export declare const XSearchBar: DefineComponent<ExtractPropTypes< {
|
|
111
|
-
modelValue: {
|
|
112
|
-
type: StringConstructor;
|
|
113
|
-
required: true;
|
|
114
|
-
};
|
|
115
|
-
maxLength: {
|
|
116
|
-
type: NumberConstructor;
|
|
117
|
-
default: number;
|
|
118
|
-
};
|
|
119
|
-
}>, {}, {}, {
|
|
120
|
-
value: {
|
|
121
|
-
get(): string;
|
|
122
|
-
set(value: string): void;
|
|
123
|
-
};
|
|
124
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("update:modelValue" | "changedValue")[], "update:modelValue" | "changedValue", PublicProps, Readonly<ExtractPropTypes< {
|
|
125
|
-
modelValue: {
|
|
126
|
-
type: StringConstructor;
|
|
127
|
-
required: true;
|
|
128
|
-
};
|
|
129
|
-
maxLength: {
|
|
130
|
-
type: NumberConstructor;
|
|
131
|
-
default: number;
|
|
132
|
-
};
|
|
133
|
-
}>> & Readonly<{
|
|
134
|
-
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
135
|
-
onChangedValue?: ((...args: any[]) => any) | undefined;
|
|
136
|
-
}>, {
|
|
137
|
-
maxLength: number;
|
|
138
|
-
}, {}, {
|
|
139
|
-
FIcon: DefineComponent<ExtractPropTypes< {
|
|
140
|
-
name: {
|
|
141
|
-
type: StringConstructor;
|
|
142
|
-
required: true;
|
|
143
|
-
};
|
|
144
|
-
library: {
|
|
145
|
-
type: StringConstructor;
|
|
146
|
-
required: false;
|
|
147
|
-
default: string;
|
|
148
|
-
};
|
|
149
|
-
flip: {
|
|
150
|
-
type: PropType<string>;
|
|
151
|
-
default: null;
|
|
152
|
-
required: false;
|
|
153
|
-
validator(value: string): boolean;
|
|
154
|
-
};
|
|
155
|
-
rotate: {
|
|
156
|
-
type: PropType<string>;
|
|
157
|
-
default: null;
|
|
158
|
-
required: false;
|
|
159
|
-
validator(value: string): boolean;
|
|
160
|
-
};
|
|
161
|
-
}>, {}, {}, {
|
|
162
|
-
spriteKey(): string;
|
|
163
|
-
spriteId(): string;
|
|
164
|
-
modifiers(): string[];
|
|
165
|
-
ariaHidden(): "true" | undefined;
|
|
166
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
167
|
-
name: {
|
|
168
|
-
type: StringConstructor;
|
|
169
|
-
required: true;
|
|
170
|
-
};
|
|
171
|
-
library: {
|
|
172
|
-
type: StringConstructor;
|
|
173
|
-
required: false;
|
|
174
|
-
default: string;
|
|
175
|
-
};
|
|
176
|
-
flip: {
|
|
177
|
-
type: PropType<string>;
|
|
178
|
-
default: null;
|
|
179
|
-
required: false;
|
|
180
|
-
validator(value: string): boolean;
|
|
181
|
-
};
|
|
182
|
-
rotate: {
|
|
183
|
-
type: PropType<string>;
|
|
184
|
-
default: null;
|
|
185
|
-
required: false;
|
|
186
|
-
validator(value: string): boolean;
|
|
187
|
-
};
|
|
188
|
-
}>> & Readonly<{}>, {
|
|
189
|
-
library: string;
|
|
190
|
-
flip: string;
|
|
191
|
-
rotate: string;
|
|
192
|
-
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
193
|
-
FSearchTextField: DefineComponent<ExtractPropTypes< {
|
|
194
|
-
id: {
|
|
195
|
-
type: StringConstructor;
|
|
196
|
-
required: false;
|
|
197
|
-
default: () => string;
|
|
198
|
-
};
|
|
199
|
-
modelValue: {
|
|
200
|
-
type: StringConstructor;
|
|
201
|
-
required: false;
|
|
202
|
-
default: string;
|
|
203
|
-
};
|
|
204
|
-
clearableScreenReaderText: {
|
|
205
|
-
type: StringConstructor;
|
|
206
|
-
required: false;
|
|
207
|
-
default: string;
|
|
208
|
-
};
|
|
209
|
-
maxLength: {
|
|
210
|
-
type: NumberConstructor;
|
|
211
|
-
default: number;
|
|
212
|
-
};
|
|
213
|
-
}>, {}, {
|
|
214
|
-
defaultText: string;
|
|
215
|
-
}, {
|
|
216
|
-
canClear(): boolean;
|
|
217
|
-
}, {
|
|
218
|
-
clear(): void;
|
|
219
|
-
onInput(event: Event): void;
|
|
220
|
-
onChange(event: Event): void;
|
|
221
|
-
onBlur(event: Event): void;
|
|
222
|
-
onUpdate(event: Event): void;
|
|
223
|
-
}, ComponentOptionsMixin, ComponentOptionsMixin, ("blur" | "change" | "update:modelValue" | "update")[], "blur" | "change" | "update:modelValue" | "update", PublicProps, Readonly<ExtractPropTypes< {
|
|
224
|
-
id: {
|
|
225
|
-
type: StringConstructor;
|
|
226
|
-
required: false;
|
|
227
|
-
default: () => string;
|
|
228
|
-
};
|
|
229
|
-
modelValue: {
|
|
230
|
-
type: StringConstructor;
|
|
231
|
-
required: false;
|
|
232
|
-
default: string;
|
|
233
|
-
};
|
|
234
|
-
clearableScreenReaderText: {
|
|
235
|
-
type: StringConstructor;
|
|
236
|
-
required: false;
|
|
237
|
-
default: string;
|
|
238
|
-
};
|
|
239
|
-
maxLength: {
|
|
240
|
-
type: NumberConstructor;
|
|
241
|
-
default: number;
|
|
242
|
-
};
|
|
243
|
-
}>> & Readonly<{
|
|
244
|
-
onBlur?: ((...args: any[]) => any) | undefined;
|
|
245
|
-
onChange?: ((...args: any[]) => any) | undefined;
|
|
246
|
-
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
247
|
-
onUpdate?: ((...args: any[]) => any) | undefined;
|
|
248
|
-
}>, {
|
|
249
|
-
id: string;
|
|
250
|
-
modelValue: string;
|
|
251
|
-
maxLength: number;
|
|
252
|
-
clearableScreenReaderText: string;
|
|
253
|
-
}, {}, {
|
|
254
|
-
FTextField: DefineComponent<ExtractPropTypes< {
|
|
255
|
-
id: {
|
|
256
|
-
type: StringConstructor;
|
|
257
|
-
required: false;
|
|
258
|
-
default: () => string;
|
|
259
|
-
};
|
|
260
|
-
inline: {
|
|
261
|
-
type: BooleanConstructor;
|
|
262
|
-
required: false;
|
|
263
|
-
default: boolean;
|
|
264
|
-
};
|
|
265
|
-
modelValue: {
|
|
266
|
-
type: (StringConstructor | NumberConstructor)[];
|
|
267
|
-
required: false;
|
|
268
|
-
default: string;
|
|
269
|
-
};
|
|
270
|
-
type: {
|
|
271
|
-
type: StringConstructor;
|
|
272
|
-
required: false;
|
|
273
|
-
default: string;
|
|
274
|
-
};
|
|
275
|
-
formatter: {
|
|
276
|
-
type: PropType<FormatFunction<any>>;
|
|
277
|
-
required: false;
|
|
278
|
-
default: undefined;
|
|
279
|
-
};
|
|
280
|
-
parser: {
|
|
281
|
-
type: PropType<ParseFunction<any>>;
|
|
282
|
-
required: false;
|
|
283
|
-
default: undefined;
|
|
284
|
-
};
|
|
285
|
-
labelWidth: {
|
|
286
|
-
type: StringConstructor;
|
|
287
|
-
required: false;
|
|
288
|
-
default: string;
|
|
289
|
-
};
|
|
290
|
-
inputWidth: {
|
|
291
|
-
type: StringConstructor;
|
|
292
|
-
required: false;
|
|
293
|
-
default: string;
|
|
294
|
-
};
|
|
295
|
-
}>, {
|
|
296
|
-
textFieldTableMode: boolean;
|
|
297
|
-
}, {
|
|
298
|
-
showErrorPopup: boolean;
|
|
299
|
-
viewValue: string;
|
|
300
|
-
lastModelValue: unknown;
|
|
301
|
-
validationMessage: string;
|
|
302
|
-
validityMode: string;
|
|
303
|
-
isAfterInitialRender: boolean;
|
|
304
|
-
defaultText: string;
|
|
305
|
-
descriptionText: string;
|
|
306
|
-
descriptionScreenReaderText: string;
|
|
307
|
-
discreteDescriptionText: string;
|
|
308
|
-
discreteDescriptionScreenReaderText: string;
|
|
309
|
-
}, {
|
|
310
|
-
showPopupError(): boolean;
|
|
311
|
-
labelClass(): string;
|
|
312
|
-
isValid(): boolean;
|
|
313
|
-
hasError(): boolean;
|
|
314
|
-
rootClass(): Record<string, boolean>;
|
|
315
|
-
labelWrapperClass(): string | undefined;
|
|
316
|
-
inputWrapperClass(): string | undefined;
|
|
317
|
-
isModelUpdatedProgrammatically(): boolean;
|
|
318
|
-
}, {
|
|
319
|
-
getErrorPopupAnchor(): HTMLElement;
|
|
320
|
-
closePopupError(): void;
|
|
321
|
-
onChange(): Promise<void>;
|
|
322
|
-
onFocus(): void;
|
|
323
|
-
onBlur(): Promise<void>;
|
|
324
|
-
onValidity({ detail }: CustomEvent<ValidityEvent>): Promise<void>;
|
|
325
|
-
onPendingValidity(): void;
|
|
326
|
-
onValidationConfigUpdate(): Promise<void>;
|
|
327
|
-
resolveNewModelValue(viewValue: string): unknown;
|
|
328
|
-
syncViewValueAfterModelUpdate(newModelValue: unknown): void | never;
|
|
329
|
-
triggerComponentValidityEvent(validityEvent: ValidityEvent): void;
|
|
330
|
-
setViewValueToFormattedValueOrFallbackToValue(): void;
|
|
331
|
-
}, ComponentOptionsMixin, ComponentOptionsMixin, ("blur" | "change" | "update:modelValue" | "update")[], "blur" | "change" | "update:modelValue" | "update", PublicProps, Readonly<ExtractPropTypes< {
|
|
332
|
-
id: {
|
|
333
|
-
type: StringConstructor;
|
|
334
|
-
required: false;
|
|
335
|
-
default: () => string;
|
|
336
|
-
};
|
|
337
|
-
inline: {
|
|
338
|
-
type: BooleanConstructor;
|
|
339
|
-
required: false;
|
|
340
|
-
default: boolean;
|
|
341
|
-
};
|
|
342
|
-
modelValue: {
|
|
343
|
-
type: (StringConstructor | NumberConstructor)[];
|
|
344
|
-
required: false;
|
|
345
|
-
default: string;
|
|
346
|
-
};
|
|
347
|
-
type: {
|
|
348
|
-
type: StringConstructor;
|
|
349
|
-
required: false;
|
|
350
|
-
default: string;
|
|
351
|
-
};
|
|
352
|
-
formatter: {
|
|
353
|
-
type: PropType<FormatFunction<any>>;
|
|
354
|
-
required: false;
|
|
355
|
-
default: undefined;
|
|
356
|
-
};
|
|
357
|
-
parser: {
|
|
358
|
-
type: PropType<ParseFunction<any>>;
|
|
359
|
-
required: false;
|
|
360
|
-
default: undefined;
|
|
361
|
-
};
|
|
362
|
-
labelWidth: {
|
|
363
|
-
type: StringConstructor;
|
|
364
|
-
required: false;
|
|
365
|
-
default: string;
|
|
366
|
-
};
|
|
367
|
-
inputWidth: {
|
|
368
|
-
type: StringConstructor;
|
|
369
|
-
required: false;
|
|
370
|
-
default: string;
|
|
371
|
-
};
|
|
372
|
-
}>> & Readonly<{
|
|
373
|
-
onBlur?: ((...args: any[]) => any) | undefined;
|
|
374
|
-
onChange?: ((...args: any[]) => any) | undefined;
|
|
375
|
-
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
376
|
-
onUpdate?: ((...args: any[]) => any) | undefined;
|
|
377
|
-
}>, {
|
|
378
|
-
type: string;
|
|
379
|
-
id: string;
|
|
380
|
-
modelValue: string | number;
|
|
381
|
-
inline: boolean;
|
|
382
|
-
labelWidth: string;
|
|
383
|
-
formatter: FormatFunction<any>;
|
|
384
|
-
parser: ParseFunction<any>;
|
|
385
|
-
inputWidth: string;
|
|
386
|
-
}, {}, {
|
|
387
|
-
FLabel: DefineComponent<ExtractPropTypes< {
|
|
388
|
-
for: {
|
|
389
|
-
type: PropType<string | undefined>;
|
|
390
|
-
required: false;
|
|
391
|
-
default: undefined;
|
|
392
|
-
};
|
|
393
|
-
}>, void, {
|
|
394
|
-
descriptionClass: string[];
|
|
395
|
-
discreteDescriptionClass: string[];
|
|
396
|
-
}, {
|
|
397
|
-
forProperty(): string | undefined;
|
|
398
|
-
hasDefaultSlot(): boolean;
|
|
399
|
-
hasErrorMessageSlot(): boolean;
|
|
400
|
-
hasDescriptionSlot(): boolean;
|
|
401
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
402
|
-
for: {
|
|
403
|
-
type: PropType<string | undefined>;
|
|
404
|
-
required: false;
|
|
405
|
-
default: undefined;
|
|
406
|
-
};
|
|
407
|
-
}>> & Readonly<{}>, {
|
|
408
|
-
for: string | undefined;
|
|
409
|
-
}, {}, {
|
|
410
|
-
FIcon: DefineComponent<ExtractPropTypes< {
|
|
411
|
-
name: {
|
|
412
|
-
type: StringConstructor;
|
|
413
|
-
required: true;
|
|
414
|
-
};
|
|
415
|
-
library: {
|
|
416
|
-
type: StringConstructor;
|
|
417
|
-
required: false;
|
|
418
|
-
default: string;
|
|
419
|
-
};
|
|
420
|
-
flip: {
|
|
421
|
-
type: PropType<string>;
|
|
422
|
-
default: null;
|
|
423
|
-
required: false;
|
|
424
|
-
validator(value: string): boolean;
|
|
425
|
-
};
|
|
426
|
-
rotate: {
|
|
427
|
-
type: PropType<string>;
|
|
428
|
-
default: null;
|
|
429
|
-
required: false;
|
|
430
|
-
validator(value: string): boolean;
|
|
431
|
-
};
|
|
432
|
-
}>, {}, {}, {
|
|
433
|
-
spriteKey(): string;
|
|
434
|
-
spriteId(): string;
|
|
435
|
-
modifiers(): string[];
|
|
436
|
-
ariaHidden(): "true" | undefined;
|
|
437
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
438
|
-
name: {
|
|
439
|
-
type: StringConstructor;
|
|
440
|
-
required: true;
|
|
441
|
-
};
|
|
442
|
-
library: {
|
|
443
|
-
type: StringConstructor;
|
|
444
|
-
required: false;
|
|
445
|
-
default: string;
|
|
446
|
-
};
|
|
447
|
-
flip: {
|
|
448
|
-
type: PropType<string>;
|
|
449
|
-
default: null;
|
|
450
|
-
required: false;
|
|
451
|
-
validator(value: string): boolean;
|
|
452
|
-
};
|
|
453
|
-
rotate: {
|
|
454
|
-
type: PropType<string>;
|
|
455
|
-
default: null;
|
|
456
|
-
required: false;
|
|
457
|
-
validator(value: string): boolean;
|
|
458
|
-
};
|
|
459
|
-
}>> & Readonly<{}>, {
|
|
460
|
-
library: string;
|
|
461
|
-
flip: string;
|
|
462
|
-
rotate: string;
|
|
463
|
-
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
464
|
-
}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
465
|
-
FIcon: DefineComponent<ExtractPropTypes< {
|
|
466
|
-
name: {
|
|
467
|
-
type: StringConstructor;
|
|
468
|
-
required: true;
|
|
469
|
-
};
|
|
470
|
-
library: {
|
|
471
|
-
type: StringConstructor;
|
|
472
|
-
required: false;
|
|
473
|
-
default: string;
|
|
474
|
-
};
|
|
475
|
-
flip: {
|
|
476
|
-
type: PropType<string>;
|
|
477
|
-
default: null;
|
|
478
|
-
required: false;
|
|
479
|
-
validator(value: string): boolean;
|
|
480
|
-
};
|
|
481
|
-
rotate: {
|
|
482
|
-
type: PropType<string>;
|
|
483
|
-
default: null;
|
|
484
|
-
required: false;
|
|
485
|
-
validator(value: string): boolean;
|
|
486
|
-
};
|
|
487
|
-
}>, {}, {}, {
|
|
488
|
-
spriteKey(): string;
|
|
489
|
-
spriteId(): string;
|
|
490
|
-
modifiers(): string[];
|
|
491
|
-
ariaHidden(): "true" | undefined;
|
|
492
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
493
|
-
name: {
|
|
494
|
-
type: StringConstructor;
|
|
495
|
-
required: true;
|
|
496
|
-
};
|
|
497
|
-
library: {
|
|
498
|
-
type: StringConstructor;
|
|
499
|
-
required: false;
|
|
500
|
-
default: string;
|
|
501
|
-
};
|
|
502
|
-
flip: {
|
|
503
|
-
type: PropType<string>;
|
|
504
|
-
default: null;
|
|
505
|
-
required: false;
|
|
506
|
-
validator(value: string): boolean;
|
|
507
|
-
};
|
|
508
|
-
rotate: {
|
|
509
|
-
type: PropType<string>;
|
|
510
|
-
default: null;
|
|
511
|
-
required: false;
|
|
512
|
-
validator(value: string): boolean;
|
|
513
|
-
};
|
|
514
|
-
}>> & Readonly<{}>, {
|
|
515
|
-
library: string;
|
|
516
|
-
flip: string;
|
|
517
|
-
rotate: string;
|
|
518
|
-
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
519
|
-
IPopupError: DefineComponent<ExtractPropTypes< {
|
|
520
|
-
isOpen: {
|
|
521
|
-
type: BooleanConstructor;
|
|
522
|
-
required: true;
|
|
523
|
-
};
|
|
524
|
-
errorMessage: {
|
|
525
|
-
type: StringConstructor;
|
|
526
|
-
required: false;
|
|
527
|
-
default: string;
|
|
528
|
-
};
|
|
529
|
-
anchor: {
|
|
530
|
-
type: PropType<HTMLElement | null | undefined>;
|
|
531
|
-
required: false;
|
|
532
|
-
default: undefined;
|
|
533
|
-
};
|
|
534
|
-
}>, {}, IPopupErrorData, {
|
|
535
|
-
popupClasses(): string[];
|
|
536
|
-
arrowClass(): string;
|
|
537
|
-
errorStyle(): string;
|
|
538
|
-
}, {
|
|
539
|
-
onResize(): void;
|
|
540
|
-
onKeyEsc(event: KeyboardEvent): void;
|
|
541
|
-
onClose(): void;
|
|
542
|
-
setArrowOffset(): void;
|
|
543
|
-
toggleIsOpen(isOpen: boolean): Promise<void>;
|
|
544
|
-
}, ComponentOptionsMixin, ComponentOptionsMixin, "close"[], "close", PublicProps, Readonly<ExtractPropTypes< {
|
|
545
|
-
isOpen: {
|
|
546
|
-
type: BooleanConstructor;
|
|
547
|
-
required: true;
|
|
548
|
-
};
|
|
549
|
-
errorMessage: {
|
|
550
|
-
type: StringConstructor;
|
|
551
|
-
required: false;
|
|
552
|
-
default: string;
|
|
553
|
-
};
|
|
554
|
-
anchor: {
|
|
555
|
-
type: PropType<HTMLElement | null | undefined>;
|
|
556
|
-
required: false;
|
|
557
|
-
default: undefined;
|
|
558
|
-
};
|
|
559
|
-
}>> & Readonly<{
|
|
560
|
-
onClose?: ((...args: any[]) => any) | undefined;
|
|
561
|
-
}>, {
|
|
562
|
-
anchor: HTMLElement | null | undefined;
|
|
563
|
-
errorMessage: string;
|
|
564
|
-
}, {}, {
|
|
565
|
-
FIcon: DefineComponent<ExtractPropTypes< {
|
|
566
|
-
name: {
|
|
567
|
-
type: StringConstructor;
|
|
568
|
-
required: true;
|
|
569
|
-
};
|
|
570
|
-
library: {
|
|
571
|
-
type: StringConstructor;
|
|
572
|
-
required: false;
|
|
573
|
-
default: string;
|
|
574
|
-
};
|
|
575
|
-
flip: {
|
|
576
|
-
type: PropType<string>;
|
|
577
|
-
default: null;
|
|
578
|
-
required: false;
|
|
579
|
-
validator(value: string): boolean;
|
|
580
|
-
};
|
|
581
|
-
rotate: {
|
|
582
|
-
type: PropType<string>;
|
|
583
|
-
default: null;
|
|
584
|
-
required: false;
|
|
585
|
-
validator(value: string): boolean;
|
|
586
|
-
};
|
|
587
|
-
}>, {}, {}, {
|
|
588
|
-
spriteKey(): string;
|
|
589
|
-
spriteId(): string;
|
|
590
|
-
modifiers(): string[];
|
|
591
|
-
ariaHidden(): "true" | undefined;
|
|
592
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
593
|
-
name: {
|
|
594
|
-
type: StringConstructor;
|
|
595
|
-
required: true;
|
|
596
|
-
};
|
|
597
|
-
library: {
|
|
598
|
-
type: StringConstructor;
|
|
599
|
-
required: false;
|
|
600
|
-
default: string;
|
|
601
|
-
};
|
|
602
|
-
flip: {
|
|
603
|
-
type: PropType<string>;
|
|
604
|
-
default: null;
|
|
605
|
-
required: false;
|
|
606
|
-
validator(value: string): boolean;
|
|
607
|
-
};
|
|
608
|
-
rotate: {
|
|
609
|
-
type: PropType<string>;
|
|
610
|
-
default: null;
|
|
611
|
-
required: false;
|
|
612
|
-
validator(value: string): boolean;
|
|
613
|
-
};
|
|
614
|
-
}>> & Readonly<{}>, {
|
|
615
|
-
library: string;
|
|
616
|
-
flip: string;
|
|
617
|
-
rotate: string;
|
|
618
|
-
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
619
|
-
}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
620
|
-
}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
621
|
-
FIcon: DefineComponent<ExtractPropTypes< {
|
|
622
|
-
name: {
|
|
623
|
-
type: StringConstructor;
|
|
624
|
-
required: true;
|
|
625
|
-
};
|
|
626
|
-
library: {
|
|
627
|
-
type: StringConstructor;
|
|
628
|
-
required: false;
|
|
629
|
-
default: string;
|
|
630
|
-
};
|
|
631
|
-
flip: {
|
|
632
|
-
type: PropType<string>;
|
|
633
|
-
default: null;
|
|
634
|
-
required: false;
|
|
635
|
-
validator(value: string): boolean;
|
|
636
|
-
};
|
|
637
|
-
rotate: {
|
|
638
|
-
type: PropType<string>;
|
|
639
|
-
default: null;
|
|
640
|
-
required: false;
|
|
641
|
-
validator(value: string): boolean;
|
|
642
|
-
};
|
|
643
|
-
}>, {}, {}, {
|
|
644
|
-
spriteKey(): string;
|
|
645
|
-
spriteId(): string;
|
|
646
|
-
modifiers(): string[];
|
|
647
|
-
ariaHidden(): "true" | undefined;
|
|
648
|
-
}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
649
|
-
name: {
|
|
650
|
-
type: StringConstructor;
|
|
651
|
-
required: true;
|
|
652
|
-
};
|
|
653
|
-
library: {
|
|
654
|
-
type: StringConstructor;
|
|
655
|
-
required: false;
|
|
656
|
-
default: string;
|
|
657
|
-
};
|
|
658
|
-
flip: {
|
|
659
|
-
type: PropType<string>;
|
|
660
|
-
default: null;
|
|
661
|
-
required: false;
|
|
662
|
-
validator(value: string): boolean;
|
|
663
|
-
};
|
|
664
|
-
rotate: {
|
|
665
|
-
type: PropType<string>;
|
|
666
|
-
default: null;
|
|
667
|
-
required: false;
|
|
668
|
-
validator(value: string): boolean;
|
|
669
|
-
};
|
|
670
|
-
}>> & Readonly<{}>, {
|
|
671
|
-
library: string;
|
|
672
|
-
flip: string;
|
|
673
|
-
rotate: string;
|
|
674
|
-
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
675
|
-
}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
676
|
-
}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
677
|
-
|
|
678
111
|
export declare const XTimeTextField: DefineComponent<ExtractPropTypes< {
|
|
679
112
|
formatter: {
|
|
680
113
|
type: PropType<FormatFunction<HoursMinutesString>>;
|
|
@@ -688,6 +121,16 @@ default: typeof parseTimeToNumber;
|
|
|
688
121
|
};
|
|
689
122
|
}>, {
|
|
690
123
|
textFieldTableMode: boolean;
|
|
124
|
+
viewValue: Ref<string>;
|
|
125
|
+
onOptionSelected: (value: string) => void;
|
|
126
|
+
dropdownId: string;
|
|
127
|
+
dropdownIsOpen: Readonly<Ref<boolean>>;
|
|
128
|
+
dropdownOptions: Readonly<Ref<string[]>>;
|
|
129
|
+
activeOptionId: string;
|
|
130
|
+
activeOption: Readonly<Ref<string | null>>;
|
|
131
|
+
toggleDropdown: () => void;
|
|
132
|
+
selectOption: (value: string) => void;
|
|
133
|
+
closeDropdown: () => void;
|
|
691
134
|
}, {}, {}, {}, ComponentOptions, DefineComponent<ExtractPropTypes< {
|
|
692
135
|
id: {
|
|
693
136
|
type: StringConstructor;
|
|
@@ -729,11 +172,30 @@ type: StringConstructor;
|
|
|
729
172
|
required: false;
|
|
730
173
|
default: string;
|
|
731
174
|
};
|
|
175
|
+
options: {
|
|
176
|
+
type: PropType<string[] | undefined>;
|
|
177
|
+
required: false;
|
|
178
|
+
default: () => undefined;
|
|
179
|
+
};
|
|
180
|
+
disabled: {
|
|
181
|
+
type: BooleanConstructor;
|
|
182
|
+
required: false;
|
|
183
|
+
default: boolean;
|
|
184
|
+
};
|
|
732
185
|
}>, {
|
|
733
186
|
textFieldTableMode: boolean;
|
|
187
|
+
viewValue: Ref<string, string>;
|
|
188
|
+
onOptionSelected: (value: string) => void;
|
|
189
|
+
dropdownId: string;
|
|
190
|
+
dropdownIsOpen: Readonly<Ref<boolean, boolean>>;
|
|
191
|
+
dropdownOptions: Readonly<Ref<string[], string[]>>;
|
|
192
|
+
activeOptionId: string;
|
|
193
|
+
activeOption: Readonly<Ref<string | null, string | null>>;
|
|
194
|
+
toggleDropdown: () => void;
|
|
195
|
+
selectOption: (value: string) => void;
|
|
196
|
+
closeDropdown: () => void;
|
|
734
197
|
}, {
|
|
735
198
|
showErrorPopup: boolean;
|
|
736
|
-
viewValue: string;
|
|
737
199
|
lastModelValue: unknown;
|
|
738
200
|
validationMessage: string;
|
|
739
201
|
validityMode: string;
|
|
@@ -753,6 +215,8 @@ labelWrapperClass(): string | undefined;
|
|
|
753
215
|
inputWrapperClass(): string | undefined;
|
|
754
216
|
isModelUpdatedProgrammatically(): boolean;
|
|
755
217
|
}, {
|
|
218
|
+
onDropdownSelect(value: string): void;
|
|
219
|
+
onDropdownClose(): void;
|
|
756
220
|
getErrorPopupAnchor(): HTMLElement;
|
|
757
221
|
closePopupError(): void;
|
|
758
222
|
onChange(): Promise<void>;
|
|
@@ -806,6 +270,16 @@ type: StringConstructor;
|
|
|
806
270
|
required: false;
|
|
807
271
|
default: string;
|
|
808
272
|
};
|
|
273
|
+
options: {
|
|
274
|
+
type: PropType<string[] | undefined>;
|
|
275
|
+
required: false;
|
|
276
|
+
default: () => undefined;
|
|
277
|
+
};
|
|
278
|
+
disabled: {
|
|
279
|
+
type: BooleanConstructor;
|
|
280
|
+
required: false;
|
|
281
|
+
default: boolean;
|
|
282
|
+
};
|
|
809
283
|
}>> & Readonly<{
|
|
810
284
|
onBlur?: ((...args: any[]) => any) | undefined;
|
|
811
285
|
onChange?: ((...args: any[]) => any) | undefined;
|
|
@@ -816,6 +290,8 @@ type: string;
|
|
|
816
290
|
id: string;
|
|
817
291
|
modelValue: string | number;
|
|
818
292
|
inline: boolean;
|
|
293
|
+
disabled: boolean;
|
|
294
|
+
options: string[] | undefined;
|
|
819
295
|
labelWidth: string;
|
|
820
296
|
formatter: FormatFunction<any>;
|
|
821
297
|
parser: ParseFunction<any>;
|
|
@@ -1054,6 +530,34 @@ flip: string;
|
|
|
1054
530
|
rotate: string;
|
|
1055
531
|
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
1056
532
|
}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
533
|
+
IComboboxDropdown: DefineComponent< {
|
|
534
|
+
id: string;
|
|
535
|
+
isOpen: boolean;
|
|
536
|
+
options: string[];
|
|
537
|
+
activeOption: string | null;
|
|
538
|
+
activeOptionId: string;
|
|
539
|
+
inputNode: HTMLInputElement;
|
|
540
|
+
}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
541
|
+
close: () => any;
|
|
542
|
+
select: (option: string) => any;
|
|
543
|
+
}, string, PublicProps, Readonly<{
|
|
544
|
+
id: string;
|
|
545
|
+
isOpen: boolean;
|
|
546
|
+
options: string[];
|
|
547
|
+
activeOption: string | null;
|
|
548
|
+
activeOptionId: string;
|
|
549
|
+
inputNode: HTMLInputElement;
|
|
550
|
+
}> & Readonly<{
|
|
551
|
+
onClose?: (() => any) | undefined;
|
|
552
|
+
onSelect?: ((option: string) => any) | undefined;
|
|
553
|
+
}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
|
|
554
|
+
listbox: HTMLUListElement;
|
|
555
|
+
}, HTMLDivElement>;
|
|
556
|
+
IComboboxToggleButton: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
557
|
+
toggle: () => any;
|
|
558
|
+
}, string, PublicProps, Readonly<{}> & Readonly<{
|
|
559
|
+
onToggle?: (() => any) | undefined;
|
|
560
|
+
}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, HTMLButtonElement>;
|
|
1057
561
|
}, {}, string, ComponentProvideOptions, true, {}, any>, {}, string, PublicProps, Readonly<ExtractPropTypes< {
|
|
1058
562
|
formatter: {
|
|
1059
563
|
type: PropType<FormatFunction<HoursMinutesString>>;
|
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.
|
|
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": "./
|
|
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": "
|
|
75
|
+
"gitHead": "8acf0ec98104671d8411346256fa664abf2e94af"
|
|
75
76
|
}
|
package/dist/cjs/vue-labs.css
DELETED
|
@@ -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
|
-
}
|
package/dist/esm/vue-labs.css
DELETED
|
@@ -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
|
-
}
|