@bagelink/vue 0.0.466 → 0.0.473
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/Accordion.vue.d.ts.map +1 -1
- package/dist/components/AccordionItem.vue.d.ts.map +1 -1
- package/dist/components/Alert.vue.d.ts +2 -2
- package/dist/components/Alert.vue.d.ts.map +1 -1
- package/dist/components/Avatar.vue.d.ts.map +1 -1
- package/dist/components/Badge.vue.d.ts +2 -2
- package/dist/components/Badge.vue.d.ts.map +1 -1
- package/dist/components/BglVideo.vue.d.ts +2 -2
- package/dist/components/BglVideo.vue.d.ts.map +1 -1
- package/dist/components/Btn.vue.d.ts +2 -0
- package/dist/components/Btn.vue.d.ts.map +1 -1
- package/dist/components/Card.vue.d.ts.map +1 -1
- package/dist/components/Carousel.vue.d.ts +4 -2
- package/dist/components/Carousel.vue.d.ts.map +1 -1
- package/dist/components/DataPreview.vue.d.ts.map +1 -1
- package/dist/components/Drop.vue.d.ts +34 -0
- package/dist/components/Drop.vue.d.ts.map +1 -0
- package/dist/components/FileUploader.vue.d.ts +60 -0
- package/dist/components/FileUploader.vue.d.ts.map +1 -0
- package/dist/components/Flag.vue.d.ts +2 -2
- package/dist/components/Flag.vue.d.ts.map +1 -1
- package/dist/components/ListItem.vue.d.ts.map +1 -1
- package/dist/components/ListView.vue.d.ts.map +1 -1
- package/dist/components/MapEmbed.vue.d.ts +2 -2
- package/dist/components/MapEmbed.vue.d.ts.map +1 -1
- package/dist/components/MaterialIcon.vue.d.ts.map +1 -1
- package/dist/components/Modal.vue.d.ts +2 -1
- package/dist/components/Modal.vue.d.ts.map +1 -1
- package/dist/components/ModalConfirm.vue.d.ts.map +1 -1
- package/dist/components/ModalForm.vue.d.ts.map +1 -1
- package/dist/components/NavBar.vue.d.ts.map +1 -1
- package/dist/components/PageTitle.vue.d.ts.map +1 -1
- package/dist/components/TableSchema.vue.d.ts.map +1 -1
- package/dist/components/Title.vue.d.ts.map +1 -1
- package/dist/components/dashboard/Lineart.vue.d.ts.map +1 -1
- package/dist/components/dashboard/index.d.ts.map +1 -1
- package/dist/components/form/BglField.vue.d.ts.map +1 -1
- package/dist/components/form/BglForm.vue.d.ts +4 -2
- package/dist/components/form/BglForm.vue.d.ts.map +1 -1
- package/dist/components/form/ItemRef.vue.d.ts +1 -0
- package/dist/components/form/ItemRef.vue.d.ts.map +1 -1
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/inputs/CheckInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/Checkbox.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/ColorPicker.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/components/form/inputs/FileUpload.vue.d.ts +2 -1
- package/dist/components/form/inputs/FileUpload.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/JSONInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RadioPillsInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/SelectField.vue.d.ts +1 -4
- package/dist/components/form/inputs/SelectField.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/SignaturePad.vue.d.ts +56 -0
- package/dist/components/form/inputs/SignaturePad.vue.d.ts.map +1 -0
- package/dist/components/form/inputs/TableField.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/TelInput.vue.d.ts +2 -2
- package/dist/components/form/inputs/TelInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/TextInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/ToggleInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/index.d.ts +1 -0
- package/dist/components/form/inputs/index.d.ts.map +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/layout/BottomMenu.vue.d.ts.map +1 -1
- package/dist/components/layout/Layout.vue.d.ts +2 -2
- package/dist/components/layout/Layout.vue.d.ts.map +1 -1
- package/dist/components/layout/SidebarMenu.vue.d.ts.map +1 -1
- package/dist/components/layout/TabbedLayout.vue.d.ts.map +1 -1
- package/dist/components/layout/Tabs.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsBody.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsNav.vue.d.ts.map +1 -1
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/index.cjs +17617 -20818
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +17617 -20818
- package/dist/plugins/bagel.d.ts +1 -1
- package/dist/plugins/bagel.d.ts.map +1 -1
- package/dist/plugins/modal.d.ts +14 -14
- package/dist/plugins/modal.d.ts.map +1 -1
- package/dist/style.css +333 -309
- package/dist/types/BagelForm.d.ts +16 -16
- package/dist/types/BagelForm.d.ts.map +1 -1
- package/dist/types/BtnOptions.d.ts +1 -1
- package/dist/types/BtnOptions.d.ts.map +1 -1
- package/dist/types/NavLink.d.ts +2 -2
- package/dist/types/NavLink.d.ts.map +1 -1
- package/dist/types/file.d.ts +2 -2
- package/dist/types/file.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/materialIcons.d.ts.map +1 -1
- package/dist/utils/BagelFormUtils.d.ts.map +1 -1
- package/dist/utils/allCountries.d.ts +2 -2
- package/dist/utils/allCountries.d.ts.map +1 -1
- package/dist/utils/clickOutside.d.ts.map +1 -1
- package/dist/utils/index.d.ts +5 -5
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +19 -17
- package/src/components/Accordion.vue +10 -10
- package/src/components/AccordionItem.vue +47 -47
- package/src/components/Alert.vue +21 -21
- package/src/components/Avatar.vue +15 -15
- package/src/components/Badge.vue +17 -16
- package/src/components/BglVideo.vue +43 -43
- package/src/components/Btn.vue +67 -65
- package/src/components/Card.vue +26 -26
- package/src/components/Carousel.vue +130 -134
- package/src/components/DataPreview.vue +30 -30
- package/src/components/Flag.vue +26 -26
- package/src/components/ListItem.vue +13 -13
- package/src/components/ListView.vue +2 -2
- package/src/components/MapEmbed.vue +33 -33
- package/src/components/MaterialIcon.vue +12 -12
- package/src/components/Modal.vue +73 -66
- package/src/components/ModalConfirm.vue +18 -18
- package/src/components/ModalForm.vue +79 -76
- package/src/components/NavBar.vue +33 -30
- package/src/components/PageTitle.vue +10 -8
- package/src/components/TableSchema.vue +126 -113
- package/src/components/Title.vue +8 -8
- package/src/components/dashboard/Lineart.vue +103 -96
- package/src/components/dashboard/index.ts +1 -1
- package/src/components/form/BglField.vue +61 -61
- package/src/components/form/BglFieldSet.vue +9 -8
- package/src/components/form/BglForm.vue +71 -70
- package/src/components/form/index.ts +4 -4
- package/src/components/form/inputs/CheckInput.vue +25 -23
- package/src/components/form/inputs/Checkbox.vue +10 -10
- package/src/components/form/inputs/ColorPicker.vue +26 -24
- package/src/components/form/inputs/DateInput.vue +39 -39
- package/src/components/form/inputs/DatePicker.vue +37 -36
- package/src/components/form/inputs/FileUpload.vue +165 -161
- package/src/components/form/inputs/FileUploadURL.vue +134 -132
- package/src/components/form/inputs/JSONInput.vue +29 -29
- package/src/components/form/inputs/RadioPillsInput.vue +49 -49
- package/src/components/form/inputs/RichText.vue +62 -63
- package/src/components/form/inputs/SelectInput.vue +173 -167
- package/src/components/form/inputs/SignaturePad.vue +150 -0
- package/src/components/form/inputs/TableField.vue +77 -76
- package/src/components/form/inputs/TelInput.vue +280 -285
- package/src/components/form/inputs/TextInput.vue +81 -76
- package/src/components/form/inputs/ToggleInput.vue +13 -13
- package/src/components/form/inputs/index.ts +17 -15
- package/src/components/formkit/FileUploader.vue +162 -158
- package/src/components/formkit/MiscFields.vue +20 -20
- package/src/components/formkit/Toggle.vue +13 -13
- package/src/components/index.ts +28 -28
- package/src/components/layout/BottomMenu.vue +25 -21
- package/src/components/layout/Layout.vue +29 -29
- package/src/components/layout/SidebarMenu.vue +31 -27
- package/src/components/layout/TabbedLayout.vue +47 -45
- package/src/components/layout/Tabs.vue +32 -32
- package/src/components/layout/TabsBody.vue +10 -10
- package/src/components/layout/TabsNav.vue +44 -44
- package/src/components/layout/index.ts +7 -7
- package/src/components/layout/tabsManager.ts +6 -6
- package/src/index.ts +13 -8
- package/src/plugins/bagel.ts +37 -37
- package/src/plugins/modal.ts +66 -67
- package/src/styles/layout.css +5 -3
- package/src/styles/mobilLayout.css +7 -0
- package/src/types/BagelForm.ts +27 -27
- package/src/types/BtnOptions.ts +13 -13
- package/src/types/NavLink.ts +8 -8
- package/src/types/file.ts +11 -11
- package/src/types/index.ts +16 -12
- package/src/types/materialIcons.ts +3249 -3249
- package/src/utils/BagelFormUtils.ts +23 -23
- package/src/utils/allCountries.ts +11 -12
- package/src/utils/clickOutside.ts +6 -6
- package/src/utils/index.ts +39 -41
- package/src/utils/lang.ts +13 -13
- package/src/utils/strings.ts +9 -9
- package/tsconfig.json +0 -1
- package/vite.config.ts +8 -8
- package/dist/components/Popover.vue.d.ts +0 -10
- package/dist/components/Popover.vue.d.ts.map +0 -1
- package/dist/types/materialIcon.d.ts +0 -2
- package/dist/types/materialIcon.d.ts.map +0 -1
|
@@ -1,11 +1,130 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useSlots } from 'vue'
|
|
3
|
+
import {
|
|
4
|
+
BglField,
|
|
5
|
+
type BglFormSchemaT,
|
|
6
|
+
MaterialIcon,
|
|
7
|
+
keyToLabel,
|
|
8
|
+
} from '@bagelink/vue'
|
|
9
|
+
|
|
10
|
+
const props = defineProps<{
|
|
11
|
+
selecteItems?: string[]
|
|
12
|
+
data: any[]
|
|
13
|
+
schema?: BglFormSchemaT | (() => BglFormSchemaT)
|
|
14
|
+
showFields?: string[]
|
|
15
|
+
}>()
|
|
16
|
+
const emit = defineEmits(['update:selecteItems', 'orderBy', 'select'])
|
|
17
|
+
const slots = useSlots()
|
|
18
|
+
const loading = $ref(true)
|
|
19
|
+
|
|
20
|
+
let selecteItems = $ref<string[]>(props.selecteItems || [])
|
|
21
|
+
let selected = $computed({
|
|
22
|
+
get: () => selecteItems,
|
|
23
|
+
set: (value: string[]) => {
|
|
24
|
+
selecteItems = value
|
|
25
|
+
emit('update:selecteItems', value)
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
function selectElement(item: Record<string, any>) { emit('select', item) }
|
|
30
|
+
|
|
31
|
+
let sortDirection = $ref('ASC')
|
|
32
|
+
let sortField = $ref('')
|
|
33
|
+
|
|
34
|
+
function getFallbackSchema() {
|
|
35
|
+
const keys = [
|
|
36
|
+
...new Set((props.data || []).map(Object.keys).flat()),
|
|
37
|
+
] as string[]
|
|
38
|
+
const schema: BglFormSchemaT = keys.map(id => ({
|
|
39
|
+
id,
|
|
40
|
+
label: keyToLabel(id),
|
|
41
|
+
}))
|
|
42
|
+
return props.showFields
|
|
43
|
+
? schema.filter(f => props.showFields?.includes(f.id as string) || !f.id)
|
|
44
|
+
: schema
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const computedSchema = $computed(() => {
|
|
48
|
+
let _schema = props.schema
|
|
49
|
+
if (typeof _schema === 'function') {
|
|
50
|
+
_schema = _schema()
|
|
51
|
+
}
|
|
52
|
+
if (_schema) {
|
|
53
|
+
return props.showFields
|
|
54
|
+
? _schema.filter(f => props.showFields?.includes(f.id as string))
|
|
55
|
+
: _schema
|
|
56
|
+
}
|
|
57
|
+
return getFallbackSchema()
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
function transform(rowData: any) {
|
|
61
|
+
const obj: Record<string, any> = { ...rowData }
|
|
62
|
+
const fields = computedSchema.filter(f => f.id)
|
|
63
|
+
|
|
64
|
+
for (const field of fields) {
|
|
65
|
+
const fieldData = rowData[`${field.id}`]
|
|
66
|
+
|
|
67
|
+
const newFieldVal = field.transform?.(fieldData, rowData) || fieldData || ''
|
|
68
|
+
|
|
69
|
+
Object.assign(obj, {
|
|
70
|
+
[`${field.id}`]: newFieldVal
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
return obj
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const computedData = $computed(() => {
|
|
77
|
+
const dta = [...props.data].map(transform)
|
|
78
|
+
if (sortField as string) {
|
|
79
|
+
return dta.sort((a, b) => {
|
|
80
|
+
const aValue = a[sortField]
|
|
81
|
+
const bValue = b[sortField]
|
|
82
|
+
const numAValue = Number.parseInt(aValue, 10)
|
|
83
|
+
const numBValue = Number.parseInt(bValue, 10)
|
|
84
|
+
if (!Number.isNaN(numAValue) && !Number.isNaN(numBValue)) {
|
|
85
|
+
if (sortDirection === 'ASC') return numAValue - numBValue
|
|
86
|
+
return numBValue - numAValue
|
|
87
|
+
}
|
|
88
|
+
if (typeof aValue === 'string') {
|
|
89
|
+
if (sortDirection === 'ASC') return aValue.localeCompare(bValue)
|
|
90
|
+
return bValue.localeCompare(aValue)
|
|
91
|
+
}
|
|
92
|
+
if (sortDirection === 'ASC') return aValue < bValue ? -1 : 1
|
|
93
|
+
return aValue < bValue ? 1 : -1
|
|
94
|
+
})
|
|
95
|
+
}
|
|
96
|
+
return dta
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
function selectAll(event: PointerEvent) {
|
|
100
|
+
const value = (event.target as HTMLInputElement).checked
|
|
101
|
+
if (!value) {
|
|
102
|
+
selected = []
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
selected.push(...computedData.map(d => d.id))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function sort(fieldname: string) {
|
|
109
|
+
if (sortField === fieldname) {
|
|
110
|
+
if (sortDirection === 'ASC') sortDirection = 'DESC'
|
|
111
|
+
else sortField = ''
|
|
112
|
+
} else {
|
|
113
|
+
sortField = fieldname
|
|
114
|
+
sortDirection = 'ASC'
|
|
115
|
+
}
|
|
116
|
+
emit('orderBy', `${fieldname} ${sortDirection}`.trim())
|
|
117
|
+
}
|
|
118
|
+
</script>
|
|
119
|
+
|
|
1
120
|
<template>
|
|
2
121
|
<div class="table-list-wrap h-100">
|
|
3
122
|
<table class="infinite-wrapper">
|
|
4
123
|
<thead class="row first-row">
|
|
5
124
|
<th
|
|
6
|
-
class="col"
|
|
7
125
|
v-for="field in computedSchema"
|
|
8
126
|
:key="field.id"
|
|
127
|
+
class="col"
|
|
9
128
|
@click="sort(field?.id || '')"
|
|
10
129
|
>
|
|
11
130
|
<div class="flex">
|
|
@@ -22,20 +141,21 @@
|
|
|
22
141
|
</div>
|
|
23
142
|
</th>
|
|
24
143
|
</thead>
|
|
144
|
+
<!-- eslint-disable-next-line vue/no-unused-refs TODO: Can we remove the unused ref ??? -->
|
|
25
145
|
<tbody ref="infinite" class="rows infinite" :class="{ loading }">
|
|
26
146
|
<tr
|
|
27
147
|
v-for="row in computedData"
|
|
28
148
|
:key="row.id"
|
|
29
|
-
@click="selectElement(row)"
|
|
30
149
|
class="row row-item position-relative"
|
|
150
|
+
@click="selectElement(row)"
|
|
31
151
|
>
|
|
32
152
|
<td
|
|
33
|
-
class="col"
|
|
34
153
|
v-for="field in computedSchema.map((c) => ({
|
|
35
154
|
...c,
|
|
36
155
|
transform: undefined,
|
|
37
156
|
}))"
|
|
38
157
|
:key="`${field.id}-${row.id}`"
|
|
158
|
+
class="col"
|
|
39
159
|
>
|
|
40
160
|
<slot
|
|
41
161
|
v-if="field.id && slots[field.id]"
|
|
@@ -58,116 +178,6 @@
|
|
|
58
178
|
</div>
|
|
59
179
|
</template>
|
|
60
180
|
|
|
61
|
-
<script setup lang="ts">
|
|
62
|
-
import { useSlots } from 'vue';
|
|
63
|
-
import {
|
|
64
|
-
type BglFormSchemaT,
|
|
65
|
-
MaterialIcon,
|
|
66
|
-
BglField,
|
|
67
|
-
keyToLabel,
|
|
68
|
-
} from '@bagelink/vue';
|
|
69
|
-
|
|
70
|
-
const slots = useSlots();
|
|
71
|
-
const loading = $ref(true);
|
|
72
|
-
|
|
73
|
-
const props = defineProps<{
|
|
74
|
-
selecteItems?: string[];
|
|
75
|
-
data: any[];
|
|
76
|
-
schema?: BglFormSchemaT | (() => BglFormSchemaT);
|
|
77
|
-
showFields?: string[];
|
|
78
|
-
}>();
|
|
79
|
-
|
|
80
|
-
const emit = defineEmits(['update:selecteItems', 'orderBy', 'select']);
|
|
81
|
-
|
|
82
|
-
let selecteItems = $ref<string[]>(props.selecteItems || []);
|
|
83
|
-
let selected = $computed({
|
|
84
|
-
get: () => selecteItems,
|
|
85
|
-
set: (value: string[]) => {
|
|
86
|
-
selecteItems = value;
|
|
87
|
-
emit('update:selecteItems', value);
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
function selectAll(event: PointerEvent) {
|
|
92
|
-
const value = (event.target as HTMLInputElement).checked;
|
|
93
|
-
if (!value) {
|
|
94
|
-
selected = [];
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
selected.push(...computedData.map((d) => d.id));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const computedSchema = $computed(() => {
|
|
101
|
-
if (typeof props.schema === 'function') {
|
|
102
|
-
return props.schema();
|
|
103
|
-
}
|
|
104
|
-
if (props.schema) {
|
|
105
|
-
return props.showFields
|
|
106
|
-
? props.schema.filter((f) => props.showFields?.includes(f.id as string))
|
|
107
|
-
: props.schema;
|
|
108
|
-
}
|
|
109
|
-
const keys = [
|
|
110
|
-
...new Set((props.data || []).map(Object.keys).flat()),
|
|
111
|
-
] as string[];
|
|
112
|
-
const schema: BglFormSchemaT = keys.map((id) => ({
|
|
113
|
-
id,
|
|
114
|
-
label: keyToLabel(id),
|
|
115
|
-
}));
|
|
116
|
-
return props.showFields
|
|
117
|
-
? schema.filter((f) => props.showFields?.includes(f.id as string) || !f.id)
|
|
118
|
-
: schema;
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const selectElement = (item: Record<string, any>) => emit('select', item);
|
|
122
|
-
|
|
123
|
-
let sortDirection = $ref('ASC');
|
|
124
|
-
let sortField = $ref('');
|
|
125
|
-
|
|
126
|
-
const sort = (fieldname: string) => {
|
|
127
|
-
if (sortField === fieldname) {
|
|
128
|
-
if (sortDirection === 'ASC') sortDirection = 'DESC';
|
|
129
|
-
else sortField = '';
|
|
130
|
-
} else {
|
|
131
|
-
sortField = fieldname;
|
|
132
|
-
sortDirection = 'ASC';
|
|
133
|
-
}
|
|
134
|
-
emit('orderBy', `${fieldname} ${sortDirection}`.trim());
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
const transform = (rowData: any) => {
|
|
138
|
-
const obj: Record<string, any> = { ...rowData };
|
|
139
|
-
for (const field of computedSchema.filter((f) => f.id)) {
|
|
140
|
-
const fieldData = rowData[field.id as string];
|
|
141
|
-
obj[field.id as string] =
|
|
142
|
-
field.transform?.(fieldData, rowData) || fieldData || '';
|
|
143
|
-
}
|
|
144
|
-
return obj;
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const computedData = $computed(() => {
|
|
148
|
-
const dta = [...props.data].map(transform);
|
|
149
|
-
if (sortField) {
|
|
150
|
-
return dta.sort((a, b) => {
|
|
151
|
-
const aValue = a[sortField];
|
|
152
|
-
const bValue = b[sortField];
|
|
153
|
-
const numAValue = parseInt(aValue);
|
|
154
|
-
const numBValue = parseInt(bValue);
|
|
155
|
-
if (!isNaN(numAValue) && !isNaN(numBValue)) {
|
|
156
|
-
if (sortDirection === 'ASC') return numAValue - numBValue;
|
|
157
|
-
return numBValue - numAValue;
|
|
158
|
-
}
|
|
159
|
-
if (typeof aValue === 'string') {
|
|
160
|
-
if (sortDirection === 'ASC') return aValue.localeCompare(bValue);
|
|
161
|
-
return bValue.localeCompare(aValue);
|
|
162
|
-
}
|
|
163
|
-
if (sortDirection === 'ASC') return aValue < bValue ? -1 : 1;
|
|
164
|
-
return aValue < bValue ? 1 : -1;
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
return dta;
|
|
168
|
-
});
|
|
169
|
-
</script>
|
|
170
|
-
|
|
171
181
|
<style scoped>
|
|
172
182
|
.list-arrows {
|
|
173
183
|
opacity: 0;
|
|
@@ -247,6 +257,9 @@ th {
|
|
|
247
257
|
line-height: 1;
|
|
248
258
|
align-items: center;
|
|
249
259
|
}
|
|
260
|
+
.col:has(.bagel-input) {
|
|
261
|
+
padding: 0rem;
|
|
262
|
+
}
|
|
250
263
|
|
|
251
264
|
.col > div {
|
|
252
265
|
display: flex;
|
package/src/components/Title.vue
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<component :is="tag">
|
|
3
|
-
{{ label || value }}
|
|
4
|
-
<slot />
|
|
5
|
-
</component>
|
|
6
|
-
</template>
|
|
7
|
-
|
|
8
1
|
<script lang="ts" setup>
|
|
9
2
|
defineProps({
|
|
10
3
|
value: {
|
|
@@ -19,5 +12,12 @@ defineProps({
|
|
|
19
12
|
type: String,
|
|
20
13
|
default: 'h1',
|
|
21
14
|
},
|
|
22
|
-
})
|
|
15
|
+
})
|
|
23
16
|
</script>
|
|
17
|
+
|
|
18
|
+
<template>
|
|
19
|
+
<component :is="tag">
|
|
20
|
+
{{ label || value }}
|
|
21
|
+
<slot />
|
|
22
|
+
</component>
|
|
23
|
+
</template>
|
|
@@ -1,3 +1,106 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { onMounted, onUnmounted } from 'vue'
|
|
3
|
+
import {
|
|
4
|
+
Area,
|
|
5
|
+
Chart,
|
|
6
|
+
Grid,
|
|
7
|
+
Line,
|
|
8
|
+
Marker,
|
|
9
|
+
Tooltip,
|
|
10
|
+
} from 'vue3-charts'
|
|
11
|
+
import type { ChartAxis, Data } from 'vue3-charts/dist/types'
|
|
12
|
+
|
|
13
|
+
const props = defineProps<{ data: Data[], locale: string }>()
|
|
14
|
+
|
|
15
|
+
const data = $computed(() => (props.locale === 'he' ? [...props.data].reverse() : props.data))
|
|
16
|
+
|
|
17
|
+
interface Size {
|
|
18
|
+
width: number
|
|
19
|
+
height: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Computed properties
|
|
23
|
+
const meanValue = $computed(() => {
|
|
24
|
+
const sum = props.data.reduce((acc, curr) => acc + +curr.total_value, 0)
|
|
25
|
+
return sum / props.data.length
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
const axisConfig = $computed<ChartAxis>(() => ({
|
|
29
|
+
primary: {
|
|
30
|
+
type: 'band',
|
|
31
|
+
rotate: true,
|
|
32
|
+
ticks: 5,
|
|
33
|
+
domain: ['dataMin', 'dataMax'],
|
|
34
|
+
tickValues:
|
|
35
|
+
props.data.length > 100 ? [''] : props.data.map((d: any) => d.date),
|
|
36
|
+
},
|
|
37
|
+
secondary: {
|
|
38
|
+
domain: ['dataMin', 'dataMax * 1.05'],
|
|
39
|
+
type: 'linear',
|
|
40
|
+
ticks: 8,
|
|
41
|
+
},
|
|
42
|
+
}))
|
|
43
|
+
|
|
44
|
+
// Constants
|
|
45
|
+
const BRAND_COLOR = 'var(--bgl-primary)'
|
|
46
|
+
|
|
47
|
+
const tooltipConfiguration = {
|
|
48
|
+
date: { label: 'תאריך' },
|
|
49
|
+
total_value: {
|
|
50
|
+
color: BRAND_COLOR,
|
|
51
|
+
label: 'סכום',
|
|
52
|
+
format: (v: number) => `₪${v.toLocaleString() || ''}`,
|
|
53
|
+
},
|
|
54
|
+
total_count: {
|
|
55
|
+
label: 'מספר התרומות',
|
|
56
|
+
format: (v: number) => `${v.toLocaleString() || ''}`,
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Refs
|
|
61
|
+
let chartSize = $ref<Size | null>(null)
|
|
62
|
+
const chartContainer = $ref<HTMLElement>()
|
|
63
|
+
const displayMarker = $ref(true)
|
|
64
|
+
const chartMargin = $ref({
|
|
65
|
+
left: 0,
|
|
66
|
+
top: 0,
|
|
67
|
+
right: 0,
|
|
68
|
+
bottom: 0,
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// Functions
|
|
72
|
+
function adjustChartSize() {
|
|
73
|
+
chartSize = null
|
|
74
|
+
const el = chartContainer
|
|
75
|
+
if (!el) return
|
|
76
|
+
const { width, height } = el.getBoundingClientRect()
|
|
77
|
+
chartSize = { width: width - 5, height: height - 10 }
|
|
78
|
+
console.log(chartSize)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function handleResize() {
|
|
82
|
+
setTimeout(adjustChartSize, 300)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Lifecycle hooks
|
|
86
|
+
onMounted(() => {
|
|
87
|
+
adjustChartSize()
|
|
88
|
+
window.addEventListener('resize', handleResize)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
onUnmounted(() => {
|
|
92
|
+
window.removeEventListener('resize', handleResize)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
// Style Configurations
|
|
96
|
+
function dotStyling(ctx: Record<string, any>) {
|
|
97
|
+
return {
|
|
98
|
+
r: ctx.active ? 5 : 1,
|
|
99
|
+
fill: BRAND_COLOR,
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
</script>
|
|
103
|
+
|
|
1
104
|
<template>
|
|
2
105
|
<div
|
|
3
106
|
ref="chartContainer"
|
|
@@ -64,102 +167,6 @@
|
|
|
64
167
|
</div>
|
|
65
168
|
</template>
|
|
66
169
|
|
|
67
|
-
<script lang="ts" setup>
|
|
68
|
-
import { onMounted, onUnmounted } from 'vue';
|
|
69
|
-
import {
|
|
70
|
-
Chart, Grid, Line, Area, Tooltip, Marker,
|
|
71
|
-
} from 'vue3-charts';
|
|
72
|
-
import type { ChartAxis, Data } from 'vue3-charts/dist/types';
|
|
73
|
-
|
|
74
|
-
const props = defineProps<{ data: Data[]; locale: string }>();
|
|
75
|
-
|
|
76
|
-
const data = $computed(() => (props.locale === 'he' ? [...props.data].reverse() : props.data));
|
|
77
|
-
|
|
78
|
-
interface Size {
|
|
79
|
-
width: number;
|
|
80
|
-
height: number;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Computed properties
|
|
84
|
-
const meanValue = $computed(() => {
|
|
85
|
-
const sum = props.data.reduce((acc, curr) => acc + +curr.total_value, 0);
|
|
86
|
-
return sum / props.data.length;
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
const axisConfig = $computed<ChartAxis>(() => ({
|
|
90
|
-
primary: {
|
|
91
|
-
type: 'band',
|
|
92
|
-
rotate: true,
|
|
93
|
-
ticks: 5,
|
|
94
|
-
domain: ['dataMin', 'dataMax'],
|
|
95
|
-
tickValues:
|
|
96
|
-
props.data?.length > 100 ? [''] : props.data.map((d: any) => d.date),
|
|
97
|
-
},
|
|
98
|
-
secondary: {
|
|
99
|
-
domain: ['dataMin', 'dataMax * 1.05'],
|
|
100
|
-
type: 'linear',
|
|
101
|
-
ticks: 8,
|
|
102
|
-
},
|
|
103
|
-
}));
|
|
104
|
-
|
|
105
|
-
// Constants
|
|
106
|
-
const BRAND_COLOR = 'var(--bgl-primary)';
|
|
107
|
-
|
|
108
|
-
const tooltipConfiguration = {
|
|
109
|
-
date: { label: 'תאריך' },
|
|
110
|
-
total_value: {
|
|
111
|
-
color: BRAND_COLOR,
|
|
112
|
-
label: 'סכום',
|
|
113
|
-
format: (v: number) => `₪${v?.toLocaleString?.() || ''}`,
|
|
114
|
-
},
|
|
115
|
-
total_count: {
|
|
116
|
-
label: 'מספר התרומות',
|
|
117
|
-
format: (v: number) => `${v?.toLocaleString?.() || ''}`,
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// Refs
|
|
122
|
-
let chartSize = $ref<Size | null>(null);
|
|
123
|
-
const chartContainer = $ref<HTMLElement>();
|
|
124
|
-
const displayMarker = $ref(true);
|
|
125
|
-
const chartMargin = $ref({
|
|
126
|
-
left: 0,
|
|
127
|
-
top: 0,
|
|
128
|
-
right: 0,
|
|
129
|
-
bottom: 0,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
// Functions
|
|
133
|
-
const adjustChartSize = () => {
|
|
134
|
-
chartSize = null;
|
|
135
|
-
const el = chartContainer;
|
|
136
|
-
if (!el) return;
|
|
137
|
-
const { width, height } = el.getBoundingClientRect();
|
|
138
|
-
chartSize = { width: width - 5, height: height - 10 };
|
|
139
|
-
console.log(chartSize);
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
const handleResize = () => {
|
|
143
|
-
setTimeout(adjustChartSize, 300);
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
// Lifecycle hooks
|
|
147
|
-
onMounted(() => {
|
|
148
|
-
adjustChartSize();
|
|
149
|
-
window.addEventListener('resize', handleResize);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
onUnmounted(() => {
|
|
153
|
-
window.removeEventListener('resize', handleResize);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
// Style Configurations
|
|
157
|
-
const dotStyling = (ctx: Record<string, any>) => ({
|
|
158
|
-
r: ctx.active ? 5 : 1,
|
|
159
|
-
fill: BRAND_COLOR,
|
|
160
|
-
});
|
|
161
|
-
</script>
|
|
162
|
-
|
|
163
170
|
<style>
|
|
164
171
|
.chart-line {
|
|
165
172
|
width: 100%;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default as Lineart } from './Lineart.vue'
|
|
1
|
+
export { default as Lineart } from './Lineart.vue'
|
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<component
|
|
3
|
-
:required="field.required"
|
|
4
|
-
v-bind="bindAttrs(field?.attrs || {}, fieldData, modelValue)"
|
|
5
|
-
:class="classify(fieldData, modelValue, field.class, field.attrs?.class)"
|
|
6
|
-
v-if="vIf"
|
|
7
|
-
:is="is"
|
|
8
|
-
:label="field.label"
|
|
9
|
-
:id="field.id"
|
|
10
|
-
:placeholder="field.placeholder || field.label"
|
|
11
|
-
v-model="fieldData"
|
|
12
|
-
:defaultValue="field.defaultValue"
|
|
13
|
-
:disabled="field.disabled"
|
|
14
|
-
:options="
|
|
15
|
-
bindAttrs({ options: field.options }, fieldData, modelValue).options
|
|
16
|
-
"
|
|
17
|
-
:helptext="field.helptext"
|
|
18
|
-
@update:modelValue="($event: any) => field?.onUpdate?.($event, formData)"
|
|
19
|
-
>
|
|
20
|
-
{{ field.transform?.(fieldData, modelValue) || fieldData || '' }}
|
|
21
|
-
<BglField
|
|
22
|
-
v-model="formData"
|
|
23
|
-
v-for="(child, ii) in field.children"
|
|
24
|
-
:key="child.id || ii"
|
|
25
|
-
:field="child"
|
|
26
|
-
/>
|
|
27
|
-
</component>
|
|
28
|
-
</template>
|
|
29
|
-
|
|
30
1
|
<script lang="ts" setup>
|
|
31
2
|
import {
|
|
3
|
+
CheckInput,
|
|
32
4
|
type Field,
|
|
33
|
-
|
|
34
|
-
classify,
|
|
5
|
+
RichText,
|
|
35
6
|
SelectInput,
|
|
36
7
|
TextInput,
|
|
37
8
|
ToggleInput,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
} from '@bagelink/vue'
|
|
9
|
+
bindAttrs,
|
|
10
|
+
classify,
|
|
11
|
+
} from '@bagelink/vue'
|
|
41
12
|
|
|
42
13
|
const props = withDefaults(
|
|
43
14
|
defineProps<{
|
|
44
|
-
field: Field
|
|
45
|
-
modelValue: Record<string, any
|
|
15
|
+
field: Field
|
|
16
|
+
modelValue: Record<string, any>
|
|
46
17
|
}>(),
|
|
47
18
|
{
|
|
48
19
|
modelValue: () => ({}),
|
|
49
20
|
},
|
|
50
|
-
)
|
|
21
|
+
)
|
|
51
22
|
|
|
52
|
-
const
|
|
53
|
-
if (props.field.$el === 'text') return TextInput;
|
|
54
|
-
if (props.field.$el === 'select') return SelectInput;
|
|
55
|
-
if (props.field.$el === 'toggle') return ToggleInput;
|
|
56
|
-
if (props.field.$el === 'check') return CheckInput;
|
|
57
|
-
if (props.field.$el === 'richtext') return RichText;
|
|
58
|
-
return props.field.$el || 'div';
|
|
59
|
-
});
|
|
23
|
+
const emit = defineEmits(['update:modelValue'])
|
|
60
24
|
|
|
61
|
-
const
|
|
25
|
+
const is = $computed(() => {
|
|
26
|
+
if (props.field.$el === 'text') return TextInput
|
|
27
|
+
if (props.field.$el === 'select') return SelectInput
|
|
28
|
+
if (props.field.$el === 'toggle') return ToggleInput
|
|
29
|
+
if (props.field.$el === 'check') return CheckInput
|
|
30
|
+
if (props.field.$el === 'richtext') return RichText
|
|
31
|
+
return props.field.$el || 'div'
|
|
32
|
+
})
|
|
62
33
|
|
|
63
34
|
const formData = $computed({
|
|
64
35
|
get: () => props.modelValue,
|
|
65
|
-
set: (val: any) => emit('update:modelValue', val),
|
|
66
|
-
})
|
|
36
|
+
set: (val: any) => { emit('update:modelValue', val) },
|
|
37
|
+
})
|
|
67
38
|
|
|
68
39
|
const fieldData = $computed({
|
|
69
40
|
set: (val: any) => {
|
|
70
|
-
if (!props.field.id) return
|
|
71
|
-
const data = { ...props.modelValue } || {}
|
|
72
|
-
data[props.field.id] = val
|
|
73
|
-
emit('update:modelValue', data)
|
|
41
|
+
if (!props.field.id) return
|
|
42
|
+
const data = { ...props.modelValue } || {}
|
|
43
|
+
data[props.field.id] = val
|
|
44
|
+
emit('update:modelValue', data)
|
|
74
45
|
},
|
|
75
46
|
get: () => {
|
|
76
|
-
if (props.field.id) return props.modelValue[props.field.id]
|
|
77
|
-
return props.field.defaultValue || ''
|
|
47
|
+
if (props.field.id) return props.modelValue[props.field.id]
|
|
48
|
+
return props.field.defaultValue || ''
|
|
78
49
|
},
|
|
79
|
-
})
|
|
50
|
+
})
|
|
80
51
|
|
|
81
52
|
const vIf = $computed(() => {
|
|
82
|
-
if (props.field['v-if'] === undefined) return true
|
|
83
|
-
if (typeof props.field['v-if'] === 'boolean') return props.field['v-if']
|
|
84
|
-
if (typeof props.field['v-if'] === 'string') return true
|
|
53
|
+
if (props.field['v-if'] === undefined) return true
|
|
54
|
+
if (typeof props.field['v-if'] === 'boolean') return props.field['v-if']
|
|
55
|
+
if (typeof props.field['v-if'] === 'string') return true
|
|
85
56
|
if (typeof props.field['v-if'] === 'function') {
|
|
86
|
-
return props.field['v-if']
|
|
57
|
+
return props.field['v-if'](fieldData, formData)
|
|
87
58
|
}
|
|
88
|
-
return true
|
|
89
|
-
})
|
|
59
|
+
return true
|
|
60
|
+
})
|
|
90
61
|
</script>
|
|
62
|
+
|
|
63
|
+
<template>
|
|
64
|
+
<component
|
|
65
|
+
v-bind="bindAttrs(field?.attrs || {}, fieldData, modelValue)"
|
|
66
|
+
:is="is"
|
|
67
|
+
v-if="vIf"
|
|
68
|
+
:id="field.id"
|
|
69
|
+
v-model="fieldData"
|
|
70
|
+
:required="field.required"
|
|
71
|
+
:class="classify(fieldData, modelValue, field.class, field.attrs?.class)"
|
|
72
|
+
:label="field.label"
|
|
73
|
+
:placeholder="field.placeholder || field.label"
|
|
74
|
+
:defaultValue="field.defaultValue"
|
|
75
|
+
:disabled="field.disabled"
|
|
76
|
+
:options="
|
|
77
|
+
bindAttrs({ options: field.options }, fieldData, modelValue).options
|
|
78
|
+
"
|
|
79
|
+
:helptext="field.helptext"
|
|
80
|
+
@update:modelValue="($event: any) => field?.onUpdate?.($event, formData)"
|
|
81
|
+
>
|
|
82
|
+
{{ field.transform?.(fieldData, modelValue) || fieldData || '' }}
|
|
83
|
+
<BglField
|
|
84
|
+
v-for="(child, ii) in field.children"
|
|
85
|
+
:key="child.id || ii"
|
|
86
|
+
v-model="formData"
|
|
87
|
+
:field="child"
|
|
88
|
+
/>
|
|
89
|
+
</component>
|
|
90
|
+
</template>
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { defineExpose } from 'vue'
|
|
3
|
+
|
|
4
|
+
const fieldSet = $ref<HTMLFieldSetElement | null>(null)
|
|
5
|
+
const isDirty = $ref(false)
|
|
6
|
+
const validateForm = () => fieldSet?.reportValidity()
|
|
7
|
+
defineExpose({ validateForm, isDirty })
|
|
8
|
+
</script>
|
|
9
|
+
|
|
1
10
|
<template>
|
|
2
11
|
<fieldset ref="fieldSet">
|
|
3
12
|
<slot />
|
|
4
13
|
</fieldset>
|
|
5
14
|
</template>
|
|
6
|
-
<script lang="ts" setup>
|
|
7
|
-
import { defineExpose } from 'vue';
|
|
8
|
-
|
|
9
|
-
const fieldSet = $ref<HTMLFieldSetElement | null>(null);
|
|
10
|
-
const isDirty = $ref(false);
|
|
11
|
-
const validateForm = () => fieldSet?.reportValidity?.();
|
|
12
|
-
defineExpose({ validateForm, isDirty });
|
|
13
|
-
</script>
|