@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.
- package/.svelte-kit/__package__/i18n/locales/en.json +7 -0
- package/.svelte-kit/__package__/i18n/locales/ko.json +7 -0
- package/.svelte-kit/__package__/i18n/locales/vi.json +7 -0
- package/.svelte-kit/__package__/i18n/locales/zh-cn.json +7 -0
- package/.svelte-kit/__package__/i18n/locales/zh-tw.json +7 -0
- package/.svelte-kit/__package__/schedule-view/BookingInfo.svelte +21 -2
- package/.svelte-kit/__package__/schedule-view/Calender.svelte +246 -0
- package/.svelte-kit/__package__/schedule-view/Calender.svelte.d.ts +22 -0
- package/.svelte-kit/__package__/schedule-view/Layout.svelte +7 -4
- package/.svelte-kit/__package__/schedule-view/Layout.svelte.d.ts +3 -1
- package/.svelte-kit/__package__/schedule-view/Schedule.svelte +2 -1
- package/.svelte-kit/__package__/schedule-view/Schedule.svelte.d.ts +1 -0
- package/.svelte-kit/__package__/schedule-view/actions/clickOutside.d.ts +3 -0
- package/.svelte-kit/__package__/schedule-view/actions/clickOutside.js +15 -0
- package/.svelte-kit/__package__/schedule-view/assets/scss/indie_booking.scss +411 -0
- package/.svelte-kit/__package__/schedule-view/stores/booking.d.ts +8 -0
- package/.svelte-kit/__package__/schedule-view/stores/booking.js +16 -1
- package/.svelte-kit/ambient.d.ts +0 -4
- package/.svelte-kit/generated/server/internal.js +1 -1
- package/dist/i18n/locales/en.json +7 -0
- package/dist/i18n/locales/ko.json +7 -0
- package/dist/i18n/locales/vi.json +7 -0
- package/dist/i18n/locales/zh-cn.json +7 -0
- package/dist/i18n/locales/zh-tw.json +7 -0
- package/dist/schedule-view/BookingInfo.svelte +21 -2
- package/dist/schedule-view/Calender.svelte +246 -0
- package/dist/schedule-view/Calender.svelte.d.ts +22 -0
- package/dist/schedule-view/Layout.svelte +7 -4
- package/dist/schedule-view/Layout.svelte.d.ts +3 -1
- package/dist/schedule-view/Schedule.svelte +2 -1
- package/dist/schedule-view/Schedule.svelte.d.ts +1 -0
- package/dist/schedule-view/actions/clickOutside.d.ts +3 -0
- package/dist/schedule-view/actions/clickOutside.js +15 -0
- package/dist/schedule-view/assets/scss/indie_booking.scss +411 -0
- package/dist/schedule-view/stores/booking.d.ts +8 -0
- package/dist/schedule-view/stores/booking.js +16 -1
- package/package.json +1 -1
- package/src/additional-svelte-typing.d.ts +10 -0
- package/src/lib/i18n/locales/en.json +7 -0
- package/src/lib/i18n/locales/ko.json +7 -0
- package/src/lib/i18n/locales/vi.json +7 -0
- package/src/lib/i18n/locales/zh-cn.json +7 -0
- package/src/lib/i18n/locales/zh-tw.json +7 -0
- package/src/lib/schedule-view/BookingInfo.svelte +24 -2
- package/src/lib/schedule-view/Calender.svelte +283 -0
- package/src/lib/schedule-view/Layout.svelte +8 -4
- package/src/lib/schedule-view/Schedule.svelte +2 -2
- package/src/lib/schedule-view/actions/clickOutside.ts +17 -0
- package/src/lib/schedule-view/assets/scss/indie_booking.scss +411 -0
- package/src/lib/schedule-view/stores/booking.ts +17 -1
- package/src/routes/development/+page.svelte +2 -2
- 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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
+
}
|