@beinformed/ui 1.58.3 → 1.59.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/CHANGELOG.md +24 -0
- package/esm/constants/Constants.js +10 -0
- package/esm/constants/Constants.js.map +1 -1
- package/esm/constants/Settings.js +5 -1
- package/esm/constants/Settings.js.map +1 -1
- package/esm/models/attributes/DatetimeAttributeModel.js +39 -4
- package/esm/models/attributes/DatetimeAttributeModel.js.map +1 -1
- package/esm/models/attributes/input-constraints/DatetimeFormatConstraint.js +31 -2
- package/esm/models/attributes/input-constraints/DatetimeFormatConstraint.js.map +1 -1
- package/esm/models/content/SectionModel.js +1 -1
- package/esm/models/content/SectionModel.js.map +1 -1
- package/esm/models/content/SubSectionModel.js +12 -4
- package/esm/models/content/SubSectionModel.js.map +1 -1
- package/esm/react-client/client.js +2 -1
- package/esm/react-client/client.js.map +1 -1
- package/esm/react-server/serverUtil.js +2 -1
- package/esm/react-server/serverUtil.js.map +1 -1
- package/esm/redux/actions/Preferences.js +15 -1
- package/esm/redux/actions/Preferences.js.map +1 -1
- package/esm/utils/datetime/DateTimeUtil.js +292 -94
- package/esm/utils/datetime/DateTimeUtil.js.map +1 -1
- package/lib/constants/Constants.js +11 -1
- package/lib/constants/Constants.js.flow +11 -0
- package/lib/constants/Constants.js.map +1 -1
- package/lib/constants/Settings.js +7 -2
- package/lib/constants/Settings.js.flow +6 -0
- package/lib/constants/Settings.js.map +1 -1
- package/lib/models/attributes/DatetimeAttributeModel.js +38 -3
- package/lib/models/attributes/DatetimeAttributeModel.js.flow +54 -4
- package/lib/models/attributes/DatetimeAttributeModel.js.map +1 -1
- package/lib/models/attributes/__tests__/DatetimeAttributeModel.spec.js.flow +9 -0
- package/lib/models/attributes/__tests__/DatetimeAttributeModel_offset.spec.js.flow +306 -0
- package/lib/models/attributes/input-constraints/DatetimeFormatConstraint.js +31 -2
- package/lib/models/attributes/input-constraints/DatetimeFormatConstraint.js.flow +42 -3
- package/lib/models/attributes/input-constraints/DatetimeFormatConstraint.js.map +1 -1
- package/lib/models/content/SectionModel.js +1 -1
- package/lib/models/content/SectionModel.js.flow +2 -1
- package/lib/models/content/SectionModel.js.map +1 -1
- package/lib/models/content/SubSectionModel.js +12 -3
- package/lib/models/content/SubSectionModel.js.flow +20 -3
- package/lib/models/content/SubSectionModel.js.map +1 -1
- package/lib/models/content/__tests__/ContentModel.spec.js.flow +3 -3
- package/lib/react-client/client.js +1 -0
- package/lib/react-client/client.js.flow +2 -0
- package/lib/react-client/client.js.map +1 -1
- package/lib/react-server/__tests__/serverUtil.spec.js.flow +12 -0
- package/lib/react-server/serverUtil.js +1 -0
- package/lib/react-server/serverUtil.js.flow +2 -0
- package/lib/react-server/serverUtil.js.map +1 -1
- package/lib/redux/actions/Preferences.js +17 -2
- package/lib/redux/actions/Preferences.js.flow +22 -0
- package/lib/redux/actions/Preferences.js.map +1 -1
- package/lib/redux/reducers/__tests__/ModelCatalogReducer.spec.js.flow +23 -0
- package/lib/utils/datetime/DateTimeUtil.js +292 -93
- package/lib/utils/datetime/DateTimeUtil.js.flow +482 -172
- package/lib/utils/datetime/DateTimeUtil.js.map +1 -1
- package/lib/utils/datetime/__tests__/DateTime.spec.js.flow +771 -483
- package/package.json +11 -9
- package/src/constants/Constants.js +11 -0
- package/src/constants/Settings.js +6 -0
- package/src/models/attributes/DatetimeAttributeModel.js +54 -4
- package/src/models/attributes/__tests__/DatetimeAttributeModel.spec.js +9 -0
- package/src/models/attributes/__tests__/DatetimeAttributeModel_offset.spec.js +306 -0
- package/src/models/attributes/input-constraints/DatetimeFormatConstraint.js +42 -3
- package/src/models/content/SectionModel.js +2 -1
- package/src/models/content/SubSectionModel.js +20 -3
- package/src/models/content/__tests__/ContentModel.spec.js +3 -3
- package/src/react-client/client.js +2 -0
- package/src/react-server/__tests__/serverUtil.spec.js +12 -0
- package/src/react-server/serverUtil.js +2 -0
- package/src/redux/actions/Preferences.js +22 -0
- package/src/redux/reducers/__tests__/ModelCatalogReducer.spec.js +23 -0
- package/src/utils/datetime/DateTimeUtil.js +482 -172
- package/src/utils/datetime/__tests__/DateTime.spec.js +771 -483
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatetimeAttributeModel.js","names":["_objects","require","_DateTimeUtil","_StringAttributeModel","_interopRequireDefault","_ConstraintCollection","_DateTimeDateFormatConstraint","_DateTimeTimeFormatConstraint","_DatetimeFormatConstraint","_DateBoundaryConstraint","_constants","DatetimeAttributeModel","StringAttributeModel","constructor","attribute","attributeContributions","modelOptions","updateInitValue","isApplicableModel","contributions","_context","_includes","default","call","type","formatUtil","TimeUtil","TimestampUtil","DateTimeUtil","DateUtil","getInitValue","value","data","length","split","hasTime","getTimeValue","_context2","_context3","_context4","_context5","timeValue","timeInputFormat","toLowerCase","setHour","setMinute","setSecond","setMilliseconds","_initvalue","_inputvalue","getInitialInputValue","_value","initValue","toFormat","inputFormat","getContribution","getInputValue","toString","inputvalue","validate","toISO","format","convertFormat","hasDate","formatLabel","dateInputFormat","_context6","_trim","_context7","replace","dateReadonlyFormat","_context8","placeholder","_placeholder","timeFormatParts","push","timeFormat","join","timeReadonlyFormat","dateInputValue","timeInputValue","formatValue","hasFormat","ISO_DATE_FORMAT","dateTimeReadonlyFormat","readonlyvalue","mindate","maxdate","addServerError","error","id","message","properties","layouthint","has","_errorCollection","getFormatConstraint","DateTimeDateFormatConstraint","DateTimeTimeFormatConstraint","DatetimeFormatConstraint","addConstraints","constraints","ConstraintCollection","add","DateBoundaryConstraint","readonlyWidth","ATTRIBUTE_WIDTH","SMALL","MEDIUM","updateByAttribute","otherAttribute","reset","otherValue","inputValue","update","console","_default","exports"],"sources":["../../../src/models/attributes/DatetimeAttributeModel.js"],"sourcesContent":["// @flow\nimport { has } from \"../../utils/helpers/objects\";\n\nimport {\n DateUtil,\n DateTimeUtil,\n TimeUtil,\n TimestampUtil,\n} from \"../../utils/datetime/DateTimeUtil\";\n\nimport StringAttributeModel from \"./StringAttributeModel\";\n\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\nimport DateTimeDateFormatConstraint from \"./input-constraints/DateTimeDateFormatConstraint\";\nimport DateTimeTimeFormatConstraint from \"./input-constraints/DateTimeTimeFormatConstraint\";\nimport DatetimeFormatConstraint from \"./input-constraints/DatetimeFormatConstraint\";\nimport DateBoundaryConstraint from \"./input-constraints/DateBoundaryConstraint\";\n\nimport { ATTRIBUTE_WIDTH, ISO_DATE_FORMAT } from \"../../constants\";\n\nimport type {\n FormErrorAnchor,\n IConstraintModel,\n AttributeType,\n ModelOptions,\n} from \"../types\";\n\n/**\n */\nclass DatetimeAttributeModel extends StringAttributeModel {\n /**\n */\n constructor(\n attribute: Object,\n attributeContributions: Object,\n modelOptions?: ModelOptions,\n ) {\n super(attribute, attributeContributions, modelOptions);\n\n this.updateInitValue();\n }\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n return [\"date\", \"time\", \"datetime\", \"timestamp\"].includes(\n contributions.type,\n );\n }\n\n /**\n */\n get formatUtil():\n | typeof TimeUtil\n | typeof TimestampUtil\n | typeof DateTimeUtil\n | typeof DateUtil {\n switch (this.type) {\n case \"time\":\n return TimeUtil;\n case \"timestamp\":\n return TimestampUtil;\n case \"datetime\":\n return DateTimeUtil;\n default:\n return DateUtil;\n }\n }\n\n /**\n */\n getInitValue(): string | null {\n let value = this.data.value;\n if (value != null) {\n if (this.type === \"time\" && value.length === 5) {\n value = `${value}:00`;\n }\n\n // handle old datetime values, which contained ms\n if (this.type === \"datetime\" && value.includes(\".\")) {\n value = value.split(\".\")[0];\n }\n\n if (this.hasTime) {\n value = this.getTimeValue(value);\n }\n }\n\n return value;\n }\n\n /**\n */\n getTimeValue(value: string): string {\n let timeValue = value;\n if (!this.timeInputFormat.toLowerCase().includes(\"h\")) {\n timeValue = this.formatUtil.setHour(value, 0);\n }\n if (!this.timeInputFormat.includes(\"m\")) {\n timeValue = this.formatUtil.setMinute(value, 0);\n }\n if (!this.timeInputFormat.includes(\"s\")) {\n timeValue = this.formatUtil.setSecond(value, 0);\n }\n if (this.type === \"timestamp\" && !this.timeInputFormat.includes(\"S\")) {\n timeValue = this.formatUtil.setMilliseconds(value, 0);\n }\n return timeValue;\n }\n\n /**\n * Set time in the correct value based on available elements in the time format\n */\n updateInitValue() {\n const value = this.getInitValue();\n if (value != null) {\n this._initvalue = value;\n this._inputvalue = this.getInitialInputValue(value);\n this._value = value;\n }\n }\n\n /**\n * Get initial user input value\n */\n getInitialInputValue(value?: string): string {\n if (!value) {\n return \"\";\n }\n\n let initValue = value;\n if (this.type === \"time\" && value.length === 5) {\n initValue = `${value}:00`;\n }\n\n return this.formatUtil.toFormat(initValue, this.inputFormat);\n }\n\n /**\n * Set type to date\n */\n get type(): string {\n return this.getContribution(\"type\", \"date\");\n }\n\n /**\n * Returns the value as entered by the user. This can differ from the internal iso value that is stored\n */\n getInputValue(): string {\n return this._inputvalue ? this._inputvalue.toString() : \"\";\n }\n\n /**\n * Get input value\n */\n get inputvalue(): string {\n return this.getInputValue();\n }\n\n /**\n * Sets the input value to the value entered by the user\n */\n set inputvalue(value: string) {\n this.validate(value);\n\n this._inputvalue = value;\n\n this.value =\n value !== null && value !== \"\"\n ? this.formatUtil.toISO(value, this.inputFormat)\n : null;\n }\n\n /**\n * Get date format\n */\n get format(): string {\n const format = this.getContribution(\"format\", \"\");\n return this.formatUtil.convertFormat(format);\n }\n\n /**\n */\n get hasDate(): boolean {\n return (\n this.type === \"date\" ||\n this.type === \"datetime\" ||\n this.type === \"timestamp\"\n );\n }\n\n /**\n */\n get hasTime(): boolean {\n return (\n this.type === \"time\" ||\n this.type === \"datetime\" ||\n this.type === \"timestamp\"\n );\n }\n\n /**\n */\n get formatLabel(): string {\n switch (this.type) {\n case \"date\":\n return this.dateInputFormat.toLowerCase();\n case \"time\":\n return this.timeInputFormat.toLowerCase();\n default:\n return this.format.toLowerCase();\n }\n }\n\n /**\n */\n get inputFormat(): string {\n if (this.hasDate && this.hasTime) {\n return `${this.dateInputFormat} ${this.timeInputFormat}`.trim();\n }\n\n if (this.hasDate) {\n return this.dateInputFormat;\n }\n\n if (this.hasTime) {\n return this.timeInputFormat;\n }\n\n return \"\";\n }\n\n /**\n */\n get dateInputFormat(): string {\n if (!this.hasDate) {\n return \"\";\n }\n\n return this.hasTime\n ? this.format.replace(this.timeInputFormat, \"\").trim()\n : this.format;\n }\n\n /**\n */\n get dateReadonlyFormat(): string {\n if (!this.hasDate) {\n return \"\";\n }\n\n return this.hasTime\n ? this.format.replace(this.timeInputFormat, \"\").trim()\n : this.format;\n }\n\n /**\n * return attribute placeholder or return formatlabel without time input format from contributions\n */\n get placeholder(): string {\n if (this._placeholder !== \"\") {\n return this._placeholder;\n }\n\n const formatLabel = this.getContribution(\"formatlabel\", \"\");\n\n if (this.hasDate && this.hasTime && formatLabel.includes(\" \")) {\n // return first part of formatlabel to keep placeholder matching date input\n return formatLabel.split(\" \")[0];\n }\n\n return formatLabel;\n }\n\n /**\n * Set placeholder text\n */\n set placeholder(placeholder: string) {\n this._placeholder = placeholder;\n }\n\n /**\n */\n get timeInputFormat(): string {\n if (!this.hasTime) {\n return \"\";\n }\n\n const format = this.format;\n\n let timeFormatParts = [];\n if (format.includes(\"H\")) {\n timeFormatParts.push(\"HH\");\n } else if (format.includes(\"h\")) {\n timeFormatParts.push(\"hh\");\n }\n if (format.includes(\"m\")) {\n timeFormatParts.push(\"mm\");\n }\n if (format.includes(\"s\")) {\n timeFormatParts.push(\"ss\");\n }\n\n let timeFormat = timeFormatParts.join(\":\");\n if (format.includes(\"S\")) {\n timeFormat = `${timeFormat}.SSS`;\n }\n if (format.includes(\"a\")) {\n return `${timeFormat} a`;\n }\n return timeFormat;\n }\n\n /**\n */\n get timeReadonlyFormat(): string {\n if (!this.hasTime) {\n return \"\";\n }\n\n return this.timeInputFormat;\n }\n\n /**\n */\n get dateInputValue(): string {\n return typeof this.value === \"string\" && this.dateInputFormat !== \"\"\n ? this.formatUtil.toFormat(this.value, this.dateInputFormat)\n : \"\";\n }\n\n /**\n */\n get timeInputValue(): string {\n return typeof this.value === \"string\" && this.timeInputFormat !== \"\"\n ? this.formatUtil.toFormat(this.value, this.timeInputFormat)\n : \"\";\n }\n\n // format value in readonly rendering\n /**\n */\n formatValue(value: ?string): string {\n if (value == null || value.toString() === \"\") {\n return \"\";\n }\n\n // when the value is exactly an iso date, render as date\n if (\n (this.type === \"datetime\" || this.type === \"timestamp\") &&\n DateUtil.hasFormat(value, ISO_DATE_FORMAT)\n ) {\n return DateUtil.toFormat(value, this.dateReadonlyFormat);\n }\n\n if (this.hasDate && this.hasTime) {\n const dateTimeReadonlyFormat = `${this.dateReadonlyFormat} ${this.timeReadonlyFormat}`;\n return this.formatUtil.toFormat(value, dateTimeReadonlyFormat);\n }\n\n if (this.type === \"date\") {\n return this.formatUtil.toFormat(value, this.dateReadonlyFormat);\n }\n\n return this.formatUtil.toFormat(value, this.format);\n }\n\n /**\n * Retrieve readonly value, the date in the configurated format\n */\n get readonlyvalue(): string {\n if (typeof this.value === \"string\") {\n return this.formatValue(this.value.toString());\n }\n\n return \"\";\n }\n\n /**\n * Get minimum date\n */\n get mindate(): string | null {\n return this.getContribution(\"mindate\");\n }\n\n /**\n * Get maximum date\n */\n get maxdate(): string | null {\n return this.getContribution(\"maxdate\");\n }\n\n /**\n * Registers an error that was received from a server response\n */\n addServerError(error: FormErrorAnchor) {\n const { id, message, properties, layouthint } = error;\n if (properties && has(properties, \"format\") && this.formatLabel) {\n properties.format = this.formatLabel;\n }\n\n this._errorCollection.addServerError(id, message, properties, layouthint);\n }\n\n /**\n */\n getFormatConstraint(): IConstraintModel {\n switch (this.type) {\n case \"date\":\n return new DateTimeDateFormatConstraint(\n this.dateInputFormat,\n this.formatLabel,\n );\n case \"time\":\n return new DateTimeTimeFormatConstraint(\n this.timeInputFormat,\n this.formatLabel,\n );\n default:\n return new DatetimeFormatConstraint(\n this.type,\n this.inputFormat,\n this.formatLabel,\n );\n }\n }\n\n /**\n * Add Date constraints for attribute\n */\n addConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n constraints.add(this.getFormatConstraint());\n\n if (this.mindate || this.maxdate) {\n constraints.add(\n new DateBoundaryConstraint(\n this.type,\n this.mindate,\n this.maxdate,\n this.inputFormat,\n ),\n );\n }\n\n return constraints;\n }\n\n /**\n */\n get readonlyWidth(): $Keys<typeof ATTRIBUTE_WIDTH> {\n if (this.type === \"date\" || this.type === \"time\") {\n return ATTRIBUTE_WIDTH.SMALL;\n }\n\n return ATTRIBUTE_WIDTH.MEDIUM;\n }\n\n /**\n */\n updateByAttribute(otherAttribute: AttributeType): void {\n this.reset();\n if (otherAttribute instanceof DatetimeAttributeModel) {\n const otherValue = otherAttribute.value;\n if (otherValue != null) {\n const inputValue = this.formatUtil.toFormat(\n otherValue,\n this.inputFormat,\n );\n this.update(inputValue);\n }\n } else {\n console.error(\n `update of datetime attribute with ${otherAttribute.type} not supported`,\n );\n }\n }\n}\n\nexport default DatetimeAttributeModel;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DatetimeAttributeModel.js","names":["_objects","require","_DateTimeUtil","_StringAttributeModel","_interopRequireDefault","_ConstraintCollection","_DateTimeDateFormatConstraint","_DateTimeTimeFormatConstraint","_DatetimeFormatConstraint","_DateBoundaryConstraint","_constants","DatetimeAttributeModel","StringAttributeModel","constructor","attribute","attributeContributions","modelOptions","updateInitValue","isApplicableModel","contributions","_context","_includes","default","call","type","formatUtil","TimeUtil","TimestampUtil","DateTimeUtil","DateUtil","getInitValue","value","data","length","toFormat","getIsoFormat","toISO","hasTime","getTimeValue","_context2","_context3","_context4","_context5","timeValue","timeInputFormat","toLowerCase","setHour","setMinute","setSecond","setMilliseconds","isIncludeTimeOffsetInDateTimes","oldOffset","DATETIME_OFFSET_FORMAT","newOffset","replace","_initvalue","_inputvalue","getInitialInputValue","_value","initValue","inputFormat","getContribution","getInputValue","toString","inputvalue","validate","format","convertFormat","hasDate","formatLabel","dateInputFormat","inputFormatWithoutOffset","_context6","_trim","_context7","dateReadonlyFormat","_context8","placeholder","_placeholder","split","timeFormatParts","push","timeFormat","join","timeReadonlyFormat","dateInputValue","timeInputValue","formatValue","hasFormat","ISO_DATE_FORMAT","dateTimeReadonlyFormat","readonlyvalue","isAmbiguous","offset","getOffset","mindate","maxdate","addServerError","error","id","message","properties","layouthint","has","_errorCollection","getFormatConstraint","DateTimeDateFormatConstraint","DateTimeTimeFormatConstraint","DatetimeFormatConstraint","addConstraints","constraints","ConstraintCollection","add","DateBoundaryConstraint","readonlyWidth","ATTRIBUTE_WIDTH","SMALL","MEDIUM","updateByAttribute","otherAttribute","reset","otherValue","inputValue","update","console","_default","exports"],"sources":["../../../src/models/attributes/DatetimeAttributeModel.js"],"sourcesContent":["// @flow\nimport { has } from \"../../utils/helpers/objects\";\n\nimport {\n DateUtil,\n DateTimeUtil,\n TimeUtil,\n TimestampUtil,\n} from \"../../utils/datetime/DateTimeUtil\";\n\nimport StringAttributeModel from \"./StringAttributeModel\";\n\nimport ConstraintCollection from \"./input-constraints/ConstraintCollection\";\nimport DateTimeDateFormatConstraint from \"./input-constraints/DateTimeDateFormatConstraint\";\nimport DateTimeTimeFormatConstraint from \"./input-constraints/DateTimeTimeFormatConstraint\";\nimport DatetimeFormatConstraint from \"./input-constraints/DatetimeFormatConstraint\";\nimport DateBoundaryConstraint from \"./input-constraints/DateBoundaryConstraint\";\n\nimport {\n isIncludeTimeOffsetInDateTimes,\n ATTRIBUTE_WIDTH,\n DATETIME_OFFSET_FORMAT,\n ISO_DATE_FORMAT,\n} from \"../../constants\";\n\nimport type {\n FormErrorAnchor,\n IConstraintModel,\n AttributeType,\n ModelOptions,\n} from \"../types\";\nimport type { OffsetInfo } from \"../../utils/datetime/DateTimeUtil\";\n\n/**\n */\nclass DatetimeAttributeModel extends StringAttributeModel {\n /**\n */\n constructor(\n attribute: Object,\n attributeContributions: Object,\n modelOptions?: ModelOptions,\n ) {\n super(attribute, attributeContributions, modelOptions);\n\n this.updateInitValue();\n }\n\n /**\n */\n static isApplicableModel(contributions: Object): boolean {\n return [\"date\", \"time\", \"datetime\", \"timestamp\"].includes(\n contributions.type,\n );\n }\n\n /**\n */\n get formatUtil():\n | typeof TimeUtil\n | typeof TimestampUtil\n | typeof DateTimeUtil\n | typeof DateUtil {\n switch (this.type) {\n case \"time\":\n return TimeUtil;\n case \"timestamp\":\n return TimestampUtil;\n case \"datetime\":\n return DateTimeUtil;\n default:\n return DateUtil;\n }\n }\n\n /**\n */\n getInitValue(): string | null {\n let value = this.data.value;\n if (value != null) {\n if (this.type === \"time\" && value.length === 5) {\n value = `${value}:00`;\n }\n\n // handle old datetime values, which contained ms\n if (this.type === \"datetime\" && value.includes(\".\")) {\n value = TimestampUtil.toFormat(value, DateTimeUtil.getIsoFormat());\n } else {\n value = this.formatUtil.toISO(value);\n }\n\n if (this.hasTime) {\n value = this.getTimeValue(value);\n }\n }\n\n return value;\n }\n\n /**\n */\n getTimeValue(value: string): string {\n let timeValue = value;\n if (!this.timeInputFormat.toLowerCase().includes(\"h\")) {\n timeValue = this.formatUtil.setHour(value, 0);\n }\n if (!this.timeInputFormat.includes(\"m\")) {\n timeValue = this.formatUtil.setMinute(value, 0);\n }\n if (!this.timeInputFormat.includes(\"s\")) {\n timeValue = this.formatUtil.setSecond(value, 0);\n }\n if (this.type === \"timestamp\" && !this.timeInputFormat.includes(\"S\")) {\n timeValue = this.formatUtil.setMilliseconds(value, 0);\n }\n\n if (isIncludeTimeOffsetInDateTimes()) {\n // https://github.com/date-fns/date-fns/issues/3579\n const oldOffset = this.formatUtil.toFormat(value, DATETIME_OFFSET_FORMAT);\n const newOffset = this.formatUtil.toFormat(\n timeValue,\n DATETIME_OFFSET_FORMAT,\n );\n timeValue = timeValue.replace(newOffset, oldOffset);\n }\n\n return timeValue;\n }\n\n /**\n * Set time in the correct value based on available elements in the time format\n */\n updateInitValue() {\n const value = this.getInitValue();\n if (value != null) {\n this._initvalue = value;\n this._inputvalue = this.getInitialInputValue(value);\n this._value = value;\n }\n }\n\n /**\n * Get initial user input value\n */\n getInitialInputValue(value?: string): string {\n if (!value) {\n return \"\";\n }\n\n let initValue = value;\n if (this.type === \"time\" && value.length === 5) {\n initValue = `${value}:00`;\n }\n\n return this.formatUtil.toFormat(initValue, this.inputFormat);\n }\n\n /**\n * Set type to date\n */\n get type(): string {\n return this.getContribution(\"type\", \"date\");\n }\n\n /**\n * Returns the value as entered by the user. This can differ from the internal iso value that is stored\n */\n getInputValue(): string {\n return this._inputvalue ? this._inputvalue.toString() : \"\";\n }\n\n /**\n * Get input value\n */\n get inputvalue(): string {\n return this.getInputValue();\n }\n\n /**\n * Sets the input value to the value entered by the user\n */\n set inputvalue(value: string) {\n this.validate(value);\n\n this._inputvalue = value;\n\n this.value =\n value !== null && value !== \"\"\n ? this.formatUtil.toISO(value, this.inputFormat)\n : null;\n }\n\n /**\n * Get date format\n */\n get format(): string {\n const format = this.getContribution(\"format\", \"\");\n return this.formatUtil.convertFormat(format);\n }\n\n /**\n */\n get hasDate(): boolean {\n return (\n this.type === \"date\" ||\n this.type === \"datetime\" ||\n this.type === \"timestamp\"\n );\n }\n\n /**\n */\n get hasTime(): boolean {\n return (\n this.type === \"time\" ||\n this.type === \"datetime\" ||\n this.type === \"timestamp\"\n );\n }\n\n /**\n */\n get formatLabel(): string {\n switch (this.type) {\n case \"date\":\n return this.dateInputFormat.toLowerCase();\n case \"time\":\n return this.timeInputFormat.toLowerCase();\n default:\n return this.format.toLowerCase();\n }\n }\n\n /**\n */\n get inputFormatWithoutOffset(): string {\n if (this.hasDate && this.hasTime) {\n return `${this.dateInputFormat} ${this.timeInputFormat}`.trim();\n }\n\n if (this.hasDate) {\n return this.dateInputFormat;\n }\n\n if (this.hasTime) {\n return this.timeInputFormat;\n }\n\n return \"\";\n }\n\n /**\n */\n get inputFormat(): string {\n if (\n isIncludeTimeOffsetInDateTimes() &&\n this.dateInputFormat !== \"\" &&\n this.timeInputFormat !== \"\"\n ) {\n return `${this.inputFormatWithoutOffset} ${DATETIME_OFFSET_FORMAT}`;\n }\n return this.inputFormatWithoutOffset;\n }\n\n /**\n */\n get dateInputFormat(): string {\n if (!this.hasDate) {\n return \"\";\n }\n\n return this.hasTime\n ? this.format.replace(this.timeInputFormat, \"\").trim()\n : this.format;\n }\n\n /**\n */\n get dateReadonlyFormat(): string {\n if (!this.hasDate) {\n return \"\";\n }\n\n return this.hasTime\n ? this.format.replace(this.timeInputFormat, \"\").trim()\n : this.format;\n }\n\n /**\n * return attribute placeholder or return formatlabel without time input format from contributions\n */\n get placeholder(): string {\n if (this._placeholder !== \"\") {\n return this._placeholder;\n }\n\n const formatLabel = this.getContribution(\"formatlabel\", \"\");\n\n if (this.hasDate && this.hasTime && formatLabel.includes(\" \")) {\n // return first part of formatlabel to keep placeholder matching date input\n return formatLabel.split(\" \")[0];\n }\n\n return formatLabel;\n }\n\n /**\n * Set placeholder text\n */\n set placeholder(placeholder: string) {\n this._placeholder = placeholder;\n }\n\n /**\n */\n get timeInputFormat(): string {\n if (!this.hasTime) {\n return \"\";\n }\n\n const format = this.format;\n\n let timeFormatParts = [];\n if (format.includes(\"H\")) {\n timeFormatParts.push(\"HH\");\n } else if (format.includes(\"h\")) {\n timeFormatParts.push(\"hh\");\n }\n if (format.includes(\"m\")) {\n timeFormatParts.push(\"mm\");\n }\n if (format.includes(\"s\")) {\n timeFormatParts.push(\"ss\");\n }\n\n let timeFormat = timeFormatParts.join(\":\");\n if (format.includes(\"S\")) {\n timeFormat = `${timeFormat}.SSS`;\n }\n if (format.includes(\"a\")) {\n return `${timeFormat} a`;\n }\n return timeFormat;\n }\n\n /**\n */\n get timeReadonlyFormat(): string {\n if (!this.hasTime) {\n return \"\";\n }\n\n return this.timeInputFormat;\n }\n\n /**\n */\n get dateInputValue(): string {\n return typeof this.value === \"string\" && this.dateInputFormat !== \"\"\n ? this.formatUtil.toFormat(this.value, this.dateInputFormat)\n : \"\";\n }\n\n /**\n */\n get timeInputValue(): string {\n return typeof this.value === \"string\" && this.timeInputFormat !== \"\"\n ? this.formatUtil.toFormat(this.value, this.timeInputFormat)\n : \"\";\n }\n\n /**\n * format value in readonly rendering\n */\n formatValue(value: ?string): string {\n if (value == null || value.toString() === \"\") {\n return \"\";\n }\n\n // when the value is exactly an iso date, render as date\n if (\n (this.type === \"datetime\" || this.type === \"timestamp\") &&\n DateUtil.hasFormat(value, ISO_DATE_FORMAT)\n ) {\n return DateUtil.toFormat(value, this.dateReadonlyFormat);\n }\n\n if (this.hasDate && this.hasTime) {\n const dateTimeReadonlyFormat = `${this.dateReadonlyFormat} ${this.timeReadonlyFormat}`;\n return this.formatUtil.toFormat(value, dateTimeReadonlyFormat);\n }\n\n if (this.type === \"date\") {\n return this.formatUtil.toFormat(value, this.dateReadonlyFormat);\n }\n\n return this.formatUtil.toFormat(value, this.format);\n }\n\n /**\n * Retrieve readonly value, the date in the configurated format\n */\n get readonlyvalue(): string {\n if (typeof this.value === \"string\") {\n return this.formatValue(this.value.toString());\n }\n\n return \"\";\n }\n\n /**\n */\n get isAmbiguous(): boolean {\n if (typeof this.value === \"string\") {\n return this.formatUtil.isAmbiguous(this.value);\n }\n return false;\n }\n\n /**\n */\n get offset(): OffsetInfo | null {\n if (typeof this.value === \"string\") {\n return this.formatUtil.getOffset(this.value);\n }\n return null;\n }\n\n /**\n * Get minimum date\n */\n get mindate(): string | null {\n return this.getContribution(\"mindate\");\n }\n\n /**\n * Get maximum date\n */\n get maxdate(): string | null {\n return this.getContribution(\"maxdate\");\n }\n\n /**\n * Registers an error that was received from a server response\n */\n addServerError(error: FormErrorAnchor) {\n const { id, message, properties, layouthint } = error;\n if (properties && has(properties, \"format\") && this.formatLabel) {\n properties.format = this.formatLabel;\n }\n\n this._errorCollection.addServerError(id, message, properties, layouthint);\n }\n\n /**\n */\n getFormatConstraint(): IConstraintModel {\n switch (this.type) {\n case \"date\":\n return new DateTimeDateFormatConstraint(\n this.dateInputFormat,\n this.formatLabel,\n );\n case \"time\":\n return new DateTimeTimeFormatConstraint(\n this.timeInputFormat,\n this.formatLabel,\n );\n default:\n return new DatetimeFormatConstraint(\n this.type,\n this.inputFormat,\n this.formatLabel,\n );\n }\n }\n\n /**\n * Add Date constraints for attribute\n */\n addConstraints(): ConstraintCollection {\n const constraints = new ConstraintCollection();\n\n constraints.add(this.getFormatConstraint());\n\n if (this.mindate || this.maxdate) {\n constraints.add(\n new DateBoundaryConstraint(\n this.type,\n this.mindate,\n this.maxdate,\n this.inputFormat,\n ),\n );\n }\n\n return constraints;\n }\n\n /**\n */\n get readonlyWidth(): $Keys<typeof ATTRIBUTE_WIDTH> {\n if (this.type === \"date\" || this.type === \"time\") {\n return ATTRIBUTE_WIDTH.SMALL;\n }\n\n return ATTRIBUTE_WIDTH.MEDIUM;\n }\n\n /**\n */\n updateByAttribute(otherAttribute: AttributeType): void {\n this.reset();\n if (otherAttribute instanceof DatetimeAttributeModel) {\n const otherValue = otherAttribute.value;\n if (otherValue != null) {\n const inputValue = this.formatUtil.toFormat(\n otherValue,\n this.inputFormat,\n );\n this.update(inputValue);\n }\n } else {\n console.error(\n `update of datetime attribute with ${otherAttribute.type} not supported`,\n );\n }\n }\n}\n\nexport default DatetimeAttributeModel;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -165,4 +165,13 @@ describe("datetimeAttributeModel", () => {
|
|
|
165
165
|
|
|
166
166
|
expect(attribute.placeholder).toBe("dd-MM-yyyy");
|
|
167
167
|
});
|
|
168
|
+
|
|
169
|
+
it("does NOT contain offset in formdata property", () => {
|
|
170
|
+
const attribute = new DatetimeAttributeModel(
|
|
171
|
+
{ key: "datetime", value: "2031-12-21T17:41:21" },
|
|
172
|
+
{ type: "datetime" },
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
expect(attribute.formdata).toEqual({ datetime: "2031-12-21T17:41:21" });
|
|
176
|
+
});
|
|
168
177
|
});
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import DatetimeAttributeModel from "../DatetimeAttributeModel";
|
|
2
|
+
import {
|
|
3
|
+
ATTRIBUTE_WIDTH,
|
|
4
|
+
INCLUDE_TIME_OFFSET,
|
|
5
|
+
setSettings,
|
|
6
|
+
} from "../../../constants";
|
|
7
|
+
import { DateTimeUtil } from "../../../utils";
|
|
8
|
+
|
|
9
|
+
describe("datetimeAttributeModel with offset on", () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
setSettings({ [INCLUDE_TIME_OFFSET]: true });
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it("should be able to create an empty DatetimeAttribute object", () => {
|
|
15
|
+
const attribute = new DatetimeAttributeModel({}, { type: "datetime" });
|
|
16
|
+
|
|
17
|
+
expect(attribute).toBeInstanceOf(DatetimeAttributeModel);
|
|
18
|
+
|
|
19
|
+
expect(attribute.type).toBe("datetime");
|
|
20
|
+
expect(attribute.format).toBe("yyyy-MM-dd'T'HH:mm:ssxxx");
|
|
21
|
+
expect(attribute.getInputValue()).toBe("");
|
|
22
|
+
expect(attribute.inputvalue).toBe("");
|
|
23
|
+
expect(attribute.readonlyvalue).toBe("");
|
|
24
|
+
|
|
25
|
+
attribute.addConstraints();
|
|
26
|
+
expect(attribute.constraintCollection).toHaveLength(1);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should be able to update", () => {
|
|
30
|
+
const attribute = new DatetimeAttributeModel(
|
|
31
|
+
{},
|
|
32
|
+
{
|
|
33
|
+
type: "datetime",
|
|
34
|
+
format: "dd-MM-yyyy HH:mm",
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
attribute.update("18-08-2016 13:45 +02:00");
|
|
39
|
+
expect(attribute.getInputValue()).toBe("18-08-2016 13:45 +02:00");
|
|
40
|
+
expect(attribute.getInitialInputValue("2016-08-18T13:45:23+02:00")).toBe(
|
|
41
|
+
"18-08-2016 13:45 +02:00",
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
expect(attribute.readonlyvalue).toBe("18-08-2016 13:45");
|
|
45
|
+
|
|
46
|
+
attribute.update(null);
|
|
47
|
+
expect(attribute.getInputValue()).toBe("");
|
|
48
|
+
|
|
49
|
+
attribute.update("");
|
|
50
|
+
expect(attribute.value).toBeNull();
|
|
51
|
+
|
|
52
|
+
attribute.update("aaaa");
|
|
53
|
+
expect(attribute.value).toBe("Invalid Date");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should be able to handle min and max date in only date format and renders in format", () => {
|
|
57
|
+
const attribute = new DatetimeAttributeModel(
|
|
58
|
+
{},
|
|
59
|
+
{
|
|
60
|
+
type: "datetime",
|
|
61
|
+
format: "dd-MM-yyyy HH:mm",
|
|
62
|
+
mindate: "2010-10-01T00:00:00+02:00", // CEST
|
|
63
|
+
maxdate: "2010-10-31T23:59:59+01:00", // CET
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
attribute.update("18-08-2016 13:45");
|
|
68
|
+
|
|
69
|
+
expect(attribute.isValid).toBe(false);
|
|
70
|
+
expect(attribute.formatValue(attribute.mindate)).toBe("01-10-2010 00:00");
|
|
71
|
+
expect(attribute.formatValue(attribute.maxdate)).toBe("31-10-2010 23:59");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should return AttributeWidth for dates", () => {
|
|
75
|
+
const attribute = new DatetimeAttributeModel(
|
|
76
|
+
{},
|
|
77
|
+
{
|
|
78
|
+
type: "date",
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
expect(attribute.readonlyWidth).toBe(ATTRIBUTE_WIDTH.SMALL);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("should return AttributeWidth for times", () => {
|
|
85
|
+
const attribute = new DatetimeAttributeModel(
|
|
86
|
+
{},
|
|
87
|
+
{
|
|
88
|
+
type: "time",
|
|
89
|
+
},
|
|
90
|
+
);
|
|
91
|
+
expect(attribute.readonlyWidth).toBe(ATTRIBUTE_WIDTH.SMALL);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("should return AttributeWidth for datetime", () => {
|
|
95
|
+
const attribute = new DatetimeAttributeModel(
|
|
96
|
+
{},
|
|
97
|
+
{
|
|
98
|
+
type: "datetime",
|
|
99
|
+
},
|
|
100
|
+
);
|
|
101
|
+
expect(attribute.readonlyWidth).toBe(ATTRIBUTE_WIDTH.MEDIUM);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("can validate datetime with datetime format", () => {
|
|
105
|
+
const datetimeFormat = new DatetimeAttributeModel(
|
|
106
|
+
{},
|
|
107
|
+
{
|
|
108
|
+
type: "datetime",
|
|
109
|
+
format: "dd-MM-yyyy HH:mm",
|
|
110
|
+
},
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
expect(datetimeFormat.validate("19-10-2010 1:45 +02:00")).toBe(true);
|
|
114
|
+
expect(datetimeFormat.validate("19-10-2010 13:45 +02:00")).toBe(true);
|
|
115
|
+
|
|
116
|
+
expect(datetimeFormat.validate("19-10-2010")).toBe(false);
|
|
117
|
+
expect(datetimeFormat.validate("13:45")).toBe(false);
|
|
118
|
+
expect(datetimeFormat.validate("19-10-2010 1:45 am")).toBe(false);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("can validate datetime with only date format", () => {
|
|
122
|
+
const dateFormat = new DatetimeAttributeModel(
|
|
123
|
+
{},
|
|
124
|
+
{
|
|
125
|
+
type: "datetime",
|
|
126
|
+
format: "dd-MM-yyyy",
|
|
127
|
+
},
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
expect(dateFormat.validate("19-10-2010")).toBe(true);
|
|
131
|
+
|
|
132
|
+
expect(dateFormat.validate("19-10-2010 1:45")).toBe(false);
|
|
133
|
+
expect(dateFormat.validate("13:45")).toBe(false);
|
|
134
|
+
expect(dateFormat.validate("19-10-2010 1:45 am")).toBe(false);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("can validate datetime with datetime am/pm format", () => {
|
|
138
|
+
const datetimeAmPmFormat = new DatetimeAttributeModel(
|
|
139
|
+
{},
|
|
140
|
+
{
|
|
141
|
+
type: "datetime",
|
|
142
|
+
format: "dd-MM-yyyy hh:mm a",
|
|
143
|
+
},
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
expect(datetimeAmPmFormat.validate("19-10-2010 1:45 am +02:00")).toBe(true);
|
|
147
|
+
expect(datetimeAmPmFormat.validate("19-10-2010 1:45 pm +02:00")).toBe(true);
|
|
148
|
+
|
|
149
|
+
expect(datetimeAmPmFormat.validate("19-10-2010 1:45 +02:00")).toBe(false);
|
|
150
|
+
expect(datetimeAmPmFormat.validate("19-10-2010 13:45 +02:00")).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("can handle old datetime format with ms", () => {
|
|
154
|
+
const attribute = new DatetimeAttributeModel(
|
|
155
|
+
{ value: "2031-12-21T17:41:21.000+01:00" },
|
|
156
|
+
{
|
|
157
|
+
type: "datetime",
|
|
158
|
+
format: "dd-MM-yyyy HH:mm",
|
|
159
|
+
},
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
expect(attribute.readonlyvalue).toBe("21-12-2031 17:41");
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("returns date part of formatlabel as placeholder if attribute has date and time", () => {
|
|
166
|
+
const attribute = new DatetimeAttributeModel(
|
|
167
|
+
{},
|
|
168
|
+
{
|
|
169
|
+
type: "datetime",
|
|
170
|
+
format: "dd-MM-yyyy HH:mm",
|
|
171
|
+
formatlabel: "dd-MM-yyyy HH:mm",
|
|
172
|
+
},
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
expect(attribute.placeholder).toBe("dd-MM-yyyy");
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("contains offset in formdata property", () => {
|
|
179
|
+
const attribute = new DatetimeAttributeModel(
|
|
180
|
+
{ key: "datetime", value: "2031-12-21T17:41:21+01:00" },
|
|
181
|
+
{ type: "datetime" },
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
expect(attribute.formdata).toEqual({
|
|
185
|
+
datetime: "2031-12-21T17:41:21+01:00",
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("handles offsets and indicates ambiguouty", () => {
|
|
190
|
+
const winter = new DatetimeAttributeModel(
|
|
191
|
+
{ key: "datetime", value: "2031-12-21T17:41:21+01:00" },
|
|
192
|
+
{ type: "datetime" },
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
expect(winter.isAmbiguous).toBe(false);
|
|
196
|
+
expect(winter.offset).toEqual({
|
|
197
|
+
abbr: "CET",
|
|
198
|
+
label: "Central European Standard Time",
|
|
199
|
+
value: "+01:00",
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const summer = new DatetimeAttributeModel(
|
|
203
|
+
{ key: "datetime", value: "2031-07-01T17:41:21+02:00" },
|
|
204
|
+
{ type: "datetime" },
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
expect(summer.isAmbiguous).toBe(false);
|
|
208
|
+
expect(summer.offset).toEqual({
|
|
209
|
+
abbr: "CEST",
|
|
210
|
+
label: "Central European Summer Time",
|
|
211
|
+
value: "+02:00",
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const ambiguousSummer = new DatetimeAttributeModel(
|
|
215
|
+
{ key: "datetime", value: "2024-10-27T02:30:00+02:00" },
|
|
216
|
+
{ type: "datetime" },
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
expect(ambiguousSummer.isAmbiguous).toBe(true);
|
|
220
|
+
expect(ambiguousSummer.offset).toEqual({
|
|
221
|
+
abbr: "CEST",
|
|
222
|
+
label: "Central European Summer Time",
|
|
223
|
+
value: "+02:00",
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const ambiguousWinter = new DatetimeAttributeModel(
|
|
227
|
+
{ key: "datetime", value: "2024-10-27T02:30:00+01:00" },
|
|
228
|
+
{ type: "datetime" },
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
expect(ambiguousWinter.isAmbiguous).toBe(true);
|
|
232
|
+
expect(ambiguousWinter.offset).toEqual({
|
|
233
|
+
abbr: "CET",
|
|
234
|
+
label: "Central European Standard Time",
|
|
235
|
+
value: "+01:00",
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("retrieves the correct error collection", () => {
|
|
240
|
+
const attribute = new DatetimeAttributeModel(
|
|
241
|
+
{},
|
|
242
|
+
{
|
|
243
|
+
type: "datetime",
|
|
244
|
+
format: "dd-MM-yyyy HH:mm",
|
|
245
|
+
},
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
attribute.inputvalue = "27-10-2024";
|
|
249
|
+
|
|
250
|
+
expect(attribute.errorCollection.map((error) => error.id)).toEqual([
|
|
251
|
+
"Constraint.DateTime.MissingValue",
|
|
252
|
+
]);
|
|
253
|
+
|
|
254
|
+
attribute.inputvalue = "27-10-2024 02:30";
|
|
255
|
+
|
|
256
|
+
expect(attribute.errorCollection.map((error) => error.id)).toEqual([
|
|
257
|
+
"Constraint.DateTime.MissingOffset",
|
|
258
|
+
]);
|
|
259
|
+
|
|
260
|
+
attribute.inputvalue = "27-10-2024 +02:00";
|
|
261
|
+
|
|
262
|
+
expect(attribute.errorCollection.map((error) => error.id)).toEqual([
|
|
263
|
+
"Constraint.DateTime.MissingValue",
|
|
264
|
+
]);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it("handles dst", () => {
|
|
268
|
+
const attribute1 = new DatetimeAttributeModel(
|
|
269
|
+
{ value: "2024-10-27T01:30:00+00:00" },
|
|
270
|
+
{
|
|
271
|
+
type: "datetime",
|
|
272
|
+
format: "dd-MM-yyyy HH:mm",
|
|
273
|
+
},
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
expect(attribute1.initvalue).toBe("2024-10-27T02:30:00+01:00");
|
|
277
|
+
expect(
|
|
278
|
+
DateTimeUtil.toFormat(attribute1.value, "dd-MM-yyyy HH:mm xxx"),
|
|
279
|
+
).toBe("27-10-2024 02:30 +01:00");
|
|
280
|
+
expect(attribute1.isAmbiguous).toBe(true);
|
|
281
|
+
expect(attribute1.offset).toEqual({
|
|
282
|
+
abbr: "CET",
|
|
283
|
+
label: "Central European Standard Time",
|
|
284
|
+
value: "+01:00",
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
const attribute2 = new DatetimeAttributeModel(
|
|
288
|
+
{ value: "2024-10-27T00:30:00+00:00" },
|
|
289
|
+
{
|
|
290
|
+
type: "datetime",
|
|
291
|
+
format: "dd-MM-yyyy HH:mm",
|
|
292
|
+
},
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
expect(attribute2.initvalue).toBe("2024-10-27T02:30:00+02:00");
|
|
296
|
+
expect(
|
|
297
|
+
DateTimeUtil.toFormat(attribute2.value, "dd-MM-yyyy HH:mm xxx"),
|
|
298
|
+
).toBe("27-10-2024 02:30 +02:00");
|
|
299
|
+
expect(attribute2.isAmbiguous).toBe(true);
|
|
300
|
+
expect(attribute2.offset).toEqual({
|
|
301
|
+
abbr: "CEST",
|
|
302
|
+
label: "Central European Summer Time",
|
|
303
|
+
value: "+02:00",
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
@@ -5,19 +5,25 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
+
var _trim = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/trim"));
|
|
8
9
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
|
9
10
|
var _DateTimeUtil = require("../../../utils/datetime/DateTimeUtil");
|
|
11
|
+
var _constants = require("../../../constants");
|
|
10
12
|
/**
|
|
11
13
|
*/
|
|
12
14
|
class DatetimeFormatConstraint {
|
|
13
15
|
/**
|
|
14
16
|
*/
|
|
15
17
|
constructor(type, format, formatLabel) {
|
|
18
|
+
var _context;
|
|
16
19
|
(0, _defineProperty2.default)(this, "_type", void 0);
|
|
17
20
|
(0, _defineProperty2.default)(this, "_format", void 0);
|
|
21
|
+
(0, _defineProperty2.default)(this, "_formatNoOffset", void 0);
|
|
18
22
|
(0, _defineProperty2.default)(this, "_formatLabel", void 0);
|
|
23
|
+
(0, _defineProperty2.default)(this, "_id", "Constraint.DateTime.MissingValue");
|
|
19
24
|
this._type = type;
|
|
20
25
|
this._format = format;
|
|
26
|
+
this._formatNoOffset = (0, _trim.default)(_context = format.replace(_constants.DATETIME_OFFSET_FORMAT, "")).call(_context);
|
|
21
27
|
this._formatLabel = formatLabel;
|
|
22
28
|
}
|
|
23
29
|
|
|
@@ -30,7 +36,7 @@ class DatetimeFormatConstraint {
|
|
|
30
36
|
/**
|
|
31
37
|
*/
|
|
32
38
|
get id() {
|
|
33
|
-
return
|
|
39
|
+
return this._id;
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
/**
|
|
@@ -54,12 +60,22 @@ class DatetimeFormatConstraint {
|
|
|
54
60
|
/**
|
|
55
61
|
*/
|
|
56
62
|
get defaultMessage() {
|
|
63
|
+
if (this._id === "Constraint.DateTime.MissingOffset") {
|
|
64
|
+
return "Please select ${daylight-label} or ${standard-label}";
|
|
65
|
+
}
|
|
57
66
|
return "Date and time should both be entered";
|
|
58
67
|
}
|
|
59
68
|
|
|
60
69
|
/**
|
|
61
70
|
*/
|
|
62
71
|
get parameters() {
|
|
72
|
+
if (this._id === "Constraint.DateTime.MissingOffset") {
|
|
73
|
+
const offsets = _DateTimeUtil.DateTimeUtil.getTimezoneOffsets();
|
|
74
|
+
return {
|
|
75
|
+
"daylight-label": offsets.daylight?.label,
|
|
76
|
+
"standard-label": offsets.standard?.label
|
|
77
|
+
};
|
|
78
|
+
}
|
|
63
79
|
return {
|
|
64
80
|
format: this.formatLabel
|
|
65
81
|
};
|
|
@@ -80,7 +96,20 @@ class DatetimeFormatConstraint {
|
|
|
80
96
|
if (!value) {
|
|
81
97
|
return false;
|
|
82
98
|
}
|
|
83
|
-
|
|
99
|
+
if (this.formatUtil.hasFormat(value, this.format)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if ((0, _constants.isIncludeTimeOffsetInDateTimes)()) {
|
|
103
|
+
const hasDateTime = this.formatUtil.hasFormat(value, this._formatNoOffset);
|
|
104
|
+
if (!hasDateTime) {
|
|
105
|
+
this._id = "Constraint.DateTime.MissingValue";
|
|
106
|
+
return false;
|
|
107
|
+
} else if (!new RegExp("[+-](0[0-9]|1[0-4]):[0-5][0-9]").test(value)) {
|
|
108
|
+
this._id = "Constraint.DateTime.MissingOffset";
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
84
113
|
}
|
|
85
114
|
|
|
86
115
|
/**
|
|
@@ -4,6 +4,11 @@ import {
|
|
|
4
4
|
DateTimeUtil,
|
|
5
5
|
} from "../../../utils/datetime/DateTimeUtil";
|
|
6
6
|
|
|
7
|
+
import {
|
|
8
|
+
DATETIME_OFFSET_FORMAT,
|
|
9
|
+
isIncludeTimeOffsetInDateTimes,
|
|
10
|
+
} from "../../../constants";
|
|
11
|
+
|
|
7
12
|
import type { IConstraintModel } from "../../types";
|
|
8
13
|
|
|
9
14
|
/**
|
|
@@ -11,13 +16,17 @@ import type { IConstraintModel } from "../../types";
|
|
|
11
16
|
class DatetimeFormatConstraint implements IConstraintModel {
|
|
12
17
|
_type: string;
|
|
13
18
|
_format: string;
|
|
19
|
+
_formatNoOffset: string;
|
|
14
20
|
_formatLabel: string;
|
|
15
21
|
|
|
22
|
+
_id: string = "Constraint.DateTime.MissingValue";
|
|
23
|
+
|
|
16
24
|
/**
|
|
17
25
|
*/
|
|
18
26
|
constructor(type: string, format: string, formatLabel: string) {
|
|
19
27
|
this._type = type;
|
|
20
28
|
this._format = format;
|
|
29
|
+
this._formatNoOffset = format.replace(DATETIME_OFFSET_FORMAT, "").trim();
|
|
21
30
|
this._formatLabel = formatLabel;
|
|
22
31
|
}
|
|
23
32
|
|
|
@@ -30,7 +39,7 @@ class DatetimeFormatConstraint implements IConstraintModel {
|
|
|
30
39
|
/**
|
|
31
40
|
*/
|
|
32
41
|
get id(): string {
|
|
33
|
-
return
|
|
42
|
+
return this._id;
|
|
34
43
|
}
|
|
35
44
|
|
|
36
45
|
/**
|
|
@@ -54,12 +63,24 @@ class DatetimeFormatConstraint implements IConstraintModel {
|
|
|
54
63
|
/**
|
|
55
64
|
*/
|
|
56
65
|
get defaultMessage(): string {
|
|
66
|
+
if (this._id === "Constraint.DateTime.MissingOffset") {
|
|
67
|
+
return "Please select ${daylight-label} or ${standard-label}";
|
|
68
|
+
}
|
|
57
69
|
return "Date and time should both be entered";
|
|
58
70
|
}
|
|
59
71
|
|
|
60
72
|
/**
|
|
61
73
|
*/
|
|
62
|
-
get parameters():
|
|
74
|
+
get parameters():
|
|
75
|
+
| { format: string }
|
|
76
|
+
| { "daylight-label": ?string, "standard-label": ?string } {
|
|
77
|
+
if (this._id === "Constraint.DateTime.MissingOffset") {
|
|
78
|
+
const offsets = DateTimeUtil.getTimezoneOffsets();
|
|
79
|
+
return {
|
|
80
|
+
"daylight-label": offsets.daylight?.label,
|
|
81
|
+
"standard-label": offsets.standard?.label,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
63
84
|
return { format: this.formatLabel };
|
|
64
85
|
}
|
|
65
86
|
|
|
@@ -80,7 +101,25 @@ class DatetimeFormatConstraint implements IConstraintModel {
|
|
|
80
101
|
return false;
|
|
81
102
|
}
|
|
82
103
|
|
|
83
|
-
|
|
104
|
+
if (this.formatUtil.hasFormat(value, this.format)) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (isIncludeTimeOffsetInDateTimes()) {
|
|
109
|
+
const hasDateTime = this.formatUtil.hasFormat(
|
|
110
|
+
value,
|
|
111
|
+
this._formatNoOffset,
|
|
112
|
+
);
|
|
113
|
+
if (!hasDateTime) {
|
|
114
|
+
this._id = "Constraint.DateTime.MissingValue";
|
|
115
|
+
return false;
|
|
116
|
+
} else if (!new RegExp("[+-](0[0-9]|1[0-4]):[0-5][0-9]").test(value)) {
|
|
117
|
+
this._id = "Constraint.DateTime.MissingOffset";
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return false;
|
|
84
123
|
}
|
|
85
124
|
|
|
86
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatetimeFormatConstraint.js","names":["_DateTimeUtil","require","DatetimeFormatConstraint","constructor","type","format","formatLabel","_defineProperty2","default","_type","_format","_formatLabel","id","hasValidation","defaultMessage","parameters","
|
|
1
|
+
{"version":3,"file":"DatetimeFormatConstraint.js","names":["_DateTimeUtil","require","_constants","DatetimeFormatConstraint","constructor","type","format","formatLabel","_context","_defineProperty2","default","_type","_format","_formatNoOffset","_trim","replace","DATETIME_OFFSET_FORMAT","call","_formatLabel","id","_id","hasValidation","defaultMessage","parameters","offsets","DateTimeUtil","getTimezoneOffsets","daylight","label","standard","formatUtil","TimestampUtil","validate","value","hasFormat","isIncludeTimeOffsetInDateTimes","hasDateTime","RegExp","test","isMandatoryConstraint","_default","exports"],"sources":["../../../../src/models/attributes/input-constraints/DatetimeFormatConstraint.js"],"sourcesContent":["// @flow\nimport {\n TimestampUtil,\n DateTimeUtil,\n} from \"../../../utils/datetime/DateTimeUtil\";\n\nimport {\n DATETIME_OFFSET_FORMAT,\n isIncludeTimeOffsetInDateTimes,\n} from \"../../../constants\";\n\nimport type { IConstraintModel } from \"../../types\";\n\n/**\n */\nclass DatetimeFormatConstraint implements IConstraintModel {\n _type: string;\n _format: string;\n _formatNoOffset: string;\n _formatLabel: string;\n\n _id: string = \"Constraint.DateTime.MissingValue\";\n\n /**\n */\n constructor(type: string, format: string, formatLabel: string) {\n this._type = type;\n this._format = format;\n this._formatNoOffset = format.replace(DATETIME_OFFSET_FORMAT, \"\").trim();\n this._formatLabel = formatLabel;\n }\n\n /**\n */\n get type(): string {\n return this._type;\n }\n\n /**\n */\n get id(): string {\n return this._id;\n }\n\n /**\n */\n get format(): string {\n return this._format;\n }\n\n /**\n */\n get formatLabel(): string {\n return this._formatLabel;\n }\n\n /**\n */\n hasValidation(): boolean {\n return true;\n }\n\n /**\n */\n get defaultMessage(): string {\n if (this._id === \"Constraint.DateTime.MissingOffset\") {\n return \"Please select ${daylight-label} or ${standard-label}\";\n }\n return \"Date and time should both be entered\";\n }\n\n /**\n */\n get parameters():\n | { format: string }\n | { \"daylight-label\": ?string, \"standard-label\": ?string } {\n if (this._id === \"Constraint.DateTime.MissingOffset\") {\n const offsets = DateTimeUtil.getTimezoneOffsets();\n return {\n \"daylight-label\": offsets.daylight?.label,\n \"standard-label\": offsets.standard?.label,\n };\n }\n return { format: this.formatLabel };\n }\n\n /**\n */\n get formatUtil(): typeof TimestampUtil | typeof DateTimeUtil {\n if (this.type === \"timestamp\") {\n return TimestampUtil;\n }\n\n return DateTimeUtil;\n }\n\n /**\n */\n validate(value: string): boolean {\n if (!value) {\n return false;\n }\n\n if (this.formatUtil.hasFormat(value, this.format)) {\n return true;\n }\n\n if (isIncludeTimeOffsetInDateTimes()) {\n const hasDateTime = this.formatUtil.hasFormat(\n value,\n this._formatNoOffset,\n );\n if (!hasDateTime) {\n this._id = \"Constraint.DateTime.MissingValue\";\n return false;\n } else if (!new RegExp(\"[+-](0[0-9]|1[0-4]):[0-5][0-9]\").test(value)) {\n this._id = \"Constraint.DateTime.MissingOffset\";\n return false;\n }\n }\n\n return false;\n }\n\n /**\n */\n get isMandatoryConstraint(): boolean {\n return false;\n }\n}\n\nexport default DatetimeFormatConstraint;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -146,7 +146,7 @@ class SectionModel extends _BaseModel.default {
|
|
|
146
146
|
*/
|
|
147
147
|
get subSections() {
|
|
148
148
|
var _context4;
|
|
149
|
-
return this.data.subSections ? (0, _map.default)(_context4 = this.data.subSections).call(_context4, subSection => new _SubSectionModel.default(subSection)) : [];
|
|
149
|
+
return this.data.subSections ? (0, _map.default)(_context4 = this.data.subSections).call(_context4, subSection => new _SubSectionModel.default(subSection, this.entryDate, this.modelOptions)) : [];
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
/**
|
|
@@ -170,7 +170,8 @@ class SectionModel extends BaseModel {
|
|
|
170
170
|
get subSections(): Array<SubSectionModel> {
|
|
171
171
|
return this.data.subSections
|
|
172
172
|
? this.data.subSections.map(
|
|
173
|
-
(subSection) =>
|
|
173
|
+
(subSection) =>
|
|
174
|
+
new SubSectionModel(subSection, this.entryDate, this.modelOptions),
|
|
174
175
|
)
|
|
175
176
|
: [];
|
|
176
177
|
}
|