@movvjs/svelte-schedule-view 0.3.0 → 0.4.1-beta-1

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 (52) hide show
  1. package/.svelte-kit/__package__/i18n/locales/en.json +7 -0
  2. package/.svelte-kit/__package__/i18n/locales/ko.json +7 -0
  3. package/.svelte-kit/__package__/i18n/locales/vi.json +7 -0
  4. package/.svelte-kit/__package__/i18n/locales/zh-cn.json +7 -0
  5. package/.svelte-kit/__package__/i18n/locales/zh-tw.json +7 -0
  6. package/.svelte-kit/__package__/schedule-view/BookingInfo.svelte +21 -2
  7. package/.svelte-kit/__package__/schedule-view/Calender.svelte +246 -0
  8. package/.svelte-kit/__package__/schedule-view/Calender.svelte.d.ts +22 -0
  9. package/.svelte-kit/__package__/schedule-view/Layout.svelte +7 -4
  10. package/.svelte-kit/__package__/schedule-view/Layout.svelte.d.ts +3 -1
  11. package/.svelte-kit/__package__/schedule-view/Schedule.svelte +2 -1
  12. package/.svelte-kit/__package__/schedule-view/Schedule.svelte.d.ts +1 -0
  13. package/.svelte-kit/__package__/schedule-view/actions/clickOutside.d.ts +3 -0
  14. package/.svelte-kit/__package__/schedule-view/actions/clickOutside.js +15 -0
  15. package/.svelte-kit/__package__/schedule-view/assets/scss/indie_booking.scss +411 -0
  16. package/.svelte-kit/__package__/schedule-view/stores/booking.d.ts +8 -0
  17. package/.svelte-kit/__package__/schedule-view/stores/booking.js +16 -1
  18. package/.svelte-kit/ambient.d.ts +0 -4
  19. package/.svelte-kit/generated/server/internal.js +1 -1
  20. package/dist/i18n/locales/en.json +7 -0
  21. package/dist/i18n/locales/ko.json +7 -0
  22. package/dist/i18n/locales/vi.json +7 -0
  23. package/dist/i18n/locales/zh-cn.json +7 -0
  24. package/dist/i18n/locales/zh-tw.json +7 -0
  25. package/dist/schedule-view/BookingInfo.svelte +21 -2
  26. package/dist/schedule-view/Calender.svelte +246 -0
  27. package/dist/schedule-view/Calender.svelte.d.ts +22 -0
  28. package/dist/schedule-view/Layout.svelte +7 -4
  29. package/dist/schedule-view/Layout.svelte.d.ts +3 -1
  30. package/dist/schedule-view/Schedule.svelte +2 -1
  31. package/dist/schedule-view/Schedule.svelte.d.ts +1 -0
  32. package/dist/schedule-view/actions/clickOutside.d.ts +3 -0
  33. package/dist/schedule-view/actions/clickOutside.js +15 -0
  34. package/dist/schedule-view/assets/scss/indie_booking.scss +411 -0
  35. package/dist/schedule-view/stores/booking.d.ts +8 -0
  36. package/dist/schedule-view/stores/booking.js +16 -1
  37. package/package.json +1 -1
  38. package/src/additional-svelte-typing.d.ts +10 -0
  39. package/src/lib/i18n/locales/en.json +7 -0
  40. package/src/lib/i18n/locales/ko.json +7 -0
  41. package/src/lib/i18n/locales/vi.json +7 -0
  42. package/src/lib/i18n/locales/zh-cn.json +7 -0
  43. package/src/lib/i18n/locales/zh-tw.json +7 -0
  44. package/src/lib/schedule-view/BookingInfo.svelte +24 -2
  45. package/src/lib/schedule-view/Calender.svelte +283 -0
  46. package/src/lib/schedule-view/Layout.svelte +8 -4
  47. package/src/lib/schedule-view/Schedule.svelte +2 -2
  48. package/src/lib/schedule-view/actions/clickOutside.ts +17 -0
  49. package/src/lib/schedule-view/assets/scss/indie_booking.scss +411 -0
  50. package/src/lib/schedule-view/stores/booking.ts +17 -1
  51. package/src/routes/development/+page.svelte +2 -2
  52. package/sync-assets.sh +1 -1
@@ -0,0 +1,283 @@
1
+ <script lang="ts">
2
+ import { dayjs } from '$lib/dayjs'
3
+ import { t } from '$lib/i18n'
4
+ import type { Dayjs } from 'dayjs'
5
+ import { range } from 'lodash-es'
6
+ import { clickOutside } from './actions/clickOutside'
7
+
8
+ export let format: string = 'YYYY-MM-DD HH:mm:ss' // 날짜 포맷
9
+ export let maxYear = dayjs().year() // 년도 선택 최대값. 기본값은 현재 년도
10
+ export let minYear = 1980
11
+ export let disabledDate: (date: Dayjs) => boolean = date => false
12
+
13
+ let on = false // 캘린더 on / off
14
+ let target = dayjs().locale('en') // 달력의 타겟.
15
+ let resolveFn: (value: string) => void
16
+ let rejectFn: (reason?: any) => void
17
+ // 시간 선택 변수들
18
+ let time = 'am'
19
+ let hour = 0
20
+ let minute = 0
21
+
22
+ // 선택된 시간
23
+ let stdt: Dayjs = null
24
+
25
+ let selectedYear: number
26
+ let selectedMonth: number
27
+
28
+ // 캘린더
29
+ $: calendar = (function () {
30
+ {
31
+ const cal: Dayjs[][] = []
32
+
33
+ const startWeek = target.startOf('month').week() //49
34
+ let endWeek = target.endOf('month').week()
35
+ let done = false
36
+ if (endWeek === 1) {
37
+ let start = target.startOf('month')
38
+ let weekIndex = -1
39
+ while (!done) {
40
+ start = start.add(1, 'week').startOf('week') // 주의 시작일로 비교
41
+ weekIndex++
42
+ done = target.month() !== start.month()
43
+ }
44
+ endWeek = startWeek + weekIndex
45
+ }
46
+
47
+ for (let week = startWeek; week <= endWeek; week++) {
48
+ const days = Array(7)
49
+ .fill(0)
50
+ .map((n, i) => {
51
+ let day = target
52
+ .week(week)
53
+ .startOf('week')
54
+ .clone()
55
+ .add(n + i, 'day')
56
+ return day
57
+ })
58
+ cal.push(days)
59
+ }
60
+
61
+ return cal
62
+ }
63
+ })()
64
+
65
+ // 시간 범위
66
+ // $: hourRange = (function () {
67
+ // if (time === 'am') return range(0, 12, 1)
68
+ // else return range(12, 24, 1)
69
+ // })()
70
+
71
+ // 분 범위
72
+ // $: minuteRange = range(0, 60, 1)
73
+
74
+ // am / pm 따라 시간 변경 로직
75
+ $: hour = (function (): number {
76
+ if (time === 'am') {
77
+ if (hour < 12) return hour
78
+ else return hour === 12 ? 0 : hour - 12
79
+ } else {
80
+ if (hour >= 12) return hour
81
+ else return hour === 0 ? 12 : hour + 12
82
+ }
83
+ })()
84
+
85
+ export function open(startDate: string) {
86
+ return new Promise<string>((resolve, reject) => {
87
+ resolveFn = resolve
88
+ rejectFn = reject
89
+
90
+ stdt = null
91
+ // 날짜가 있는 경우 현재 날짜로 변경
92
+ let start = startDate
93
+
94
+ // 시작일 기준으로 설정
95
+ if (start) {
96
+ target = dayjs(start).locale('en').startOf('month') // ! 타겟은 항상 월의 시작으로 잡아야 week 관련 버그 없음
97
+ stdt = dayjs(start)
98
+ time = dayjs(start).hour() < 12 ? 'am' : 'pm'
99
+ hour = dayjs(start).hour()
100
+ minute = dayjs(start).minute()
101
+ }
102
+
103
+ on = true
104
+ })
105
+ }
106
+
107
+ function cancel() {
108
+ close()
109
+ rejectFn()
110
+ }
111
+
112
+ function close() {
113
+ on = false
114
+ }
115
+
116
+ function prev() {
117
+ target = target.subtract(1, 'month').startOf('month')
118
+ }
119
+
120
+ function next() {
121
+ target = target.add(1, 'month').startOf('month')
122
+ }
123
+
124
+ function select(date: Dayjs) {
125
+ if (disabledDate(date)) return
126
+
127
+ stdt = date
128
+ }
129
+
130
+ // 포맷팅된 데이터 전달
131
+ function complete() {
132
+ if (!stdt) return
133
+
134
+ resolveFn(stdt.hour(hour).minute(minute).second(0).format(format))
135
+ close()
136
+ }
137
+ </script>
138
+
139
+ <article class="indie_calendar-comp-box" class:on use:clickOutside on:outclick={() => on && cancel()}>
140
+ {#if on}
141
+ <div class="title">
142
+ <p class="days">{target.format('YYYY.MM')}</p>
143
+
144
+ <div class="btns">
145
+ <button type="button" class="btn_cal prev" on:click={() => prev()}>이전 달력</button>
146
+ <!-- 클릭 시 scroll-select-box에 클래스 on 추가 -->
147
+ <button type="button" class="btn_calendar" on:click={() => (selectedYear = target.year())}>년도 선택</button>
148
+ <button type="button" class="btn_cal next" on:click={() => next()}>다음 달력</button>
149
+ </div>
150
+ </div>
151
+
152
+ <div class="calender_box">
153
+ <table class="indie_tbl_in_calendar">
154
+ <thead>
155
+ <tr>
156
+ <th>{dayjs().isoWeekday(7).format('ddd')}</th>
157
+ <th>{dayjs().isoWeekday(1).format('ddd')}</th>
158
+ <th>{dayjs().isoWeekday(2).format('ddd')}</th>
159
+ <th>{dayjs().isoWeekday(3).format('ddd')}</th>
160
+ <th>{dayjs().isoWeekday(4).format('ddd')}</th>
161
+ <th>{dayjs().isoWeekday(5).format('ddd')}</th>
162
+ <th>{dayjs().isoWeekday(6).format('ddd')}</th>
163
+ </tr>
164
+ </thead>
165
+ <tbody>
166
+ {#each calendar as week}
167
+ <tr>
168
+ {#each week as day}
169
+ <td
170
+ class:past={day.isBefore(target, 'month') || day.isAfter(target, 'month') || disabledDate(day)}
171
+ class:today={day.isSame(dayjs(), 'day')}
172
+ class:select={stdt && day.isSame(stdt, 'day')}>
173
+ <a href={null} on:click={() => select(day)}>{day.format('D')}</a>
174
+ </td>
175
+ {/each}
176
+ </tr>
177
+ <!-- content here -->
178
+ {/each}
179
+ </tbody>
180
+ </table>
181
+ </div>
182
+
183
+ <!-- 최종 완료 -->
184
+ <!-- disabled 추가 시 회색으로 변경 -->
185
+ <button type="button" class="indie_btn_nor blue lg btn_sec" disabled={!stdt} on:click|stopPropagation={complete}>
186
+ {$t('calender.selection-completed')}
187
+ </button>
188
+
189
+ <!-- <div class="time_box">
190
+ <p class="sbj">
191
+ The start time of the vehicle <br />
192
+ Please choose.
193
+ </p>
194
+ <p class="indie_select_line_form black">
195
+ <span>
196
+ <select>
197
+ <option>AM</option>
198
+ <option>PM</option>
199
+ </select>
200
+ </span>
201
+ <span>
202
+ <select>
203
+ <option>09</option>
204
+ <option>08</option>
205
+ <option>07</option>
206
+ </select>
207
+ </span>
208
+ <span>
209
+ <select>
210
+ <option>00</option>
211
+ <option>01</option>
212
+ <option>02</option>
213
+ </select>
214
+ </span>
215
+ </p>
216
+ </div> -->
217
+
218
+ <!-- 년도 선택 팝업 - 클래스 on 추가 시 표시 -->
219
+ <div class="scroll-select-box" class:on={!!selectedYear}>
220
+ <div class="title">
221
+ <p>{$t('calender.please-select-year')}</p>
222
+ <button type="button" class="btn_close" on:click={() => (selectedYear = null)}>Close</button>
223
+ </div>
224
+ <div class="select_b">
225
+ <ul class="list">
226
+ <!-- 클릭 시 li에 - 클래스 on 추가 -->
227
+ {#each range(maxYear, minYear - 1, -1) as year}
228
+ <li class:on={selectedYear === year}><a href={null} on:click={() => (selectedYear = year)}>{year}</a></li>
229
+ {/each}
230
+ </ul>
231
+ </div>
232
+ <div class="btns">
233
+ <!--
234
+ 년도 클릭 전 disabled 추가 후 - Close로 변경
235
+ 년도 클릭 시 disabled 제거 후 - Next로 변경
236
+ -->
237
+ <button
238
+ type="button"
239
+ class="indie_btn_nor blue lg btn_sec"
240
+ on:click={() => {
241
+ target = target.set('year', selectedYear)
242
+ selectedYear = null
243
+ selectedMonth = target.month()
244
+ }}>{$t('calender.next')}</button>
245
+ </div>
246
+ </div>
247
+
248
+ <!-- 달 선택 팝업 (위에 년도 선택 후) - 클래스 on 추가 시 표시 -->
249
+ <div class="scroll-select-box" class:on={!!selectedMonth}>
250
+ <div class="title">
251
+ <p>{$t('calender.please-select-month')}</p>
252
+ <button type="button" class="btn_close" on:click={() => (selectedMonth = null)}>Close</button>
253
+ </div>
254
+ <div class="select_b">
255
+ <ul class="list">
256
+ <!-- 클릭 시 li에 - 클래스 on 추가 -->
257
+ {#each range(1, 13, 1) as month}
258
+ <li class:on={selectedMonth === month}>
259
+ <a
260
+ href={null}
261
+ on:click={() => {
262
+ selectedMonth = month
263
+ }}>{month}</a>
264
+ </li>
265
+ {/each}
266
+ </ul>
267
+ </div>
268
+ <div class="btns">
269
+ <!--
270
+ 달 클릭 전 disabled 추가 후 - Select a year로 변경
271
+ 달 클릭 시 disabled 제거 후 - Complete로 변경
272
+ -->
273
+ <button
274
+ type="button"
275
+ class="indie_btn_nor blue lg btn_sec"
276
+ on:click={() => {
277
+ target = target.set('month', selectedMonth - 1) // ex) 3 = 4월
278
+ selectedMonth = null
279
+ }}>{$t('calender.complete')}</button>
280
+ </div>
281
+ </div>
282
+ {/if}
283
+ </article>
@@ -12,10 +12,14 @@
12
12
  import Loader from './components/loader/Loader.svelte'
13
13
  import { onMount } from 'svelte'
14
14
 
15
- init({
16
- fallbackLocale: 'en',
17
- initialLocale: 'en'
18
- })
15
+ export let initI18n: boolean
16
+
17
+ if (initI18n) {
18
+ init({
19
+ fallbackLocale: 'en',
20
+ initialLocale: 'en'
21
+ })
22
+ }
19
23
 
20
24
  env.subscribe($env => {
21
25
  locale.set($env.locale)
@@ -48,7 +48,7 @@
48
48
  fullName,
49
49
  selectedPrice
50
50
  } = copiedBooking
51
-
51
+ export let initI18n = true
52
52
  let on = false
53
53
  let resolver: (value: Awaited<ReturnType<typeof open>>) => void
54
54
 
@@ -214,7 +214,7 @@
214
214
  </script>
215
215
 
216
216
  <Toaster />
217
- <Layout>
217
+ <Layout {initI18n}>
218
218
  <section class="indie_pop_wrap scroll" class:on>
219
219
  {#if on}
220
220
  <div class="pop_base full_2 indie_passengers_info_pop">
@@ -0,0 +1,17 @@
1
+ // 바깥 영역 클릭시 이벤트
2
+ // TODO: 다국어 두개 이상일 때 문제 발생하는 부분 있음. 수정 필요
3
+ export function clickOutside(node: Node) {
4
+ const handleClick = event => {
5
+ if (!node.contains(event.target)) {
6
+ node.dispatchEvent(new CustomEvent('outclick'))
7
+ }
8
+ }
9
+
10
+ document.addEventListener('click', handleClick, true)
11
+
12
+ return {
13
+ destroy() {
14
+ document.removeEventListener('click', handleClick, true)
15
+ }
16
+ }
17
+ }