@bagelink/vue 0.0.22 → 0.0.32

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 (82) hide show
  1. package/package.json +32 -9
  2. package/src/components/Btn.vue +221 -0
  3. package/src/components/Comments.vue +265 -0
  4. package/src/components/ContactArray.vue +127 -0
  5. package/src/components/ContactSubmissions.vue +42 -0
  6. package/src/components/DataPreview.vue +72 -0
  7. package/src/components/DropDown.vue +122 -0
  8. package/src/components/FileUploader.vue +344 -0
  9. package/src/components/FormKitTable.vue +250 -0
  10. package/src/components/FormSchema.vue +65 -0
  11. package/src/components/LangText.vue +30 -0
  12. package/src/components/ListItem.vue +16 -0
  13. package/src/components/ListView.vue +39 -0
  14. package/src/components/MaterialIcon.vue +16 -0
  15. package/src/components/Modal.vue +50 -0
  16. package/src/components/ModalForm.vue +94 -0
  17. package/src/components/NavBar.vue +343 -0
  18. package/src/components/PageTitle.vue +17 -0
  19. package/src/components/PersonPreview.vue +205 -0
  20. package/src/components/PersonPreviewFormkit.vue +205 -0
  21. package/src/components/RTXEditor.vue +147 -0
  22. package/src/components/RouterWrapper.vue +9 -0
  23. package/src/components/TabbedLayout.vue +80 -0
  24. package/src/components/TableSchema.vue +213 -0
  25. package/src/components/TopBar.vue +5 -0
  26. package/src/components/charts/BarChart.vue +290 -0
  27. package/src/components/dashboard/Lineart.vue +165 -0
  28. package/src/components/form/ItemRef.vue +38 -0
  29. package/src/components/form/MaterialIcon.vue +19 -0
  30. package/src/components/form/PlainInputField.vue +80 -0
  31. package/src/components/form/inputs/CheckInput.vue +143 -0
  32. package/src/components/form/inputs/Checkbox.vue +69 -0
  33. package/src/components/form/inputs/ColorPicker.vue +37 -0
  34. package/src/components/form/inputs/CurrencyInput.vue +133 -0
  35. package/src/components/form/inputs/DateInput.vue +49 -0
  36. package/src/components/form/inputs/DatetimeInput.vue +46 -0
  37. package/src/components/form/inputs/DurationInput.vue +51 -0
  38. package/src/components/form/inputs/DynamicLinkField.vue +140 -0
  39. package/src/components/form/inputs/EmailInput.vue +53 -0
  40. package/src/components/form/inputs/FloatInput.vue +48 -0
  41. package/src/components/form/inputs/IntInput.vue +49 -0
  42. package/src/components/form/inputs/JSONInput.vue +51 -0
  43. package/src/components/form/inputs/LinkField.vue +293 -0
  44. package/src/components/form/inputs/Password.vue +89 -0
  45. package/src/components/form/inputs/PasswordInput.vue +89 -0
  46. package/src/components/form/inputs/PlainText.vue +52 -0
  47. package/src/components/form/inputs/ReadOnlyInput.vue +24 -0
  48. package/src/components/form/inputs/RichTextEditor.vue +54 -0
  49. package/src/components/form/inputs/SelectField.vue +253 -0
  50. package/src/components/form/inputs/TableField.vue +321 -0
  51. package/src/components/form/inputs/TextArea.vue +70 -0
  52. package/src/components/form/inputs/TextInput.vue +53 -0
  53. package/src/components/form/inputs/index.ts +17 -0
  54. package/src/components/formkit/AddressArray.vue +240 -0
  55. package/src/components/formkit/BankDetailsArray.vue +265 -0
  56. package/src/components/formkit/ContactArrayFormKit.vue +151 -0
  57. package/src/components/formkit/FileUploader.vue +391 -0
  58. package/src/components/formkit/MiscFields.vue +69 -0
  59. package/src/components/formkit/Toggle.vue +160 -0
  60. package/src/components/formkit/index.ts +29 -0
  61. package/src/components/index.ts +20 -0
  62. package/src/components/whatsapp/form/MsgTemplate.vue +220 -0
  63. package/src/components/whatsapp/form/TextVariableExamples.vue +74 -0
  64. package/src/components/whatsapp/interfaces.ts +58 -0
  65. package/src/index.ts +1 -26
  66. package/src/plugins/bagel.ts +26 -0
  67. package/src/styles/modal.css +90 -0
  68. package/src/types/BagelField.ts +57 -0
  69. package/src/types/BtnOptions.ts +14 -0
  70. package/src/types/Person.ts +51 -0
  71. package/src/types/file.ts +12 -0
  72. package/src/types/index.ts +4 -0
  73. package/src/types/materialIcons.d.ts +3005 -0
  74. package/src/utils/index.ts +57 -0
  75. package/src/utils/modal.ts +95 -0
  76. package/src/utils/objects.ts +81 -0
  77. package/src/utils/strings.ts +29 -0
  78. package/dist/index.cjs +0 -23
  79. package/dist/index.d.cts +0 -12
  80. package/dist/index.d.mts +0 -12
  81. package/dist/index.d.ts +0 -12
  82. package/dist/index.mjs +0 -19
@@ -0,0 +1,343 @@
1
+ <template>
2
+ <div :class="{ open: isOpen, closed: !isOpen }">
3
+ <slot name="top" />
4
+ <div
5
+ class="nav-expend" @click="isOpen = !isOpen" @keypress.enter="isOpen = !isOpen" role="button"
6
+ aria-label="Toggle Navigation" tabindex="0"
7
+ >
8
+ <div class="icon-font top-arrow">
9
+ chevron_right
10
+ </div>
11
+ </div>
12
+
13
+ <div class="full-nav">
14
+ <div class="nav-scroll">
15
+ <div class="nav-links-wrapper">
16
+ <RouterLink v-for="link in links" class="nav-button" :to="link.to" :key="link.label">
17
+ <div class="icon-font">
18
+ {{ link.materialIcon }}
19
+ </div>
20
+ <div class="tooltip">
21
+ {{ link.localized ? link.localized : link.label }}
22
+ </div>
23
+ </RouterLink>
24
+ </div>
25
+ </div>
26
+
27
+ <div class="bot-buttons-wrapper">
28
+ <slot name="floor" />
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </template>
33
+
34
+ <script lang="ts" setup>
35
+
36
+ // import LangText from "../translation/LangText.vue"
37
+ import type { MaterialIcons } from '@/types/materialIcons';
38
+
39
+ const isOpen = $ref(true);
40
+
41
+ withDefaults(
42
+ defineProps<{
43
+ links?: { label: string; to: string; materialIcon: MaterialIcons, localized?: string }[];
44
+ homeIcon?: MaterialIcons;
45
+ homeLabel?: string;
46
+ homeTo?: string;
47
+ }>(),
48
+ {
49
+ homeIcon: 'home',
50
+ homeLabel: 'Home',
51
+ homeTo: '/',
52
+ },
53
+ );
54
+ </script>
55
+
56
+ <style>
57
+ [dir='rtl'] .top-arrow {
58
+ transform: rotate(180deg);
59
+ }
60
+
61
+ .nav-expend {
62
+ text-align: center;
63
+ cursor: pointer;
64
+ background: var(--bgl-white);
65
+ color: var(--bgl-blue);
66
+ display: flex;
67
+ border-radius: 100%;
68
+ font-size: 13px;
69
+ box-shadow: 0 0 50px 0 var(--bgl-shadow);
70
+ height: 22px;
71
+ width: 22px;
72
+ align-items: center;
73
+ justify-content: center;
74
+ position: absolute;
75
+ top: 82px;
76
+ box-sizing: border-box;
77
+ padding-inline-start: 2px;
78
+ margin-inline-start: 55px;
79
+ transition: all 0.4s cubic-bezier(0.36, 0.02, 0.23, 1);
80
+ }
81
+
82
+ .nav-home-wrapper {
83
+ /* margin-bottom: 30px; */
84
+ }
85
+
86
+ .nav-expend {
87
+ background: white;
88
+ }
89
+
90
+ .nav-expend:hover {
91
+ filter: brightness(95%);
92
+ box-shadow: 0 0 20px 0 var(--bgl-blue-tint);
93
+ }
94
+
95
+ .nav-expend:active {
96
+ filter: var(--bgl-active-filter);
97
+ }
98
+
99
+ .nav {
100
+ color: var(--bgl-white);
101
+ background: var(--bgl-blue);
102
+ z-index: 100;
103
+ width: 70px;
104
+ transition: all 0.4s cubic-bezier(0.36, 0.02, 0.23, 1);
105
+ display: flex;
106
+ flex-direction: column;
107
+ }
108
+
109
+ .nav * {
110
+ user-select: none;
111
+ }
112
+
113
+ .nav-button {
114
+ text-decoration: none;
115
+ cursor: pointer;
116
+ display: flex;
117
+ text-align: start;
118
+ align-items: center;
119
+ position: relative;
120
+ color: var(--bgl-white);
121
+ transition: all 0.2s ease;
122
+ pointer-events: none;
123
+ }
124
+
125
+ .nav-button:hover {
126
+ width: fit-content;
127
+ pointer-events: all;
128
+ }
129
+
130
+ .nav-button .icon-font {
131
+ font-size: 22px;
132
+ margin: 0.25rem 10px;
133
+ padding: 10px;
134
+ width: 50px;
135
+ text-align: center;
136
+ height: 45px;
137
+ flex-grow: 0;
138
+ flex-shrink: 0;
139
+ border-radius: 10px;
140
+ transition: all 0.2s ease;
141
+ pointer-events: all;
142
+ }
143
+
144
+ .nav-button:hover .icon-font,
145
+ .nav-button.router-link-active .icon-font {
146
+ background: var(--bgl-white);
147
+ color: var(--bgl-blue);
148
+ }
149
+
150
+ .nav-button:hover .tooltip {
151
+ opacity: 1;
152
+ pointer-events: all;
153
+ }
154
+
155
+ .tooltip {
156
+ background-color: var(--bgl-white);
157
+ color: var(--bgl-blue);
158
+ line-height: 1;
159
+ padding: 0.5rem;
160
+ border-radius: 10px;
161
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
162
+ transition: all 0.2s ease;
163
+ border: 5px solid transparent;
164
+ white-space: nowrap;
165
+ pointer-events: none;
166
+ opacity: 0;
167
+ margin-inline-start: 1rem;
168
+ }
169
+
170
+ .tooltip:hover {
171
+ filter: brightness(95%);
172
+ }
173
+
174
+ .tooltip:active {
175
+ filter: brightness(90%);
176
+ }
177
+
178
+ .bot-buttons-wrapper {
179
+ margin-top: auto;
180
+ width: 100%;
181
+ }
182
+
183
+ .nav-links-wrapper {
184
+ direction: ltr;
185
+ }
186
+
187
+ [dir='rtl'] .nav-links-wrapper {
188
+ direction: rtl;
189
+ }
190
+
191
+ .nav-scroll {
192
+ overflow-y: scroll;
193
+ width: 50vw;
194
+ direction: rtl;
195
+ text-align: end;
196
+ margin-inline-end: -7px;
197
+ pointer-events: none;
198
+ display: flex;
199
+ flex-direction: column;
200
+ }
201
+
202
+ .nav::-webkit-scrollbar-thumb {
203
+ background-color: transparent;
204
+ }
205
+
206
+ .nav:hover::-webkit-scrollbar-thumb {
207
+ background-color: var(--bgl-gray);
208
+ }
209
+
210
+ [dir='rtl'] .nav-scroll {
211
+ direction: ltr;
212
+ }
213
+
214
+ .full-nav {
215
+ height: 100%;
216
+ display: flex;
217
+ flex-direction: column;
218
+ }
219
+
220
+ @media screen and (min-width: 910px) {
221
+ .nav.open .nav-expend {
222
+ margin-inline-start: 189px;
223
+ transform: rotate(180deg);
224
+ }
225
+
226
+ .nav.open {
227
+ width: 200px;
228
+ text-align: start;
229
+ }
230
+
231
+ .nav.open .tooltip {
232
+ background-color: transparent;
233
+ color: var(--bgl-white);
234
+ padding: 0;
235
+ box-shadow: none;
236
+ pointer-events: all;
237
+ opacity: 1;
238
+ margin-inline-start: 0rem;
239
+ }
240
+
241
+ .nav.open .nav-button .icon-font {
242
+ margin: 0;
243
+ background: transparent;
244
+ }
245
+
246
+ .nav.open .nav-button {
247
+ width: 180px;
248
+ border-radius: 10px;
249
+ margin-inline-start: 10px;
250
+ margin-top: 10px;
251
+ margin-bottom: 10px;
252
+ }
253
+
254
+ .nav.open .nav-button:hover,
255
+ .nav.open .nav-button.router-link-active {
256
+ background: var(--bgl-white);
257
+ color: var(--bgl-blue);
258
+ }
259
+
260
+ .nav.open .nav-button:hover,
261
+ .nav.open .nav-button:hover .tooltip,
262
+ .nav.open .nav-button.router-link-active .tooltip {
263
+ color: var(--bgl-blue);
264
+ }
265
+ }
266
+
267
+ @media screen and (max-width: 910px) {
268
+ .full-nav {
269
+ height: auto;
270
+ display: flex;
271
+ flex-direction: row;
272
+ width: calc(100vw - 70px);
273
+ position: absolute;
274
+ inset-inline-end: 0;
275
+ overflow-x: auto;
276
+ }
277
+
278
+ .nav.open {
279
+ width: initial;
280
+ }
281
+
282
+ .nav {
283
+ width: auto;
284
+ display: flex;
285
+ flex-direction: row;
286
+ margin: 0;
287
+ overflow-x: auto;
288
+ justify-content: flex-start;
289
+ }
290
+
291
+ .tooltip {
292
+ opacity: 1;
293
+ background: transparent;
294
+ color: var(--bgl-white);
295
+ box-shadow: none;
296
+ font-size: 10px;
297
+ padding: 0;
298
+ margin: 0;
299
+ }
300
+
301
+ .nav-button {
302
+ flex-direction: column;
303
+ margin: 12px 0.25rem;
304
+ }
305
+
306
+ .nav-button .icon-font {
307
+ padding: 2px 0 0 0;
308
+ margin: 0;
309
+ height: 30px;
310
+ width: 30px;
311
+ }
312
+
313
+ .nav-links-wrapper {
314
+ display: flex;
315
+ }
316
+
317
+ .bot-buttons-wrapper {
318
+ margin-top: 0;
319
+ width: auto;
320
+ display: flex;
321
+ }
322
+
323
+ .nav-scroll {
324
+ overflow-y: visible;
325
+ width: auto;
326
+ direction: auto;
327
+ text-align: start;
328
+ margin-inline-end: 0px;
329
+ pointer-events: all;
330
+ display: flex;
331
+ flex-direction: row;
332
+ margin-inline-end: auto;
333
+ }
334
+
335
+ .nav::-webkit-scrollbar {
336
+ display: none;
337
+ }
338
+
339
+ .nav-expend {
340
+ display: none;
341
+ }
342
+ }
343
+ </style>
@@ -0,0 +1,17 @@
1
+ <template>
2
+ <div class="page-top">
3
+ <h1 class="top-title">
4
+ <slot />
5
+ {{ value }}
6
+ </h1>
7
+ </div>
8
+ </template>
9
+
10
+ <script lang="ts" setup>
11
+ defineProps({
12
+ value: {
13
+ type: String,
14
+ default: '',
15
+ },
16
+ });
17
+ </script>
@@ -0,0 +1,205 @@
1
+ <template>
2
+ <div
3
+ @click="onClick"
4
+ class="person-card"
5
+ v-if="person"
6
+ >
7
+ <div
8
+ class="person-card-edit flex gap-2"
9
+ v-if="!onClick"
10
+ >
11
+ <Btn
12
+ round
13
+ thin
14
+ icon.end="arrow_outward"
15
+ value="Profile"
16
+ v-if="!$route.path.match('/search')"
17
+ is="router-link"
18
+ :to="`/search/${person.id}`"
19
+ />
20
+ <Btn
21
+ thin
22
+ flat
23
+ @click="showEditForm"
24
+ icon="edit"
25
+ />
26
+ </div>
27
+ <div class="person-card-icon-wrap">
28
+ <p class="person-card-icon">
29
+ {{ initials(person.first_name, person.last_name) }}
30
+ </p>
31
+ <p class="person-card-name txt20">
32
+ {{ person.first_name }} {{ person.last_name }}
33
+ </p>
34
+ </div>
35
+
36
+ <div class="person-card-details-wrap">
37
+ <div
38
+ class="person-card-details"
39
+ v-if="person.phone?.length"
40
+ >
41
+ <MaterialIcon icon="phone" />
42
+ <p
43
+ v-for="phone in person.phone"
44
+ :key="phone.id"
45
+ >
46
+ {{ phone.phone }}
47
+ </p>
48
+ </div>
49
+ <div
50
+ class="person-card-details"
51
+ v-if="person.email?.length"
52
+ >
53
+ <MaterialIcon icon="email" />
54
+ <p
55
+ v-for="email in person.email"
56
+ :key="email.id"
57
+ >
58
+ {{ email.email }}
59
+ </p>
60
+ </div>
61
+ <div
62
+ class="person-card-details badge"
63
+ v-if="person.date_of_birth || person.gender"
64
+ >
65
+ <MaterialIcon icon="badge" />
66
+ <p v-if="person.date_of_birth">
67
+ {{ person.date_of_birth }}
68
+ </p>
69
+ <p v-if="person.gender">
70
+ {{ person.gender }}
71
+ </p>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </template>
76
+
77
+ <script lang="ts" setup>
78
+ import type { Person } from '@/types';
79
+ import {
80
+ initials, useModal,
81
+ } from '@/utils';
82
+ import { Btn, MaterialIcon } from '@/components';
83
+ import { useBagel } from 'src/plugins/bagel';
84
+ import type { FormKitSchemaDefinition } from '@formkit/core';
85
+
86
+
87
+ // const toast = useToast(); // TODO: use toast
88
+ const bagel = useBagel();
89
+ const { modalForm } = useModal();
90
+
91
+
92
+ const props = defineProps<{
93
+ person: Person;
94
+ onClick: ((event: MouseEvent) => void) | undefined;
95
+ personSchema: () => FormKitSchemaDefinition;
96
+ }>();
97
+
98
+ const showEditForm = async () => {
99
+
100
+ const { first_name, last_name } = props.person;
101
+ modalForm({
102
+ side: true,
103
+ title: `${first_name} ${last_name}`,
104
+ schema: props.personSchema,
105
+ modelValue: props.person,
106
+ onSubmit: (newPerson) => bagel
107
+ .put('/person', newPerson)
108
+ // .then(() => toast.success($t('updatedSuccessfully'))),
109
+ });
110
+ };
111
+ </script>
112
+ <style>
113
+ .person-card {
114
+ border: 1.1px solid var(--border-color);
115
+ /* background: var(--input-bg); */
116
+ border-radius: var(--card-border-radius);
117
+ padding: 1rem;
118
+ margin-bottom: 0.5rem;
119
+ font-size: 1rem;
120
+ position: relative;
121
+ }
122
+
123
+ .person-card p {
124
+ margin: 0;
125
+ }
126
+
127
+ .person-card-details {
128
+ font-size: 14px;
129
+ margin-bottom: 2px;
130
+ line-height: 1.3;
131
+ display: flex;
132
+ }
133
+
134
+ .person-card-details p {
135
+ color: var(--input-color);
136
+ opacity: 0.6;
137
+ }
138
+
139
+ .person-card-details.badge p {
140
+ opacity: 1;
141
+ }
142
+
143
+ .person-card-details p:nth-child(2) {
144
+ opacity: 1;
145
+ padding-inline-end: 0.5rem;
146
+ }
147
+
148
+ .person-card-details .icon-font {
149
+ color: var(--bgl-blue);
150
+ padding-inline-end: 0.25rem;
151
+ }
152
+
153
+ .person-card-edit {
154
+ position: absolute;
155
+ inset-inline-end: 1rem;
156
+ }
157
+
158
+ .person-card-details-wrap {
159
+ display: flex;
160
+ gap: 0.5rem;
161
+ flex-wrap: wrap;
162
+ }
163
+
164
+ .person-card-icon {
165
+ background: var(--bgl-gray);
166
+ height: 30px;
167
+ width: 30px;
168
+ border-radius: 100%;
169
+ text-transform: uppercase;
170
+ display: flex;
171
+ justify-content: center;
172
+ align-items: center;
173
+ color: white;
174
+ font-size: 12px;
175
+ }
176
+
177
+ .person-card-icon-wrap {
178
+ display: flex;
179
+ gap: 0.5rem;
180
+ align-items: center;
181
+ padding-bottom: 0.75rem;
182
+ }
183
+
184
+ @media screen and (max-width: 910px) {
185
+ .person-card-icon-wrap {
186
+ padding-bottom: 0.5rem;
187
+ }
188
+
189
+ .person-card {
190
+ padding: 0.75rem;
191
+ position: relative;
192
+ }
193
+
194
+ .person-card-edit {
195
+ /* position: relative; */
196
+ inset-inline-end: 0.5rem;
197
+ margin-bottom: 1rem;
198
+ justify-content: flex-end;
199
+ }
200
+
201
+ .person-card-name {
202
+ max-width: calc(100% - 170px);
203
+ }
204
+ }
205
+ </style>