@bagelink/vue 1.2.39 → 1.2.43
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/dist/components/calendar/CalendarPopover.vue.d.ts +179 -0
- package/dist/components/calendar/CalendarPopover.vue.d.ts.map +1 -0
- package/dist/components/calendar/CalendarTypes.d.ts +15 -0
- package/dist/components/calendar/CalendarTypes.d.ts.map +1 -1
- package/dist/components/calendar/Index.vue.d.ts +20 -12
- package/dist/components/calendar/Index.vue.d.ts.map +1 -1
- package/dist/components/calendar/views/AgendaView.vue.d.ts +8 -0
- package/dist/components/calendar/views/AgendaView.vue.d.ts.map +1 -1
- package/dist/components/calendar/views/CalendarPopover.vue.d.ts +175 -0
- package/dist/components/calendar/views/CalendarPopover.vue.d.ts.map +1 -0
- package/dist/components/calendar/views/DayView.vue.d.ts +10 -32
- package/dist/components/calendar/views/DayView.vue.d.ts.map +1 -1
- package/dist/components/calendar/views/MonthView.vue.d.ts +10 -170
- package/dist/components/calendar/views/MonthView.vue.d.ts.map +1 -1
- package/dist/components/calendar/views/WeekView.vue.d.ts +12 -168
- package/dist/components/calendar/views/WeekView.vue.d.ts.map +1 -1
- package/dist/components/form/FieldArray.vue.d.ts +4 -4
- package/dist/components/form/FieldArray.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/DateInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/DatePicker.vue.d.ts.map +1 -1
- package/dist/composables/useDevice.d.ts +3 -0
- package/dist/composables/useDevice.d.ts.map +1 -1
- package/dist/composables/useSchemaField.d.ts +1 -1
- package/dist/composables/useSchemaField.d.ts.map +1 -1
- package/dist/index.cjs +426 -280
- package/dist/index.mjs +426 -280
- package/dist/style.css +210 -167
- package/dist/types/BagelForm.d.ts +20 -17
- package/dist/types/BagelForm.d.ts.map +1 -1
- package/dist/utils/BagelFormUtils.d.ts +14 -20
- package/dist/utils/BagelFormUtils.d.ts.map +1 -1
- package/dist/utils/calendar/dateUtils.d.ts +7 -7
- package/dist/utils/index.d.ts +2 -4
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/calendar/CalendarPopover.vue +102 -0
- package/src/components/calendar/CalendarTypes.ts +14 -0
- package/src/components/calendar/Index.vue +75 -34
- package/src/components/calendar/views/AgendaView.vue +26 -2
- package/src/components/calendar/views/DayView.vue +83 -104
- package/src/components/calendar/views/MonthView.vue +21 -49
- package/src/components/calendar/views/WeekView.vue +227 -134
- package/src/components/form/FieldArray.vue +4 -3
- package/src/components/form/inputs/DateInput.vue +3 -1
- package/src/components/form/inputs/DatePicker.vue +7 -0
- package/src/composables/useDevice.ts +13 -2
- package/src/composables/useSchemaField.ts +4 -4
- package/src/styles/layout.css +14 -0
- package/src/styles/mobilLayout.css +12 -0
- package/src/types/BagelForm.ts +39 -59
- package/src/utils/BagelFormUtils.ts +16 -21
- package/src/utils/calendar/dateUtils.ts +22 -22
- package/src/utils/index.ts +3 -3
- package/src/components/calendar/utils.ts +0 -70
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { SelectInput, TextInput } from '..';
|
|
2
|
+
import { Paths, Get, IterableElement } from 'type-fest';
|
|
3
|
+
import { ToString } from 'type-fest/source/internal';
|
|
4
|
+
import { LiteralStringUnion } from 'type-fest/source/literal-union';
|
|
2
5
|
import { VNode } from 'vue';
|
|
3
6
|
import { ComponentExposed } from 'vue-component-type-helpers';
|
|
4
|
-
export type AttributeValue = string | number | boolean | undefined |
|
|
7
|
+
export type AttributeValue = string | number | boolean | undefined | {
|
|
5
8
|
[key: string]: any;
|
|
6
9
|
};
|
|
7
|
-
export type AttributeFn<T
|
|
8
|
-
export interface Attributes<T
|
|
9
|
-
[key: string]: AttributeValue | AttributeFn<T>;
|
|
10
|
+
export type AttributeFn<T, P extends Path<T>> = (field: FieldVal<T, P>, row?: T) => AttributeValue;
|
|
11
|
+
export interface Attributes<T, P extends Path<T>> {
|
|
12
|
+
[key: string]: AttributeValue | AttributeFn<T, P>;
|
|
10
13
|
}
|
|
11
14
|
export type BagelFieldOptions<T> = (string | ({
|
|
12
15
|
label?: string;
|
|
@@ -14,25 +17,25 @@ export type BagelFieldOptions<T> = (string | ({
|
|
|
14
17
|
} | string | number | boolean | {
|
|
15
18
|
[key: string]: any;
|
|
16
19
|
})[] | ((val: any, rowData?: T) => void));
|
|
17
|
-
export type
|
|
18
|
-
export type
|
|
19
|
-
export type
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export type Path<T> =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export type ArrayFieldVal<T, P
|
|
20
|
+
export type VIfType<T, P extends Path<T>> = (string | boolean | ((val?: FieldVal<T, P>, rowData?: T) => boolean));
|
|
21
|
+
export type ValidationFn<T, P extends Path<T>> = (val: FieldVal<T, P>, rowData?: T) => string | undefined;
|
|
22
|
+
export type _Path<T> = (ToString<Paths<T, {
|
|
23
|
+
bracketNotation: false;
|
|
24
|
+
}>>);
|
|
25
|
+
export type Path<T> = (FieldVal<T, _Path<T>> extends Array<any> ? LiteralStringUnion<_Path<T>> : _Path<T>);
|
|
26
|
+
/** The value type at path P in object T. */
|
|
27
|
+
export type FieldVal<T, P extends Path<T>> = Get<T, P>;
|
|
28
|
+
/** If path P in T is an array, this gives the array's element type. */
|
|
29
|
+
export type ArrayFieldVal<T, P extends Path<T>> = IterableElement<Get<T, P>>;
|
|
27
30
|
export type SchemaChildrenT<T> = (Field<T> | string | VNode)[];
|
|
28
|
-
export interface BaseBagelField<T, P
|
|
31
|
+
export interface BaseBagelField<T, P extends Path<T>> {
|
|
29
32
|
'$el'?: any;
|
|
30
33
|
'id'?: P;
|
|
31
34
|
'label'?: string;
|
|
32
35
|
'placeholder'?: string;
|
|
33
36
|
'children'?: SchemaChildrenT<T>;
|
|
34
|
-
'class'?: AttributeValue | AttributeFn<T>;
|
|
35
|
-
'attrs'?: Attributes<T>;
|
|
37
|
+
'class'?: AttributeValue | AttributeFn<T, P>;
|
|
38
|
+
'attrs'?: Attributes<T, P>;
|
|
36
39
|
'required'?: boolean;
|
|
37
40
|
'disabled'?: boolean;
|
|
38
41
|
'helptext'?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BagelForm.d.ts","sourceRoot":"","sources":["../../src/types/BagelForm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,CAAA;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG
|
|
1
|
+
{"version":3,"file":"BagelForm.d.ts","sourceRoot":"","sources":["../../src/types/BagelForm.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import { ArrayFieldVal, BaseBagelField, BglFormSchemaT, Field, IconType, InputBagelField, Option, Path,
|
|
1
|
+
import { ArrayFieldVal, BaseBagelField, BglFormSchemaT, Field, IconType, InputBagelField, Option, Path, SelectBagelField } from '..';
|
|
2
2
|
import { UploadInputProps } from '../components/form/inputs/Upload/upload.types';
|
|
3
|
-
interface InputOptions<T,
|
|
4
|
-
required?: boolean;
|
|
5
|
-
placeholder?: string;
|
|
6
|
-
class?: string;
|
|
3
|
+
interface InputOptions<T, P extends Path<T>> extends Partial<BaseBagelField<T, P>> {
|
|
7
4
|
defaultValue?: string | number;
|
|
8
|
-
|
|
9
|
-
helptext?: string;
|
|
10
|
-
autocomplete?: string;
|
|
11
|
-
vIf?: VIfType<T, K>;
|
|
5
|
+
autocomplete?: AutoFillField;
|
|
12
6
|
}
|
|
13
|
-
interface DateOptions<T, K
|
|
7
|
+
interface DateOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
14
8
|
enableTime?: boolean;
|
|
15
9
|
mode?: 'day' | 'month' | 'year';
|
|
16
10
|
locale?: string;
|
|
17
11
|
timezone?: string;
|
|
18
12
|
}
|
|
19
|
-
interface TextInputOptions<T, K
|
|
13
|
+
interface TextInputOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
20
14
|
type?: 'text' | 'tel' | 'email' | 'time';
|
|
21
15
|
pattern?: string;
|
|
22
16
|
multiline?: boolean;
|
|
@@ -26,13 +20,13 @@ interface TextInputOptions<T, K> extends InputOptions<T, K> {
|
|
|
26
20
|
icon?: IconType;
|
|
27
21
|
iconStart?: IconType;
|
|
28
22
|
}
|
|
29
|
-
interface SlctInputOptions<T, K
|
|
23
|
+
interface SlctInputOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
30
24
|
searchable?: boolean;
|
|
31
25
|
multiselect?: boolean;
|
|
32
26
|
clearable?: boolean;
|
|
33
27
|
onSearch?: (search: string) => any;
|
|
34
28
|
}
|
|
35
|
-
interface NumFieldOptions<T, K
|
|
29
|
+
interface NumFieldOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
36
30
|
max?: number;
|
|
37
31
|
min?: number;
|
|
38
32
|
step?: number;
|
|
@@ -41,22 +35,22 @@ interface NumFieldOptions<T, K> extends InputOptions<T, K> {
|
|
|
41
35
|
center?: boolean;
|
|
42
36
|
useGrouping?: boolean;
|
|
43
37
|
}
|
|
44
|
-
type RichTextOptions<T,
|
|
38
|
+
type RichTextOptions<T, P extends Path<T>> = InputOptions<T, P>;
|
|
45
39
|
export declare function getBaseField<T, P extends Path<T>>(id?: P, labelOrRest?: string | Partial<BaseBagelField<T, P>>, rest?: Partial<BaseBagelField<T, P>>): BaseBagelField<T, P>;
|
|
46
40
|
export declare function richText<T, P extends Path<T>>(id: P, label?: string, options?: RichTextOptions<T, P>): BaseBagelField<T, P>;
|
|
47
|
-
export declare function txtField<T, P extends Path<T>>(id: P, label?: string, options?: TextInputOptions<T, P>
|
|
41
|
+
export declare function txtField<T, P extends Path<T>>(id: P, label?: string, options?: TextInputOptions<T, P>): BaseBagelField<T, P> | InputBagelField<T>;
|
|
48
42
|
export declare function selectField<T, P extends Path<T>>(id: P, label?: string, options?: Option[] | (() => Option[]), config?: SlctInputOptions<T, P>): BaseBagelField<T, P> | SelectBagelField<T>;
|
|
49
43
|
export declare const slctField: typeof selectField;
|
|
50
|
-
interface CheckInputOptions<T, K
|
|
44
|
+
interface CheckInputOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
51
45
|
value?: string;
|
|
52
46
|
}
|
|
53
47
|
export declare function checkField<T, P extends Path<T>>(id: P, label?: string, options?: CheckInputOptions<T, P>): BaseBagelField<T, P>;
|
|
54
48
|
export declare function dateField<T, P extends Path<T>>(id: P, label?: string, options?: DateOptions<T, P>): BaseBagelField<T, P>;
|
|
55
49
|
export declare function numField<T, P extends Path<T>>(id: P, label?: string, options?: NumFieldOptions<T, P>): BaseBagelField<T, P>;
|
|
56
|
-
export declare function frmRow<T>(...children:
|
|
57
|
-
export type UploadOptions<T, K
|
|
50
|
+
export declare function frmRow<T>(...children: Field<T>[]): Field<T>;
|
|
51
|
+
export type UploadOptions<T, K extends Path<T>> = InputOptions<T, K> & UploadInputProps;
|
|
58
52
|
export declare function uploadField<T, P extends Path<T>>(id: P, label?: string, options?: UploadOptions<T, P>): BaseBagelField<T, P>;
|
|
59
|
-
interface RangeOptions<T, K
|
|
53
|
+
interface RangeOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
60
54
|
min?: number;
|
|
61
55
|
max?: number;
|
|
62
56
|
step?: number;
|
|
@@ -85,7 +79,7 @@ export declare function colorField<T, P extends Path<T>>(id: P, label?: string,
|
|
|
85
79
|
[key: string]: any;
|
|
86
80
|
}): BaseBagelField<T, P>;
|
|
87
81
|
export declare function findBglFieldById<T>(id: string, _schema: BglFormSchemaT<T>): Field<T> | undefined;
|
|
88
|
-
export interface ArrayFieldOptions<T, K
|
|
82
|
+
export interface ArrayFieldOptions<T, K extends Path<T>> extends InputOptions<T, K> {
|
|
89
83
|
delete?: boolean;
|
|
90
84
|
add?: boolean;
|
|
91
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BagelFormUtils.d.ts","sourceRoot":"","sources":["../../src/utils/BagelFormUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAc,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"BagelFormUtils.d.ts","sourceRoot":"","sources":["../../src/utils/BagelFormUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAc,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChK,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAA;AAErF,UAAU,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,YAAY,CAAC,EAAE,aAAa,CAAA;CAC5B;AAED,UAAU,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,CAAA;CAClC;AAED,UAAU,eAAe,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAE/D,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAChD,EAAE,CAAC,EAAE,CAAC,EACN,WAAW,GAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM,EACxD,IAAI,GAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM,GACtC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAGtB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC5C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAatB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC5C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC9B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAyB3C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC/C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,EAAE,CAAC,EACrC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAoB5C;AAED,eAAO,MAAM,SAAS,oBAAc,CAAA;AAEpC,UAAU,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC9C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC/B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAWtB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC7C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAmBtB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC5C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAuBtB;AAGD,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAM3D;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAA;AAEvF,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAU5H;AAED,UAAU,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACvC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC9C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,YAAY,CAAE,CAAC,EAAE,CAAC,CAAC,GAC3B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAgBtB;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;EAgB9E;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC5C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAC9B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAStB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC9C,EAAE,EAAE,CAAC,EACL,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAC9B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAStB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAYhG;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAClF,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;CACb;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEzC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC5C,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,EAC7D,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC/B,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAiBtB;AAqBD,wBAAgB,OAAO,IAAI;IAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,WAAW,EAAE,OAAO,WAAW,CAAA;IAC/B,UAAU,EAAE,OAAO,UAAU,CAAA;IAC7B,SAAS,EAAE,OAAO,SAAS,CAAA;IAC3B,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,MAAM,EAAE,OAAO,MAAM,CAAA;IACrB,WAAW,EAAE,OAAO,WAAW,CAAA;IAC/B,UAAU,EAAE,OAAO,UAAU,CAAA;IAC7B,OAAO,EAAE,OAAO,OAAO,CAAA;IACvB,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,UAAU,EAAE,OAAO,UAAU,CAAA;IAC7B,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,gBAAgB,EAAE,OAAO,gBAAgB,CAAA;CACzC,CAiBA"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { DateLike } from '@vueuse/core';
|
|
2
2
|
import { AvailableTimeLanguages, DateTimeAcceptedFormats } from '../../types/timeAgoT';
|
|
3
3
|
interface TimeDeltaOptions {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
Day?: number;
|
|
5
|
+
Hour?: number;
|
|
6
|
+
Minute?: number;
|
|
7
|
+
Second?: number;
|
|
8
|
+
Week?: number;
|
|
9
|
+
Month?: number;
|
|
10
|
+
Year?: number;
|
|
11
11
|
}
|
|
12
12
|
export declare function timeDelta(date: string | Date, options: TimeDeltaOptions): Date;
|
|
13
13
|
export declare function timeAgo(date: string | Date, lang?: AvailableTimeLanguages): string;
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Attributes, BglFormSchemaT } from '..';
|
|
1
|
+
import { Attributes, BglFormSchemaT, Path } from '..';
|
|
2
2
|
export declare function debounce(fn: () => void, wait?: number): void;
|
|
3
3
|
export declare function slugify(str: string): string;
|
|
4
4
|
export declare function keyToLabel(key?: string): string | undefined;
|
|
@@ -6,9 +6,7 @@ export declare function copyText(text: string, cb?: (msg: string) => void): Prom
|
|
|
6
6
|
export declare function initials(...strArr: string[]): string;
|
|
7
7
|
export declare function useEscape(event: KeyboardEvent, closeModel: () => void): void;
|
|
8
8
|
export declare function classify(fieldVal?: any, row?: any, ...classes: any[]): string;
|
|
9
|
-
export declare function bindAttrs<T
|
|
10
|
-
[key: string]: any;
|
|
11
|
-
}>(attrs?: Attributes<T>, fieldVal?: any, row?: T): {
|
|
9
|
+
export declare function bindAttrs<T, P extends Path<T>>(attrs?: Attributes<T, P>, fieldVal?: any, row?: T): {
|
|
12
10
|
[key: string]: any;
|
|
13
11
|
};
|
|
14
12
|
export declare function iffer(field: any, itemData: any): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAIrE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,MAAY,QAO1D;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,UAMlC;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ3D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,iBAGtE;AAED,wBAAgB,QAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,UAG3C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,QAIrE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,UAOpE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAC7C,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,QAAQ,CAAC,EAAE,GAAG,EACd,GAAG,CAAC,EAAE,CAAC;;EAwBP;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAO9C;AAED,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,OAAO,CAAC,EAAE,MAAM,OAG5E;AAED,eAAO,MAAM,MAAM,GAAI,YAAY,GAAG,YAA0C,CAAA;AAEhF,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,IAAI,CAAC,EAAE,GAAG,EAAE,EACZ,OAAO,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc,CAAC,CAAC,CAAC,CAgBnB;AAED,wBAAgB,KAAK,CAAC,EAAE,GAAE,MAAY,oBAErC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBlF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,UAIvC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,aAAa,SAAO,GAAG,MAAM,GAAG,SAAS,CAG/G;AAED,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAO5C,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,sBAM5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,GAAE,GAAe,GAAG,GAAG,CAa1F"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { CalendarEvent } from './CalendarTypes'
|
|
3
|
+
import { Card, useDevice } from '@bagelink/vue'
|
|
4
|
+
import { ref, computed } from 'vue'
|
|
5
|
+
|
|
6
|
+
const props = defineProps<{
|
|
7
|
+
event?: CalendarEvent
|
|
8
|
+
targetElement?: HTMLElement
|
|
9
|
+
position?: { top: number, left: number }
|
|
10
|
+
show: boolean
|
|
11
|
+
hasEventContentSlot: boolean
|
|
12
|
+
}>()
|
|
13
|
+
const emit = defineEmits<{
|
|
14
|
+
(e: 'close'): void
|
|
15
|
+
(e: 'eventClick', event: CalendarEvent): void
|
|
16
|
+
}>()
|
|
17
|
+
const { scrollY, scrollX, innerHeight, innerWidth } = useDevice()
|
|
18
|
+
const popoverRef = ref<HTMLElement>()
|
|
19
|
+
|
|
20
|
+
const popoverPosition = computed(() => {
|
|
21
|
+
const popoverWidth = 400
|
|
22
|
+
const margin = 10
|
|
23
|
+
|
|
24
|
+
if (props.position) {
|
|
25
|
+
// If position is directly provided, use it
|
|
26
|
+
let { top, left } = props.position
|
|
27
|
+
top -= 80
|
|
28
|
+
|
|
29
|
+
// Keep popover within viewport bounds
|
|
30
|
+
top = Math.max(scrollY.value + margin, Math.min(top, innerHeight.value + scrollY.value - 150 - 10))
|
|
31
|
+
left = Math.max(scrollX.value + margin, Math.min(left, innerWidth.value + scrollX.value - popoverWidth - margin))
|
|
32
|
+
|
|
33
|
+
return { top, left, width: popoverWidth, height: 150 }
|
|
34
|
+
} else if (props.targetElement && props.show) {
|
|
35
|
+
// Position relative to target element
|
|
36
|
+
const target = props.targetElement
|
|
37
|
+
const rect = target.getBoundingClientRect()
|
|
38
|
+
|
|
39
|
+
let top = rect.top + scrollY.value + (rect.height / 2) - (150 / 2)
|
|
40
|
+
let left = rect.left + scrollX.value + rect.width + margin
|
|
41
|
+
|
|
42
|
+
// Keep popover within viewport bounds
|
|
43
|
+
top = Math.max(scrollY.value + margin, Math.min(top, innerHeight.value + scrollY.value - 150 - 10))
|
|
44
|
+
|
|
45
|
+
// If it would go off right side, position to the left instead
|
|
46
|
+
if (left + popoverWidth > innerWidth.value + scrollX.value) {
|
|
47
|
+
left = rect.left + scrollX.value - popoverWidth + rect.width - margin
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (left < scrollX.value) left = rect.right + scrollX.value + margin
|
|
51
|
+
|
|
52
|
+
return { top, left, width: popoverWidth, height: 150 }
|
|
53
|
+
}
|
|
54
|
+
return { top: 0, left: 0, width: popoverWidth, height: 150 }
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
function closePopover() {
|
|
58
|
+
emit('close')
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<template>
|
|
63
|
+
<Card
|
|
64
|
+
v-if="show && event"
|
|
65
|
+
ref="popoverRef"
|
|
66
|
+
v-click-outside="closePopover"
|
|
67
|
+
thin
|
|
68
|
+
class="custom-popover"
|
|
69
|
+
:style="{
|
|
70
|
+
top: `${popoverPosition.top}px`,
|
|
71
|
+
left: `${popoverPosition.left}px`,
|
|
72
|
+
maxWidth: `${popoverPosition.width}px`,
|
|
73
|
+
}"
|
|
74
|
+
>
|
|
75
|
+
<slot name="eventContent" :event="event" />
|
|
76
|
+
</Card>
|
|
77
|
+
</template>
|
|
78
|
+
|
|
79
|
+
<style scoped>
|
|
80
|
+
.custom-popover {
|
|
81
|
+
position: fixed;
|
|
82
|
+
z-index: 1000;
|
|
83
|
+
min-width: 250px;
|
|
84
|
+
max-width: 350px;
|
|
85
|
+
background-color: white;
|
|
86
|
+
border-radius: var(--btn-border-radius);
|
|
87
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
88
|
+
animation: fadeIn 0.2s ease;
|
|
89
|
+
transform-origin: center left;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@keyframes fadeIn {
|
|
93
|
+
from {
|
|
94
|
+
opacity: 0;
|
|
95
|
+
transform: scale(0.95);
|
|
96
|
+
}
|
|
97
|
+
to {
|
|
98
|
+
opacity: 1;
|
|
99
|
+
transform: scale(1);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
</style>
|
|
@@ -11,3 +11,17 @@ export interface CalendarEvent {
|
|
|
11
11
|
export type CalendarView = 'Week' | 'Month' | 'Day' | 'Agenda'
|
|
12
12
|
|
|
13
13
|
export type WeekStart = 'Sunday' | 'Monday'
|
|
14
|
+
|
|
15
|
+
export interface CalendarProps {
|
|
16
|
+
events?: CalendarEvent[]
|
|
17
|
+
startDate?: Date
|
|
18
|
+
view?: CalendarView
|
|
19
|
+
weekStart?: WeekStart
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface CalendarViewState {
|
|
23
|
+
currentView?: CalendarView
|
|
24
|
+
weekStart?: WeekStart
|
|
25
|
+
visibleDateRange?: { start: Date, end: Date }
|
|
26
|
+
currentDate?: Date
|
|
27
|
+
}
|
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import type { Component } from 'vue'
|
|
3
|
-
import type { CalendarEvent, CalendarView,
|
|
3
|
+
import type { CalendarEvent, CalendarProps, CalendarView, CalendarViewState } from './CalendarTypes'
|
|
4
4
|
import { timeDelta, Btn, ListItem, Dropdown, fmtDate } from '@bagelink/vue'
|
|
5
|
-
import { ref, computed } from 'vue'
|
|
5
|
+
import { ref, computed, onMounted } from 'vue'
|
|
6
|
+
import CalendarPopover from './CalendarPopover.vue'
|
|
6
7
|
import AgendaView from './views/AgendaView.vue'
|
|
7
8
|
import DayView from './views/DayView.vue'
|
|
8
9
|
import MonthView from './views/MonthView.vue'
|
|
9
10
|
import WeekView from './views/WeekView.vue'
|
|
10
11
|
|
|
11
|
-
interface CalendarProps {
|
|
12
|
-
events?: CalendarEvent[]
|
|
13
|
-
startDate?: Date
|
|
14
|
-
view?: CalendarView
|
|
15
|
-
weekStart?: WeekStart
|
|
16
|
-
}
|
|
17
|
-
|
|
18
12
|
const props = withDefaults(defineProps<CalendarProps>(), {
|
|
19
13
|
startDate: () => new Date(),
|
|
20
14
|
view: 'Week',
|
|
@@ -27,15 +21,17 @@ const emit = defineEmits<{
|
|
|
27
21
|
(e: 'eventCreate', event: { start_time: Date, end_time: Date }): void
|
|
28
22
|
(e: 'eventUpdate', event: CalendarEvent): void
|
|
29
23
|
(e: 'eventDelete', eventId: string): void
|
|
30
|
-
(e: 'dateChange',
|
|
31
|
-
(e: 'viewChange',
|
|
24
|
+
(e: 'dateChange', changeEvent: CalendarViewState): void
|
|
25
|
+
(e: 'viewChange', changeEvent: CalendarViewState): void
|
|
26
|
+
(e: 'ready', changeEvent: CalendarViewState): void
|
|
32
27
|
}>()
|
|
33
28
|
|
|
34
|
-
// State
|
|
35
29
|
const currentDate = ref(new Date(props.startDate))
|
|
36
30
|
const currentView = ref(props.view)
|
|
31
|
+
const activeEvent = ref<CalendarEvent>()
|
|
32
|
+
const showPopover = ref(false)
|
|
33
|
+
const popoverPosition = ref<{ top: number, left: number }>()
|
|
37
34
|
|
|
38
|
-
// Available view components
|
|
39
35
|
const views: Record<CalendarView, Component> = {
|
|
40
36
|
Week: WeekView,
|
|
41
37
|
Month: MonthView,
|
|
@@ -43,27 +39,46 @@ const views: Record<CalendarView, Component> = {
|
|
|
43
39
|
Agenda: AgendaView
|
|
44
40
|
}
|
|
45
41
|
|
|
46
|
-
// Calculate visible date range based on current view
|
|
47
42
|
const visibleDateRange = computed(() => {
|
|
48
43
|
const start = new Date(currentDate.value)
|
|
49
44
|
let end = new Date(currentDate.value)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
45
|
+
const addSunday = props.weekStart === 'Sunday' ? 0 : 1
|
|
46
|
+
switch (currentView.value) {
|
|
47
|
+
case 'Week':
|
|
48
|
+
start.setDate(start.getDate() - start.getDay() + addSunday)
|
|
49
|
+
end.setDate(start.getDate() + 6)
|
|
50
|
+
break
|
|
51
|
+
case 'Month':
|
|
52
|
+
case 'Agenda':
|
|
53
|
+
start.setDate(-6)
|
|
54
|
+
end = new Date(start.getFullYear(), start.getMonth() + 2, 7)
|
|
55
|
+
break
|
|
56
|
+
case 'Day':
|
|
57
|
+
end.setDate(end.getDate() + 1)
|
|
58
|
+
break
|
|
59
|
+
default:
|
|
60
|
+
console.error(`Invalid view: ${currentView.value}`)
|
|
63
61
|
}
|
|
64
62
|
return { start, end }
|
|
65
63
|
})
|
|
66
64
|
|
|
65
|
+
const state = computed<CalendarViewState>(() => ({
|
|
66
|
+
visibleDateRange: visibleDateRange.value,
|
|
67
|
+
currentDate: currentDate.value,
|
|
68
|
+
currentView: currentView.value
|
|
69
|
+
}))
|
|
70
|
+
|
|
71
|
+
function handleDateChange(date: Date) {
|
|
72
|
+
console.log('handleDateChange', date)
|
|
73
|
+
currentDate.value = new Date(date)
|
|
74
|
+
emit('dateChange', state.value)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function handleViewChange(view: CalendarView) {
|
|
78
|
+
currentView.value = view
|
|
79
|
+
emit('viewChange', state.value)
|
|
80
|
+
}
|
|
81
|
+
|
|
67
82
|
// Event handlers
|
|
68
83
|
function handleEventClick(event: CalendarEvent) {
|
|
69
84
|
emit('eventClick', event)
|
|
@@ -81,17 +96,28 @@ function handleEventDelete(eventId: string) {
|
|
|
81
96
|
emit('eventDelete', eventId)
|
|
82
97
|
}
|
|
83
98
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
99
|
+
// Popover handling
|
|
100
|
+
function openPopover(event: CalendarEvent, position?: { top: number, left: number }) {
|
|
101
|
+
activeEvent.value = event
|
|
102
|
+
popoverPosition.value = position
|
|
103
|
+
showPopover.value = true
|
|
87
104
|
}
|
|
88
105
|
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
|
|
106
|
+
function closePopover() {
|
|
107
|
+
showPopover.value = false
|
|
108
|
+
activeEvent.value = undefined
|
|
109
|
+
popoverPosition.value = undefined
|
|
92
110
|
}
|
|
93
111
|
|
|
94
|
-
defineExpose({
|
|
112
|
+
defineExpose({
|
|
113
|
+
visibleDateRange,
|
|
114
|
+
currentView,
|
|
115
|
+
currentDate,
|
|
116
|
+
openPopover,
|
|
117
|
+
closePopover
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
onMounted(() => { emit('ready', state.value) })
|
|
95
121
|
</script>
|
|
96
122
|
|
|
97
123
|
<template>
|
|
@@ -135,11 +161,26 @@ defineExpose({ visibleDateRange })
|
|
|
135
161
|
@event-update="handleEventUpdate"
|
|
136
162
|
@event-delete="handleEventDelete"
|
|
137
163
|
@date-change="handleDateChange"
|
|
164
|
+
@open-popover="openPopover"
|
|
138
165
|
>
|
|
139
166
|
<template #eventContent="{ event }">
|
|
140
167
|
<slot name="eventContent" :event="event" />
|
|
141
168
|
</template>
|
|
142
169
|
</component>
|
|
170
|
+
|
|
171
|
+
<!-- Global Popover -->
|
|
172
|
+
<CalendarPopover
|
|
173
|
+
:event="activeEvent"
|
|
174
|
+
:position="popoverPosition"
|
|
175
|
+
:show="showPopover"
|
|
176
|
+
:has-event-content-slot="!!$slots.eventContent"
|
|
177
|
+
@close="closePopover"
|
|
178
|
+
@event-click="handleEventClick"
|
|
179
|
+
>
|
|
180
|
+
<template #eventContent="{ event }">
|
|
181
|
+
<slot name="eventContent" :event="event" />
|
|
182
|
+
</template>
|
|
183
|
+
</CalendarPopover>
|
|
143
184
|
</div>
|
|
144
185
|
</template>
|
|
145
186
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import type { SetupContext } from 'vue'
|
|
2
3
|
import type { CalendarEvent } from '../CalendarTypes'
|
|
3
4
|
import { formatDate } from '@bagelink/vue'
|
|
4
|
-
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
|
5
|
+
import { ref, computed, onMounted, onUnmounted, useSlots } from 'vue'
|
|
5
6
|
|
|
6
7
|
interface AgendaViewEvent extends CalendarEvent {
|
|
7
8
|
dayLabel: string
|
|
@@ -17,8 +18,11 @@ const props = defineProps<{
|
|
|
17
18
|
const emit = defineEmits<{
|
|
18
19
|
(e: 'eventClick', event: CalendarEvent): void
|
|
19
20
|
(e: 'dateChange', date: Date): void
|
|
21
|
+
(e: 'openPopover', event: CalendarEvent, position?: { top: number, left: number }): void
|
|
20
22
|
}>()
|
|
21
23
|
|
|
24
|
+
const slots: SetupContext['slots'] = useSlots()
|
|
25
|
+
|
|
22
26
|
// UI references
|
|
23
27
|
const containerRef = ref<HTMLElement | null>(null)
|
|
24
28
|
const currentDate = ref<Date | null>(null)
|
|
@@ -103,6 +107,26 @@ function handleScroll() {
|
|
|
103
107
|
}
|
|
104
108
|
}
|
|
105
109
|
|
|
110
|
+
// Update event handling to emit the openPopover event
|
|
111
|
+
function handleEventSelection(event: CalendarEvent, domEvent?: MouseEvent) {
|
|
112
|
+
if (!slots.eventContent) {
|
|
113
|
+
emit('eventClick', event)
|
|
114
|
+
return
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Calculate position from DOM event if available
|
|
118
|
+
if (domEvent) {
|
|
119
|
+
const rect = (domEvent.currentTarget as HTMLElement).getBoundingClientRect()
|
|
120
|
+
const position = {
|
|
121
|
+
top: rect.top + window.scrollY + (rect.height / 2),
|
|
122
|
+
left: rect.left + window.scrollX + rect.width + 10
|
|
123
|
+
}
|
|
124
|
+
emit('openPopover', event, position)
|
|
125
|
+
} else {
|
|
126
|
+
emit('openPopover', event)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
106
130
|
// Lifecycle hooks
|
|
107
131
|
onMounted(() => {
|
|
108
132
|
if (containerRef.value) {
|
|
@@ -137,7 +161,7 @@ onUnmounted(() => {
|
|
|
137
161
|
backgroundColor: event.color || 'var(--bgl-primary)',
|
|
138
162
|
}"
|
|
139
163
|
:data-date="event.start_time"
|
|
140
|
-
@click.stop="
|
|
164
|
+
@click.stop="handleEventSelection(event, $event)"
|
|
141
165
|
>
|
|
142
166
|
<div class="event-content">
|
|
143
167
|
<div class="event-time">
|