ch3chi-commons-vue 1.2.0 → 1.8.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.
Files changed (52) hide show
  1. package/package.json +1 -1
  2. package/dist/api/ApiService.d.ts +0 -233
  3. package/dist/auth/AuthorizationService.d.ts +0 -56
  4. package/dist/auth/PermissionDescriptor.d.ts +0 -37
  5. package/dist/components/CAlert.vue.d.ts +0 -17
  6. package/dist/components/CAlertDefine.d.ts +0 -14
  7. package/dist/components/CBSToast.vue.d.ts +0 -6
  8. package/dist/components/CGlobalSpinner.vue.d.ts +0 -13
  9. package/dist/components/CRowCheckBox.vue.d.ts +0 -14
  10. package/dist/components/CRowTextInput.vue.d.ts +0 -10
  11. package/dist/components/CTable.vue.d.ts +0 -24
  12. package/dist/components/CTableDefine.d.ts +0 -201
  13. package/dist/components/CTableTD.vue.d.ts +0 -7
  14. package/dist/components/form/CChangePasswordFormField.vue.d.ts +0 -14
  15. package/dist/components/form/CCheckBoxFormField.vue.d.ts +0 -30
  16. package/dist/components/form/CDateFormField.vue.d.ts +0 -17
  17. package/dist/components/form/CDateQueryField.vue.d.ts +0 -16
  18. package/dist/components/form/CDateRangeFormField.vue.d.ts +0 -17
  19. package/dist/components/form/CFilePickerFormField.vue.d.ts +0 -28
  20. package/dist/components/form/CRadioFormField.vue.d.ts +0 -30
  21. package/dist/components/form/CSelectFormField.vue.d.ts +0 -18
  22. package/dist/components/form/CTextAreaFormField.vue.d.ts +0 -16
  23. package/dist/components/form/CTextInputFormField.vue.d.ts +0 -22
  24. package/dist/directive/CBootstrapDirective.d.ts +0 -17
  25. package/dist/directive/CDateFormatterDirective.d.ts +0 -10
  26. package/dist/directive/CFTurnstileDirective.d.ts +0 -15
  27. package/dist/directive/CFormDirective.d.ts +0 -9
  28. package/dist/directive/PermissionDirective.d.ts +0 -15
  29. package/dist/index.cjs.js +0 -19103
  30. package/dist/index.d.ts +0 -45
  31. package/dist/index.es.js +0 -19086
  32. package/dist/model/BSFieldStyleConfig.d.ts +0 -121
  33. package/dist/model/BaseDictionary.d.ts +0 -34
  34. package/dist/model/BaseFormDataModel.d.ts +0 -199
  35. package/dist/model/BaseListViewModel.d.ts +0 -165
  36. package/dist/model/CBSModalViewModel.d.ts +0 -44
  37. package/dist/model/CFileDataModel.d.ts +0 -74
  38. package/dist/model/CImageViewModel.d.ts +0 -8
  39. package/dist/model/CMenuItem.d.ts +0 -86
  40. package/dist/model/EmailReceiverDataModel.d.ts +0 -57
  41. package/dist/model/EmptyDataModel.d.ts +0 -7
  42. package/dist/model/FormOptions.d.ts +0 -60
  43. package/dist/model/LoginDataModel.d.ts +0 -12
  44. package/dist/model/PasswordDataModel.d.ts +0 -15
  45. package/dist/model/QueryParameter.d.ts +0 -92
  46. package/dist/model/SessionUser.d.ts +0 -45
  47. package/dist/model/ShowMessageDataModel.d.ts +0 -44
  48. package/dist/model/TokenUser.d.ts +0 -50
  49. package/dist/stores/FormDataStore.d.ts +0 -31
  50. package/dist/stores/ViewStore.d.ts +0 -349
  51. package/dist/style.css +0 -223
  52. package/dist/utils/CToolUtils.d.ts +0 -53
@@ -1,349 +0,0 @@
1
- import { ComponentPublicInstance } from 'vue';
2
- import { DefineStoreOptions } from 'pinia';
3
- import { default as CAlert } from '../components/CAlert.vue';
4
- import { CAlertModalData } from '../components/CAlertDefine';
5
- import { default as CBSToast } from '../components/CBSToast.vue';
6
- import { default as CGlobalSpinner } from '../components/CGlobalSpinner.vue';
7
- import { SessionUser } from '../model/SessionUser';
8
- import { CMenuItem } from '../model/CMenuItem';
9
- import { ShowMessageType } from '../model/ShowMessageDataModel';
10
- import { AccessToken } from '../model/TokenUser';
11
- import { BaseDictionary, CBaseDictionary } from '../model/BaseDictionary';
12
- export type RouterNavigationType = 'push' | 'back' | 'forward' | 'unknown';
13
- /**
14
- * 全局視圖相關的狀態
15
- */
16
- export type GlobalViewState = {
17
- navigationType: RouterNavigationType;
18
- isSidebarOpen: boolean;
19
- mainBSModal: ComponentPublicInstance<typeof CAlert> | null;
20
- toastView: ComponentPublicInstance<typeof CBSToast> | null;
21
- globalSpinner: ComponentPublicInstance<typeof CGlobalSpinner> | null;
22
- version: string;
23
- };
24
- /**
25
- * 全局視圖相關的行為
26
- */
27
- export interface GlobalViewActions {
28
- routerNavigationType(type: RouterNavigationType): void;
29
- toggleSidebar(): void;
30
- showModal(data: CAlertModalData): void;
31
- showModalError(data: CAlertModalData): void;
32
- showModelAlert(data: CAlertModalData): void;
33
- showModalConfirm(data: CAlertModalData): void;
34
- hideModal(): void;
35
- addToast(data: CAlertModalData): void;
36
- showSpinner(): void;
37
- hideSpinner(): void;
38
- setVersion(version: string): void;
39
- }
40
- /**
41
- * 全局視圖相關的 getters
42
- */
43
- export interface GlobalViewGetters {
44
- }
45
- /**
46
- * 全局視圖 store 定義類型
47
- */
48
- export type GlobalViewStoreOptionDefine = Omit<DefineStoreOptions<'view', GlobalViewState, GlobalViewGetters, GlobalViewActions>, 'id'>;
49
- /**
50
- * 全局視圖 store 定義
51
- */
52
- export declare const globalViewStoreOptions: GlobalViewStoreOptionDefine;
53
- /**
54
- * 保存視圖相關的狀態,例如側邊欄開啟狀態、模態框、Toast、全局加載等
55
- */
56
- export declare const useViewStore: import('pinia').StoreDefinition<"view", GlobalViewState, GlobalViewGetters & ThisType<{
57
- navigationType: RouterNavigationType;
58
- isSidebarOpen: boolean;
59
- mainBSModal: ComponentPublicInstance<typeof CAlert> | null;
60
- toastView: ComponentPublicInstance<typeof CBSToast> | null;
61
- globalSpinner: ComponentPublicInstance<typeof CGlobalSpinner> | null;
62
- version: string;
63
- } & {} & {} & import('pinia').PiniaCustomProperties<string, import('pinia').StateTree, import('pinia')._GettersTree<import('pinia').StateTree>, import('pinia')._ActionsTree>> & import('pinia')._GettersTree<GlobalViewState>, GlobalViewActions & ThisType<GlobalViewActions & {
64
- navigationType: RouterNavigationType;
65
- isSidebarOpen: boolean;
66
- mainBSModal: ComponentPublicInstance<typeof CAlert> | null;
67
- toastView: ComponentPublicInstance<typeof CBSToast> | null;
68
- globalSpinner: ComponentPublicInstance<typeof CGlobalSpinner> | null;
69
- version: string;
70
- } & import('pinia')._StoreWithState<"view", GlobalViewState, GlobalViewGetters, GlobalViewActions> & {} & {} & import('pinia').PiniaCustomProperties<string, import('pinia').StateTree, import('pinia')._GettersTree<import('pinia').StateTree>, import('pinia')._ActionsTree>>>;
71
- export declare const __GlobalViewStoreDefine__: GlobalViewState & GlobalViewActions & GlobalViewGetters & GlobalViewStoreOptionDefine;
72
- /**
73
- * 使用者會話相關的狀態
74
- */
75
- export type UserSessionState<T extends SessionUser = SessionUser> = {
76
- user: T | null;
77
- token?: AccessToken | null;
78
- isAuth: boolean;
79
- sessionCheckTimer: number | null;
80
- shouldRedirectToLogin: boolean | null;
81
- shouldRedirectToMessage?: boolean;
82
- redirectMessageType?: ShowMessageType | null;
83
- };
84
- /**
85
- * 使用者會話相關的行為
86
- */
87
- export interface UserSessionActions<T extends SessionUser = SessionUser> {
88
- saveUser(user: T | null): void;
89
- saveToken(token: AccessToken | null): void;
90
- setAuthenticated(isAuth: boolean): void;
91
- checkSessionIsValid(): Promise<boolean>;
92
- validateSession(helper: () => Promise<T>): Promise<boolean>;
93
- refreshToken(helper: () => Promise<AccessToken>): Promise<boolean>;
94
- startSessionCheck(): void;
95
- stopSessionCheck(): void;
96
- hasPermission(needPermission: string | string[]): boolean;
97
- logout(): void;
98
- triggerManualLogout: () => void;
99
- resetShouldRedirectToLogin: () => void;
100
- triggerAuthFailedRedirect: () => void;
101
- resetAuthFailedRedirect: () => void;
102
- }
103
- /**
104
- * 使用者會話相關的 getters
105
- */
106
- export interface UserSessionGetters<T extends SessionUser = SessionUser> {
107
- currentUser(state: UserSessionState<T>): T | null;
108
- currentToken(state: UserSessionState<T>): AccessToken | null;
109
- isAuthenticated(state: UserSessionState<T>): boolean;
110
- userUid(state: UserSessionState<T>): string | undefined;
111
- account(state: UserSessionState<T>): string | undefined;
112
- userName(state: UserSessionState<T>): string | undefined;
113
- email(state: UserSessionState<T>): string | undefined;
114
- roleCode(state: UserSessionState<T>): string | undefined;
115
- permissions(state: UserSessionState<T>): string[] | undefined;
116
- menuItems(): CMenuItem[];
117
- }
118
- /**
119
- * 使用者會話 store 定義類型
120
- */
121
- export type UserSessionStoreOptionDefine<T extends SessionUser = SessionUser> = Omit<DefineStoreOptions<'session', UserSessionState<T>, UserSessionGetters<T>, UserSessionActions<T>>, 'id'>;
122
- /**
123
- * 使用者會話 store 定義
124
- * 此方式僅適用於 SessionUser 類型,只使用 session 當作帳號權限驗證
125
- */
126
- export declare const userSessionStoreOptions: UserSessionStoreOptionDefine<SessionUser>;
127
- /**
128
- * 持久化設定選項
129
- */
130
- export interface PersistOptions<T extends SessionUser = SessionUser> {
131
- enabled?: boolean;
132
- key?: string;
133
- storage?: Storage;
134
- paths?: string[];
135
- userConstructor?: new () => T;
136
- serializer?: {
137
- serialize: (state: any) => string;
138
- deserialize: (str: string) => any;
139
- };
140
- onLogout?: (user: T | null, token: AccessToken | null) => void;
141
- onLogin?: (user: T) => void;
142
- }
143
- /**
144
- * 創建使用者會話 store 選項的工廠函數,支援自訂的 SessionUser 類型
145
- * @param persistOptions
146
- */
147
- export declare function createUserSessionOptions<T extends SessionUser = SessionUser>(persistOptions?: PersistOptions<T>): UserSessionStoreOptionDefine<T>;
148
- /**
149
- * 創建使用者會話 store 的工廠函數,支援自訂的 SessionUser 類型
150
- */
151
- export declare function createUserSessionStore<T extends SessionUser = SessionUser>(storeId?: string, persistOptions?: PersistOptions<T>): import('pinia').StoreDefinition<string, UserSessionState<T>, UserSessionGetters<T> & ThisType<{
152
- user: import('vue').UnwrapRef<T> | null;
153
- token?: {
154
- tokenType?: string | undefined;
155
- accessToken?: string | undefined;
156
- accessTokenExpiresAt?: string | undefined;
157
- refreshToken?: string | undefined;
158
- refreshTokenExpiresAt?: string | undefined;
159
- sessionUid?: string | undefined;
160
- isExpired: () => boolean;
161
- isRefreshTokenExpired: () => boolean;
162
- loadToken: (data: Record<string, any>) => AccessToken;
163
- toJSON: () => Record<string, any>;
164
- loadJSON: (data: Record<string, any>) => AccessToken;
165
- readonly bearerToken: string;
166
- } | null | undefined;
167
- isAuth: boolean;
168
- sessionCheckTimer: number | null;
169
- shouldRedirectToLogin: boolean | null;
170
- shouldRedirectToMessage?: boolean | undefined;
171
- redirectMessageType?: (ShowMessageType | null) | undefined;
172
- } & {
173
- readonly currentUser: T | null;
174
- readonly currentToken: AccessToken | null;
175
- readonly isAuthenticated: boolean;
176
- readonly userUid: string | undefined;
177
- readonly account: string | undefined;
178
- readonly userName: string | undefined;
179
- readonly email: string | undefined;
180
- readonly roleCode: string | undefined;
181
- readonly permissions: string[] | undefined;
182
- readonly menuItems: CMenuItem[];
183
- } & {} & import('pinia').PiniaCustomProperties<string, import('pinia').StateTree, import('pinia')._GettersTree<import('pinia').StateTree>, import('pinia')._ActionsTree>> & import('pinia')._GettersTree<UserSessionState<T>>, UserSessionActions<T> & ThisType<UserSessionActions<T> & {
184
- user: import('vue').UnwrapRef<T> | null;
185
- token?: {
186
- tokenType?: string | undefined;
187
- accessToken?: string | undefined;
188
- accessTokenExpiresAt?: string | undefined;
189
- refreshToken?: string | undefined;
190
- refreshTokenExpiresAt?: string | undefined;
191
- sessionUid?: string | undefined;
192
- isExpired: () => boolean;
193
- isRefreshTokenExpired: () => boolean;
194
- loadToken: (data: Record<string, any>) => AccessToken;
195
- toJSON: () => Record<string, any>;
196
- loadJSON: (data: Record<string, any>) => AccessToken;
197
- readonly bearerToken: string;
198
- } | null | undefined;
199
- isAuth: boolean;
200
- sessionCheckTimer: number | null;
201
- shouldRedirectToLogin: boolean | null;
202
- shouldRedirectToMessage?: boolean | undefined;
203
- redirectMessageType?: (ShowMessageType | null) | undefined;
204
- } & import('pinia')._StoreWithState<"session", UserSessionState<T>, UserSessionGetters<T>, UserSessionActions<T>> & {
205
- readonly currentUser: T | null;
206
- readonly currentToken: AccessToken | null;
207
- readonly isAuthenticated: boolean;
208
- readonly userUid: string | undefined;
209
- readonly account: string | undefined;
210
- readonly userName: string | undefined;
211
- readonly email: string | undefined;
212
- readonly roleCode: string | undefined;
213
- readonly permissions: string[] | undefined;
214
- readonly menuItems: CMenuItem[];
215
- } & {} & import('pinia').PiniaCustomProperties<string, import('pinia').StateTree, import('pinia')._GettersTree<import('pinia').StateTree>, import('pinia')._ActionsTree>>>;
216
- /**
217
- * 預設的使用者會話 store(使用 SessionUser)
218
- */
219
- export declare const useUserSessionStore: import('pinia').StoreDefinition<string, UserSessionState<SessionUser>, UserSessionGetters<SessionUser> & ThisType<{
220
- user: {
221
- userUid?: string | undefined;
222
- iat?: number | undefined;
223
- account?: string | undefined;
224
- name?: string | undefined;
225
- email?: string | undefined;
226
- roleCode?: string | undefined;
227
- roleName?: string | undefined;
228
- permissions?: string[] | undefined;
229
- load: (data: Record<string, any>) => SessionUser;
230
- loadFromValidateSession: (data: any) => SessionUser;
231
- merge: (data: Partial<SessionUser>) => SessionUser;
232
- process: (data: Record<string, any>) => Record<string, any>;
233
- toJSON: () => Record<string, any>;
234
- loadJSON: (data: Record<string, any>) => SessionUser;
235
- } | null;
236
- token?: {
237
- tokenType?: string | undefined;
238
- accessToken?: string | undefined;
239
- accessTokenExpiresAt?: string | undefined;
240
- refreshToken?: string | undefined;
241
- refreshTokenExpiresAt?: string | undefined;
242
- sessionUid?: string | undefined;
243
- isExpired: () => boolean;
244
- isRefreshTokenExpired: () => boolean;
245
- loadToken: (data: Record<string, any>) => AccessToken;
246
- toJSON: () => Record<string, any>;
247
- loadJSON: (data: Record<string, any>) => AccessToken;
248
- readonly bearerToken: string;
249
- } | null | undefined;
250
- isAuth: boolean;
251
- sessionCheckTimer: number | null;
252
- shouldRedirectToLogin: boolean | null;
253
- shouldRedirectToMessage?: boolean | undefined;
254
- redirectMessageType?: (ShowMessageType | null) | undefined;
255
- } & {
256
- readonly currentUser: SessionUser | null;
257
- readonly currentToken: AccessToken | null;
258
- readonly isAuthenticated: boolean;
259
- readonly userUid: string | undefined;
260
- readonly account: string | undefined;
261
- readonly userName: string | undefined;
262
- readonly email: string | undefined;
263
- readonly roleCode: string | undefined;
264
- readonly permissions: string[] | undefined;
265
- readonly menuItems: CMenuItem[];
266
- } & {} & import('pinia').PiniaCustomProperties<string, import('pinia').StateTree, import('pinia')._GettersTree<import('pinia').StateTree>, import('pinia')._ActionsTree>> & import('pinia')._GettersTree<UserSessionState<SessionUser>>, UserSessionActions<SessionUser> & ThisType<UserSessionActions<SessionUser> & {
267
- user: {
268
- userUid?: string | undefined;
269
- iat?: number | undefined;
270
- account?: string | undefined;
271
- name?: string | undefined;
272
- email?: string | undefined;
273
- roleCode?: string | undefined;
274
- roleName?: string | undefined;
275
- permissions?: string[] | undefined;
276
- load: (data: Record<string, any>) => SessionUser;
277
- loadFromValidateSession: (data: any) => SessionUser;
278
- merge: (data: Partial<SessionUser>) => SessionUser;
279
- process: (data: Record<string, any>) => Record<string, any>;
280
- toJSON: () => Record<string, any>;
281
- loadJSON: (data: Record<string, any>) => SessionUser;
282
- } | null;
283
- token?: {
284
- tokenType?: string | undefined;
285
- accessToken?: string | undefined;
286
- accessTokenExpiresAt?: string | undefined;
287
- refreshToken?: string | undefined;
288
- refreshTokenExpiresAt?: string | undefined;
289
- sessionUid?: string | undefined;
290
- isExpired: () => boolean;
291
- isRefreshTokenExpired: () => boolean;
292
- loadToken: (data: Record<string, any>) => AccessToken;
293
- toJSON: () => Record<string, any>;
294
- loadJSON: (data: Record<string, any>) => AccessToken;
295
- readonly bearerToken: string;
296
- } | null | undefined;
297
- isAuth: boolean;
298
- sessionCheckTimer: number | null;
299
- shouldRedirectToLogin: boolean | null;
300
- shouldRedirectToMessage?: boolean | undefined;
301
- redirectMessageType?: (ShowMessageType | null) | undefined;
302
- } & import('pinia')._StoreWithState<"session", UserSessionState<SessionUser>, UserSessionGetters<SessionUser>, UserSessionActions<SessionUser>> & {
303
- readonly currentUser: SessionUser | null;
304
- readonly currentToken: AccessToken | null;
305
- readonly isAuthenticated: boolean;
306
- readonly userUid: string | undefined;
307
- readonly account: string | undefined;
308
- readonly userName: string | undefined;
309
- readonly email: string | undefined;
310
- readonly roleCode: string | undefined;
311
- readonly permissions: string[] | undefined;
312
- readonly menuItems: CMenuItem[];
313
- } & {} & import('pinia').PiniaCustomProperties<string, import('pinia').StateTree, import('pinia')._GettersTree<import('pinia').StateTree>, import('pinia')._ActionsTree>>>;
314
- export declare const __UserSessionTypes__: UserSessionState & UserSessionGetters & UserSessionActions & UserSessionStoreOptionDefine & PersistOptions;
315
- export interface DictionaryPersistOptions<T extends BaseDictionary = CBaseDictionary> {
316
- enabled?: boolean;
317
- key?: string;
318
- storage?: Storage;
319
- paths?: string[];
320
- dictConstructor?: new () => T;
321
- serializer?: {
322
- serialize: (state: any) => string;
323
- deserialize: (str: string) => any;
324
- };
325
- }
326
- export type DictionaryState<T extends BaseDictionary = CBaseDictionary> = {
327
- dictionary: T | null;
328
- };
329
- export interface DictionaryActions<T extends BaseDictionary = CBaseDictionary> {
330
- setDictionary(dict: T): void;
331
- loadAll(): void;
332
- loadDictionary(key: string): void;
333
- }
334
- export interface DictionaryGetters<T extends BaseDictionary = CBaseDictionary> {
335
- dict(): T | null;
336
- }
337
- /**
338
- * Dictionary store 定義類型
339
- */
340
- export type DictionaryStoreOptionDefine<T extends BaseDictionary = CBaseDictionary> = Omit<DefineStoreOptions<'dictionary', DictionaryState<T>, DictionaryGetters<T>, DictionaryActions<T>>, 'id'>;
341
- /**
342
- * 創建 Dictionary store 選項的工廠函數
343
- * @param dictConstructor
344
- */
345
- export declare function createDictionaryStoreOptions<T extends BaseDictionary = CBaseDictionary>(options: {
346
- dictionary?: T;
347
- persistOptions?: DictionaryPersistOptions<T>;
348
- }): DictionaryStoreOptionDefine<T>;
349
- export declare const __DictionaryStoreTypes__: DictionaryState & DictionaryActions & DictionaryGetters & DictionaryStoreOptionDefine;
package/dist/style.css DELETED
@@ -1,223 +0,0 @@
1
-
2
- .toast.c-toast-error[data-v-5a5057c1] {
3
- background-color: #ffffff;
4
- color: #212529;
5
- border-left: 4px solid #dc3545;
6
- }
7
- .toast.c-toast-error .toast-header[data-v-5a5057c1] {
8
- background-color: #f5c6cb;
9
- color: #721c24;
10
- border-bottom: 1px solid #f1aeb5;
11
- }
12
- .toast.c-toast-alert[data-v-5a5057c1] {
13
- background-color: #ffffff;
14
- color: #212529;
15
- border-left: 4px solid #fd7e14;
16
- }
17
- .toast.c-toast-alert .toast-header[data-v-5a5057c1] {
18
- background-color: #fde2d3;
19
- color: #8a4116;
20
- border-bottom: 1px solid #fde2d3;
21
- }
22
- .toast.c-toast-info[data-v-5a5057c1] {
23
- background-color: #ffffff;
24
- color: #212529;
25
- border-left: 4px solid #20c997;
26
- }
27
- .toast.c-toast-info .toast-header[data-v-5a5057c1] {
28
- background-color: #d4f4e6;
29
- color: #0f5132;
30
- border-bottom: 1px solid #d4f4e6;
31
- }
32
-
33
- /* 增加一些通用樣式改進 */
34
- .toast[data-v-5a5057c1] {
35
- box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
36
- border-radius: 0.375rem;
37
- }
38
- .toast-header[data-v-5a5057c1] {
39
- font-weight: 600;
40
- }
41
- .toast-body[data-v-5a5057c1] {
42
- padding: 0.75rem;
43
- background-color: #ffffff;
44
- color: #212529;
45
- }
46
-
47
- .c-global-overlay[data-v-819a33ab] {
48
- position: fixed;
49
- top: 0; left: 0; right: 0; bottom: 0;
50
- background: rgba(44, 44, 44, 0.5);
51
- z-index: 30000;
52
- display: flex;
53
- align-items: center;
54
- justify-content: center;
55
- }
56
- .c-global-spinner[data-v-819a33ab] {
57
- --spinner-color: var(--v42442b26);
58
- }
59
- .c-global-spinner .spinner-border[data-v-819a33ab] {
60
- width: 3rem;
61
- height: 3rem;
62
- color: var(--spinner-color, #E4B445);
63
- border-width: 0.4em;
64
- }
65
-
66
- .c-multiline-text[data-v-49ff4b16] {
67
- white-space: pre-wrap;
68
- word-break: break-word;
69
- }
70
- .flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
71
- /*rtl:begin:ignore*/left:0/*
72
- /*rtl:end:ignore*/}/*
73
- /*rtl:begin:ignore*/
74
- /*
75
- /*rtl:end:ignore*/
76
- .flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/*
77
- /*rtl:begin:ignore*/right:0/*
78
- /*rtl:end:ignore*/}/*
79
- /*rtl:begin:ignore*/
80
- /*
81
- /*rtl:end:ignore*/
82
- .flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}
83
- .c-single-file-box .c-multiple-file[data-v-b1ff243c]{
84
- display: none;
85
- }
86
- .c-multiple-file-box .c-single-file[data-v-b1ff243c] {
87
- display: none;
88
- }
89
- .c-file-upload-list .progress[data-v-b1ff243c] {
90
- height: 8px;
91
- }
92
- .c-file-download-link[data-v-b1ff243c]:is(a) {
93
- color: var(--bs-link-color);
94
- cursor: pointer;
95
- }
96
- .c-file-download-link[data-v-b1ff243c]:is(a):hover {
97
- color: var(--bs-link-hover-color);
98
- text-decoration: underline;
99
- }
100
-
101
-
102
- .c-textarea-readonly[data-v-cf428e50] {
103
- background-color: #e9ecef;
104
- opacity: 1;
105
- min-height: 90px;
106
- }
107
-
108
-
109
- /* 非 scoped 樣式:定義 CSS 變數 */
110
- .content-table {
111
- /* 定義 CSS 變數預設值 */
112
- --c-pagination-bg-color: #fff;
113
- --c-pagination-text-color: #2e2e2e;
114
- --c-pagination-border-color: #E4B445;
115
- --c-pagination-hover-bg-color: #E4B445;
116
- --c-pagination-hover-text-color: #fff;
117
- --c-pagination-hover-border-color: #d4a33c;
118
- --c-pagination-active-bg-color: #E4B445;
119
- --c-pagination-active-text-color: #fff;
120
- --c-pagination-active-border-color: #E4B445;
121
- --c-scrollbar-thumb-color: #E4B445;
122
- --c-scrollbar-track-color: #f1f1f1;
123
- --c-scrollbar-thumb-hover-color: #d4a33c;
124
- --c-scrollbar-height: 8px;
125
- }
126
- .content-table-body {
127
- /* 自訂 scrollbar 樣式 */
128
- scrollbar-width: thin; /* Firefox */
129
- scrollbar-color: var(--c-scrollbar-thumb-color) var(--c-scrollbar-track-color); /* Firefox: thumb 和 track 顏色 */
130
- }
131
-
132
- /* WebKit 瀏覽器 (Chrome, Safari, Edge) */
133
- .content-table-body::-webkit-scrollbar {
134
- height: var(--c-scrollbar-height); /* scrollbar 高度 */
135
- }
136
- .content-table-body::-webkit-scrollbar-track {
137
- background: var(--c-scrollbar-track-color); /* track 背景色 */
138
- border-radius: 4px;
139
- }
140
- .content-table-body::-webkit-scrollbar-thumb {
141
- background: var(--c-scrollbar-thumb-color); /* thumb 顏色 */
142
- border-radius: 4px;
143
- transition: background 0.3s;
144
- }
145
- .content-table-body::-webkit-scrollbar-thumb:hover {
146
- background: var(--c-scrollbar-thumb-hover-color); /* hover 時的顏色 */
147
- }
148
-
149
-
150
- .content-table[data-v-b60bf553] {
151
- display: flex;
152
- flex-direction: column;
153
- justify-content: center;
154
- align-items: center;
155
- }
156
- .content-table table[data-v-b60bf553] {
157
- table-layout: auto;
158
- }
159
- .content-table-body[data-v-b60bf553] {
160
- width: 100%;
161
- overflow-x: auto;
162
- }
163
- .content-table table th[data-v-b60bf553],
164
- .content-table table td[data-v-b60bf553] {
165
- width: auto;
166
- }
167
- .content-table table td[data-v-b60bf553] {
168
- vertical-align: middle;
169
- text-align: left;
170
- }
171
- .content-table-footer[data-v-b60bf553] {
172
- border-top: 1px solid #dee2e6;
173
- }
174
- .content-table .pagination .page-link[data-v-b60bf553] {
175
- min-width: 36px;
176
- text-align: center;
177
- display: inline-block;
178
- color: var(--c-pagination-text-color, #2e2e2e);
179
- background-color: var(--c-pagination-bg-color, #fff);
180
- border: 1px solid var(--c-pagination-border-color, #E4B445);
181
- margin: 0 2px;
182
- border-radius: 4px;
183
- transition: background-color .3s, color .3s;
184
- }
185
- .content-table .pagination .page-link[data-v-b60bf553]:hover,
186
- .content-table .pagination .page-link[data-v-b60bf553]:focus {
187
- background-color: var(--c-pagination-hover-bg-color, #E4B445);
188
- color: var(--c-pagination-hover-text-color, #fff);
189
- border-color: var(--c-pagination-hover-border-color, #d4a33c);
190
- }
191
- .content-table .pagination .active .page-link[data-v-b60bf553] {
192
- background-color: var(--c-pagination-active-bg-color, #E4B445);
193
- color: var(--c-pagination-active-text-color, #fff);
194
- border-color: var(--c-pagination-active-border-color, #E4B445);
195
- }
196
- .content-table .pagination .page-link.c-page-action[data-v-b60bf553] {
197
- padding-left: 0.2rem;
198
- padding-right: 0.2rem;
199
- }
200
- .dropdown-menu.c-page-menu[data-v-b60bf553] {
201
- min-width: 200px;
202
- }
203
- .c-sortable[data-v-b60bf553] {
204
- cursor: pointer;
205
- user-select: none;
206
- transition: background-color 0.2s;
207
- }
208
- .c-sortable[data-v-b60bf553]:hover {
209
- background-color: rgba(0, 123, 255, 0.1);
210
- }
211
- .c-sort-icon[data-v-b60bf553] {
212
- font-size: 16px;
213
- color: #6c757d;
214
- transition: color 0.2s;
215
- }
216
- .c-sortable:hover .c-sort-icon[data-v-b60bf553] {
217
- color: #007bff;
218
- }
219
- .c-sortable .c-arrow-up[data-v-b60bf553],
220
- .c-sortable .c-arrow-down[data-v-b60bf553] {
221
- color: #007bff;
222
- }
223
-
@@ -1,53 +0,0 @@
1
- import { default as _ } from 'lodash';
2
- import * as yup from "yup";
3
- /**
4
- * 空函式
5
- */
6
- export declare const voidFunction: () => void;
7
- /**
8
- * 延遲指定毫秒數
9
- * @param ms 毫秒數
10
- */
11
- export declare const delay: (ms: number) => Promise<unknown>;
12
- /**
13
- * 從 params 中挑選有值的屬性並指派到 payload 中
14
- * @param payload
15
- * @param params
16
- */
17
- export declare const pickAndAssign: (payload: Record<string, any>, params: Record<string, any>) => Record<string, any> & _.Dictionary<any>;
18
- /**
19
- * 寫入 Vue ref 物件的值
20
- * @param refObj
21
- * @param value
22
- */
23
- export declare const writeVueRefValue: (refObj: any, value: any) => void;
24
- /**
25
- * Lodash 擴充工具
26
- */
27
- export declare const lodashExTools: {
28
- getVal: (obj: any, path: string | null | undefined, defaultValue?: any) => any;
29
- };
30
- /**
31
- * 檢查是否有相同的檔案
32
- * @param fileList 檔案列表
33
- * @param file 要檢查的檔案
34
- */
35
- export declare const checkHasSameFile: (fileList: File[], file: File) => boolean;
36
- /**
37
- * 格式化物件中的所有日期屬性為指定格式的字串。
38
- * @param obj
39
- */
40
- export declare function formatDatesInObject(obj: any): any;
41
- /**
42
- * 建立一個日期區間驗證器,用於 yup 的 test 方法中。
43
- * @param startDateKey
44
- * @param endDateKey
45
- * @param startDateMessage
46
- * @param endDateMessage
47
- */
48
- export declare function makeDateRangeValidator({ startDateKey, endDateKey, startDateMessage, endDateMessage }: {
49
- startDateKey: string;
50
- endDateKey: string;
51
- startDateMessage: string;
52
- endDateMessage: string;
53
- }): (this: yup.TestContext, formValues: Record<string, any>) => true | yup.ValidationError;