@operato/data-grist 2.0.0-alpha.20 → 2.0.0-alpha.23

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/editors/ox-grist-editor.js +1 -1
  3. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  4. package/dist/src/filters/filter-range-date.js +12 -1
  5. package/dist/src/filters/filter-range-date.js.map +1 -1
  6. package/dist/src/filters/filters-form.d.ts +1 -0
  7. package/dist/src/filters/filters-form.js +21 -3
  8. package/dist/src/filters/filters-form.js.map +1 -1
  9. package/dist/src/index.d.ts +0 -1
  10. package/dist/src/index.js +0 -1
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/types.d.ts +0 -8
  13. package/dist/src/types.js.map +1 -1
  14. package/dist/stories/grist-modes.stories.js +23 -2
  15. package/dist/stories/grist-modes.stories.js.map +1 -1
  16. package/dist/tsconfig.tsbuildinfo +1 -1
  17. package/docs/default-value/default-value.md +1 -1
  18. package/docs/default-value/value-generator/date-generator.md +2 -2
  19. package/docs/default-value/value-generator/month-date-generator.md +2 -2
  20. package/docs/default-value/value-generator/week-date-generator.md +2 -2
  21. package/docs/default-value/value-generator/year-date-generator.md +2 -2
  22. package/package.json +3 -2
  23. package/src/editors/ox-grist-editor.ts +1 -1
  24. package/src/filters/filter-range-date.ts +16 -1
  25. package/src/filters/filters-form.ts +25 -2
  26. package/src/index.ts +0 -1
  27. package/src/types.ts +0 -9
  28. package/stories/grist-modes.stories.ts +23 -2
  29. package/src/value-generator/date-generator.ts +0 -35
  30. package/src/value-generator/hour-time-generator.ts +0 -43
  31. package/src/value-generator/index.ts +0 -1
  32. package/src/value-generator/minute-time-generator.ts +0 -43
  33. package/src/value-generator/month-date-generator.ts +0 -38
  34. package/src/value-generator/now-generator.ts +0 -10
  35. package/src/value-generator/registry.ts +0 -58
  36. package/src/value-generator/time-generator.ts +0 -33
  37. package/src/value-generator/today-generator.ts +0 -10
  38. package/src/value-generator/week-date-generator.ts +0 -40
  39. package/src/value-generator/year-date-generator.ts +0 -36
@@ -14,7 +14,7 @@ function getRelativeYearDate(params: RelativeYearDateParams = {}): string | numb
14
14
 
15
15
  - `relativeYears?: number`: 상대적인 연도를 나타내는 숫자입니다. 이 값은 현재 날짜로부터의 연도 수를 나타냅니다. 예를 들어, 이 값이 3이면 현재 날짜로부터 3년 뒤를 나타냅니다. 이 값이 주어지지 않으면 기본값은 0입니다, 즉 현재 연도를 의미합니다.
16
16
 
17
- - `relativeDates?: number`: 상대적인 일수를 나타내는 숫자입니다. 이 값은 현재 날짜로부터의 일 수를 나타냅니다. 예를 들어, 이 값이 2이면 현재 날짜로부터 2일 뒤를 나타냅니다. 이 값이 주어지지 않으면 기본값은 0입니다, 즉 현재 날짜를 의미합니다.
17
+ - `relativeDays?: number`: 상대적인 일수를 나타내는 숫자입니다. 이 값은 현재 날짜로부터의 일 수를 나타냅니다. 예를 들어, 이 값이 2이면 현재 날짜로부터 2일 뒤를 나타냅니다. 이 값이 주어지지 않으면 기본값은 0입니다, 즉 현재 날짜를 의미합니다.
18
18
 
19
19
  - `timeZone?: string`: 날짜를 얻고자 하는 시간대를 나타내는 문자열입니다. 이 값이 주어지지 않으면 사용자의 로컬 시간대가 사용됩니다.
20
20
 
@@ -32,7 +32,7 @@ function getRelativeYearDate(params: RelativeYearDateParams = {}): string | numb
32
32
  ```typescript
33
33
  const relativeYearDate = getRelativeYearDate({
34
34
  relativeYears: 2,
35
- relativeDates: 3,
35
+ relativeDays: 3,
36
36
  timeZone: 'Asia/Seoul',
37
37
  format: 'date'
38
38
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/data-grist",
3
- "version": "2.0.0-alpha.20",
3
+ "version": "2.0.0-alpha.23",
4
4
  "description": "User interface for grid (desktop) and list (mobile)",
5
5
  "author": "heartyoh",
6
6
  "main": "dist/index.js",
@@ -61,6 +61,7 @@
61
61
  "@operato/popup": "^2.0.0-alpha.9",
62
62
  "@operato/pull-to-refresh": "^2.0.0-alpha.0",
63
63
  "@operato/styles": "^2.0.0-alpha.0",
64
+ "@operato/time-calculator": "^2.0.0-alpha.23",
64
65
  "@operato/utils": "^2.0.0-alpha.8",
65
66
  "i18next": "^21.5.4",
66
67
  "json5": "^2.2.0",
@@ -100,5 +101,5 @@
100
101
  "prettier --write"
101
102
  ]
102
103
  },
103
- "gitHead": "942ad6bf3a182a0412bc01473691ff221f419d5d"
104
+ "gitHead": "a8741296e49c13e6e3fd2894e8bd1618e72bd558"
104
105
  }
@@ -4,7 +4,7 @@ import { customElement, property } from 'lit/decorators.js'
4
4
  import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
5
5
  import { DataGridField } from '../data-grid/data-grid-field'
6
6
  import { ColumnConfig, GristRecord } from '../types'
7
- import { getDefaultValue } from '../value-generator'
7
+ import { getDefaultValue } from '@operato/time-calculator'
8
8
  import { parseToNumberOrNull } from '@operato/utils'
9
9
 
10
10
  const STYLE = css`
@@ -2,16 +2,31 @@ import { FilterConfigObject, FilterSelectRenderer } from '../types'
2
2
 
3
3
  import { html } from 'lit-html'
4
4
 
5
+ function formatDate(type: string, date: Date) {
6
+ var year = date.getFullYear()
7
+ var month = ('0' + (date.getMonth() + 1)).slice(-2)
8
+ var day = ('0' + date.getDate()).slice(-2)
9
+ var hours = ('0' + date.getHours()).slice(-2)
10
+ var minutes = ('0' + date.getMinutes()).slice(-2)
11
+
12
+ var formatDate = year + '-' + month + '-' + day
13
+
14
+ return type == 'date' ? formatDate : formatDate + 'T' + hours + ':' + minutes
15
+ }
16
+
5
17
  export const FilterRangeDate: FilterSelectRenderer = (column, value, owner) => {
6
18
  const filter = column.filter as FilterConfigObject
7
19
 
8
- const [from, to] = value instanceof Array ? value : []
20
+ var [from, to] = value instanceof Array ? value : []
9
21
 
10
22
  var type: any = filter?.type || column.type
11
23
  if (type === 'datetime') {
12
24
  type = 'datetime-local'
13
25
  }
14
26
 
27
+ from = formatDate(type, new Date(from))
28
+ to = formatDate(type, new Date(to))
29
+
15
30
  return html`
16
31
  <input
17
32
  name=${column.name}
@@ -6,6 +6,8 @@ import '@operato/input/ox-input-search.js'
6
6
  import { css, html, LitElement, PropertyValues, TemplateResult, nothing } from 'lit'
7
7
  import { customElement, property, queryAsync, state } from 'lit/decorators.js'
8
8
 
9
+ import { getDefaultValue } from '@operato/time-calculator'
10
+
9
11
  import { FilterConfigObject } from '..'
10
12
  import { DataGrist } from '../data-grist'
11
13
  import { ColumnConfig, FilterOperator, FilterValue, GristConfig } from '../types'
@@ -72,7 +74,6 @@ export class FiltersForm extends LitElement {
72
74
 
73
75
  if (grist) {
74
76
  this.config = grist.compiledConfig
75
- this.value = grist.filters || []
76
77
 
77
78
  grist.addEventListener('config-change', (e: Event) => {
78
79
  this.config = (e as CustomEvent).detail
@@ -102,6 +103,17 @@ export class FiltersForm extends LitElement {
102
103
  }
103
104
  }
104
105
 
106
+ buildDefaultValue(operator: string, defaultValue: any) {
107
+ if (defaultValue === undefined) {
108
+ return
109
+ }
110
+ if (operator == 'between') {
111
+ return (defaultValue as Array<any>).map(v => getDefaultValue(v, this))
112
+ } else {
113
+ return getDefaultValue(defaultValue, this)
114
+ }
115
+ }
116
+
105
117
  updated(changes: PropertyValues<this>) {
106
118
  if (changes.has('config')) {
107
119
  const filters = this.config.columns.filter(columnConfig => !!columnConfig.filter)
@@ -114,6 +126,15 @@ export class FiltersForm extends LitElement {
114
126
  return filter!.operator === 'search'
115
127
  })
116
128
 
129
+ const grist = this.closest('ox-grist') as DataGrist
130
+
131
+ this.value = (grist.filters || []).map(filter => {
132
+ return {
133
+ ...filter,
134
+ value: this.buildDefaultValue(filter!.operator, filter!.value)
135
+ }
136
+ })
137
+
117
138
  this.empty = (this.searchColumns.length === 0 || this.withoutSearch) && this.filterColumns.length === 0
118
139
  }
119
140
  }
@@ -160,7 +181,9 @@ export class FiltersForm extends LitElement {
160
181
  ? 'text'
161
182
  : type
162
183
  )[idx]
163
- const value = this.value?.find(filter => filter.name == name)?.value
184
+ const value =
185
+ this.value?.find(filter => filter.name == name)?.value ??
186
+ this.buildDefaultValue(operator!, (filter as FilterConfigObject)?.value)
164
187
 
165
188
  if (!renderer) {
166
189
  return html``
package/src/index.ts CHANGED
@@ -12,6 +12,5 @@ export * from './gutters'
12
12
  export * from './filters'
13
13
  export * from './sorters/sorters-control'
14
14
  export * from './record-view'
15
- export * from './value-generator'
16
15
 
17
16
  export * from './utils/list-param'
package/src/types.ts CHANGED
@@ -427,15 +427,6 @@ export type HeaderConfig = {
427
427
  */
428
428
  export type HeaderRenderer = (column: ColumnConfig) => any
429
429
 
430
- /**
431
- * Function type for generating values.
432
- *
433
- * @callback ValueGeneratorFn
434
- * @param {...any} args - The arguments used for generating a value.
435
- * @returns {*} - The generated value.
436
- */
437
- export type ValueGeneratorFn = (...args: any[]) => any
438
-
439
430
  /**
440
431
  * Configuration for specifying default values for fields in a record.
441
432
  * Default values can be set using predefined value generator functions or custom user-defined functions.
@@ -237,7 +237,10 @@ const config = {
237
237
  editable: true,
238
238
  defaultValue: 10000.1
239
239
  },
240
- filter: 'between',
240
+ filter: {
241
+ operator: 'between',
242
+ value: [1, 100]
243
+ },
241
244
  sortable: true,
242
245
  width: 50
243
246
  },
@@ -266,7 +269,25 @@ const config = {
266
269
  name: 'now'
267
270
  }
268
271
  },
269
- filter: 'between',
272
+ filter: {
273
+ operator: 'between',
274
+ type: 'datetime',
275
+ value: [
276
+ {
277
+ name: 'today',
278
+ params: {
279
+ type: 'datetime'
280
+ }
281
+ },
282
+ {
283
+ name: 'now',
284
+ params: {
285
+ type: 'datetime',
286
+ relativeDays: 1
287
+ }
288
+ }
289
+ ]
290
+ },
270
291
  sortable: true,
271
292
  width: 180
272
293
  },
@@ -1,35 +0,0 @@
1
- export type RelativeDateParams = {
2
- relativeDate?: number
3
- timeZone?: string
4
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
5
- }
6
-
7
- export const getRelativeDate = (params: RelativeDateParams = {}): Date | number | string => {
8
- const { relativeDate = 0, timeZone, format } = params
9
- const relativeSeconds = relativeDate * 24 * 60 * 60
10
-
11
- const now = new Date()
12
- let currentDate: Date
13
-
14
- if (timeZone) {
15
- const options: Intl.DateTimeFormatOptions = { timeZone }
16
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
17
- currentDate = new Date(currentDateISOString)
18
- } else {
19
- currentDate = now
20
- }
21
-
22
- const startOfDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate())
23
- const targetTime = startOfDay.getTime() + relativeSeconds * 1000
24
-
25
- if (format === 'date') {
26
- return new Date(targetTime)
27
- } else if (format === 'timestamp') {
28
- return targetTime
29
- } else if (format) {
30
- const formatter = new Intl.DateTimeFormat(undefined, format)
31
- return formatter.format(new Date(targetTime))
32
- } else {
33
- return new Date(targetTime)
34
- }
35
- }
@@ -1,43 +0,0 @@
1
- export type RelativeHourTimeParams = {
2
- timeZone?: string
3
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
4
- relativeHour?: number
5
- relativeSeconds?: number
6
- }
7
-
8
- export const getRelativeHourTime = (params: RelativeHourTimeParams = {}): Date | number | string => {
9
- const { relativeHour = 0, relativeSeconds = 0, timeZone, format } = params
10
-
11
- const now = new Date()
12
- let currentDate: Date
13
-
14
- if (timeZone) {
15
- const options: Intl.DateTimeFormatOptions = { timeZone }
16
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
17
- currentDate = new Date(currentDateISOString)
18
- } else {
19
- currentDate = now
20
- }
21
-
22
- const startOfHour = new Date(
23
- currentDate.getFullYear(),
24
- currentDate.getMonth(),
25
- currentDate.getDate(),
26
- currentDate.getHours(),
27
- 0,
28
- 0,
29
- 0
30
- )
31
- const targetTime = startOfHour.getTime() + relativeHour * 60 * 60 * 1000 + relativeSeconds * 1000
32
-
33
- if (format === 'date') {
34
- return new Date(targetTime)
35
- } else if (format === 'timestamp') {
36
- return targetTime
37
- } else if (format) {
38
- const formatter = new Intl.DateTimeFormat(undefined, format)
39
- return formatter.format(new Date(targetTime))
40
- } else {
41
- return new Date(targetTime)
42
- }
43
- }
@@ -1 +0,0 @@
1
- export * from './registry'
@@ -1,43 +0,0 @@
1
- export type RelativeMinuteTimeParams = {
2
- timeZone?: string
3
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
4
- relativeMinutes?: number
5
- relativeSeconds?: number
6
- }
7
-
8
- export const getRelativeMinuteTime = (params: RelativeMinuteTimeParams = {}): Date | number | string => {
9
- const { relativeMinutes = 0, relativeSeconds = 0, timeZone, format } = params
10
-
11
- const now = new Date()
12
- let currentDate: Date
13
-
14
- if (timeZone) {
15
- const options: Intl.DateTimeFormatOptions = { timeZone }
16
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
17
- currentDate = new Date(currentDateISOString)
18
- } else {
19
- currentDate = now
20
- }
21
-
22
- const startOfMinute = new Date(
23
- currentDate.getFullYear(),
24
- currentDate.getMonth(),
25
- currentDate.getDate(),
26
- currentDate.getHours(),
27
- currentDate.getMinutes(),
28
- 0,
29
- 0
30
- )
31
- const targetTime = startOfMinute.getTime() + relativeMinutes * 60 * 1000 + relativeSeconds * 1000
32
-
33
- if (format === 'date') {
34
- return new Date(targetTime)
35
- } else if (format === 'timestamp') {
36
- return targetTime
37
- } else if (format) {
38
- const formatter = new Intl.DateTimeFormat(undefined, format)
39
- return formatter.format(new Date(targetTime))
40
- } else {
41
- return new Date(targetTime)
42
- }
43
- }
@@ -1,38 +0,0 @@
1
- export type RelativeMonthDateParams = {
2
- timeZone?: string
3
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
4
- relativeMonths?: number
5
- relativeDates?: number
6
- }
7
-
8
- export const getRelativeMonthDate = (params: RelativeMonthDateParams = {}): Date | number | string => {
9
- const { relativeMonths = 0, relativeDates = 0, timeZone, format } = params
10
-
11
- const now = new Date()
12
- let currentDate: Date
13
-
14
- if (timeZone) {
15
- const options: Intl.DateTimeFormatOptions = { timeZone }
16
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
17
- currentDate = new Date(currentDateISOString)
18
- } else {
19
- currentDate = now
20
- }
21
-
22
- const targetMonth = currentDate.getMonth() + relativeMonths
23
- const targetYear = currentDate.getFullYear() + Math.floor(targetMonth / 12)
24
- const targetMonthRemainder = targetMonth % 12
25
-
26
- const targetDate = new Date(targetYear, targetMonthRemainder, currentDate.getDate() + relativeDates)
27
-
28
- if (format === 'date') {
29
- return targetDate
30
- } else if (format === 'timestamp') {
31
- return targetDate.getTime()
32
- } else if (format) {
33
- const formatter = new Intl.DateTimeFormat(undefined, format)
34
- return formatter.format(targetDate)
35
- } else {
36
- return targetDate
37
- }
38
- }
@@ -1,10 +0,0 @@
1
- import { getRelativeTime } from './time-generator'
2
-
3
- export const getCurrentTime = (
4
- params: { timeZone?: string; format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions } = {}
5
- ): Date | number | string => {
6
- return getRelativeTime({
7
- ...params,
8
- relativeSeconds: 0
9
- })
10
- }
@@ -1,58 +0,0 @@
1
- import { NOOP } from '../const'
2
- import { ValueGeneratorFn } from '../types'
3
-
4
- import { getCurrentTime } from './now-generator'
5
- import { getToday } from './today-generator'
6
- import { getRelativeDate } from './date-generator'
7
- import { getRelativeWeekDate } from './week-date-generator'
8
- import { getRelativeMonthDate } from './month-date-generator'
9
- import { getRelativeYearDate } from './year-date-generator'
10
- import { getRelativeTime } from './time-generator'
11
- import { getRelativeMinuteTime } from './minute-time-generator'
12
- import { getRelativeHourTime } from './hour-time-generator'
13
-
14
- var VALUE_GENERATORS: { [name: string]: ValueGeneratorFn } = {
15
- now: getCurrentTime,
16
- today: getToday,
17
- date: getRelativeDate,
18
- time: getRelativeTime,
19
- getCurrentTime,
20
- getToday,
21
- getRelativeDate,
22
- getRelativeWeekDate,
23
- getRelativeMonthDate,
24
- getRelativeYearDate,
25
- getRelativeMinuteTime,
26
- getRelativeHourTime
27
- }
28
-
29
- export function registerValueGenerator(name: string, generator: ValueGeneratorFn) {
30
- VALUE_GENERATORS[name] = generator
31
- }
32
-
33
- export function unregisterValueGenerator(name: string) {
34
- delete VALUE_GENERATORS[name]
35
- }
36
-
37
- export function getValueGenerators() {
38
- return { ...VALUE_GENERATORS }
39
- }
40
-
41
- export function getValueGenerator(name: string) {
42
- return VALUE_GENERATORS[name] || NOOP
43
- }
44
-
45
- export function getDefaultValue(parameter: { name: string; params?: any[] } | Function | any, binder?: any) {
46
- if (typeof parameter == 'function') {
47
- return parameter.call(binder || null)
48
- } else if (typeof parameter == 'object') {
49
- const { name, params } = parameter
50
- const generator = getValueGenerator(name)
51
-
52
- if (generator !== NOOP) {
53
- return generator.call(binder || null, params)
54
- }
55
- }
56
-
57
- return parameter
58
- }
@@ -1,33 +0,0 @@
1
- export type RelativeTimeParams = {
2
- relativeSeconds?: number
3
- timeZone?: string
4
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
5
- }
6
-
7
- export const getRelativeTime = (params: RelativeTimeParams = {}): string | number | Date => {
8
- const { relativeSeconds = 0, timeZone, format } = params
9
-
10
- const now = new Date()
11
-
12
- let currentDate: Date
13
- if (timeZone) {
14
- const options = { timeZone }
15
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
16
- currentDate = new Date(currentDateISOString)
17
- } else {
18
- currentDate = now
19
- }
20
-
21
- const targetTime = currentDate.getTime() + relativeSeconds * 1000
22
-
23
- if (format === 'date') {
24
- return new Date(targetTime)
25
- } else if (format === 'timestamp') {
26
- return targetTime
27
- } else if (format) {
28
- const formatter = new Intl.DateTimeFormat(undefined, format)
29
- return formatter.format(new Date(targetTime))
30
- } else {
31
- return targetTime
32
- }
33
- }
@@ -1,10 +0,0 @@
1
- import { getRelativeDate } from './date-generator'
2
-
3
- export const getToday = (
4
- params: { timeZone?: string; format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions } = {}
5
- ): Date | number | string => {
6
- return getRelativeDate({
7
- ...params,
8
- relativeDate: 0
9
- })
10
- }
@@ -1,40 +0,0 @@
1
- export type RelativeWeekDateParams = {
2
- timeZone?: string
3
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
4
- relativeWeeks?: number
5
- relativeDates?: number
6
- }
7
-
8
- export const getRelativeWeekDate = (params: RelativeWeekDateParams = {}): Date | number | string => {
9
- const { relativeWeeks = 0, relativeDates = 0, timeZone, format } = params
10
-
11
- const now = new Date()
12
- let currentDate: Date
13
-
14
- if (timeZone) {
15
- const options: Intl.DateTimeFormatOptions = { timeZone }
16
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
17
- currentDate = new Date(currentDateISOString)
18
- } else {
19
- currentDate = now
20
- }
21
-
22
- const startOfWeek = new Date(
23
- currentDate.getFullYear(),
24
- currentDate.getMonth(),
25
- currentDate.getDate() - currentDate.getDay() + 1
26
- )
27
- const targetDate =
28
- startOfWeek.getTime() + relativeWeeks * 7 * 24 * 60 * 60 * 1000 + relativeDates * 24 * 60 * 60 * 1000
29
-
30
- if (format === 'date') {
31
- return new Date(targetDate)
32
- } else if (format === 'timestamp') {
33
- return targetDate
34
- } else if (format) {
35
- const formatter = new Intl.DateTimeFormat(undefined, format)
36
- return formatter.format(new Date(targetDate))
37
- } else {
38
- return targetDate
39
- }
40
- }
@@ -1,36 +0,0 @@
1
- export type RelativeYearDateParams = {
2
- timeZone?: string
3
- format?: 'timestamp' | 'date' | Intl.DateTimeFormatOptions
4
- relativeYears?: number
5
- relativeDates?: number
6
- }
7
-
8
- export const getRelativeYearDate = (params: RelativeYearDateParams = {}): Date | number | string => {
9
- const { relativeYears = 0, relativeDates = 0, timeZone, format } = params
10
-
11
- const now = new Date()
12
- let currentDate: Date
13
-
14
- if (timeZone) {
15
- const options: Intl.DateTimeFormatOptions = { timeZone }
16
- const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0]
17
- currentDate = new Date(currentDateISOString)
18
- } else {
19
- currentDate = now
20
- }
21
-
22
- const targetYear = currentDate.getFullYear() + relativeYears
23
-
24
- const targetDate = new Date(targetYear, currentDate.getMonth(), currentDate.getDate() + relativeDates)
25
-
26
- if (format === 'date') {
27
- return targetDate
28
- } else if (format === 'timestamp') {
29
- return targetDate.getTime()
30
- } else if (format) {
31
- const formatter = new Intl.DateTimeFormat(undefined, format)
32
- return formatter.format(targetDate)
33
- } else {
34
- return targetDate
35
- }
36
- }