@winchsa/ui 0.1.4 → 0.1.6

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 (35) hide show
  1. package/dist/components/forms/DatePicker.vue +1 -1
  2. package/dist/components/forms/DatePickerRange.vue +0 -2
  3. package/dist/components/forms/ManualDate.vue +1 -1
  4. package/dist/components/table/EditableDataTable.vue.d.ts +1 -0
  5. package/dist/components/table/EditableDataTableRow.vue +1 -0
  6. package/dist/components/table/FilterGenerator.vue +0 -1
  7. package/dist/composables/useTableFilters.js +2 -1
  8. package/dist/composables/useTableFilters.mjs +2 -1
  9. package/dist/lang/ar.json +54 -0
  10. package/dist/lang/en.json +54 -0
  11. package/dist/types.d.ts +2 -15
  12. package/dist/utils/client.js +14 -0
  13. package/dist/utils/client.mjs +14 -0
  14. package/dist/utils/i18n.d.ts +8 -0
  15. package/dist/utils/i18n.js +36 -0
  16. package/dist/utils/i18n.mjs +27 -0
  17. package/dist/utils/index.d.ts +1 -0
  18. package/dist/utils/index.js +11 -0
  19. package/dist/utils/index.mjs +1 -0
  20. package/dist/utils/toaster.js +5 -8
  21. package/dist/utils/toaster.mjs +5 -6
  22. package/dist/utils/utils.d.ts +1 -0
  23. package/dist/utils/utils.js +16 -2
  24. package/dist/utils/utils.mjs +11 -0
  25. package/package.json +4 -4
  26. package/dist/composables/useFormValidation.d.ts +0 -0
  27. package/dist/composables/useFormValidation.js +0 -1
  28. package/dist/composables/useFormValidation.mjs +0 -0
  29. package/dist/styles/@core/scss/template/libs/apex-chart.css +0 -90
  30. package/dist/styles/@core/scss/template/libs/apex-chart.scss +0 -99
  31. package/dist/styles/@core/scss/template/libs/shepherd.css +0 -82
  32. package/dist/styles/@core/scss/template/libs/shepherd.scss +0 -88
  33. /package/dist/utils/{hijri-date.d.ts → hijriDate.d.ts} +0 -0
  34. /package/dist/utils/{hijri-date.js → hijriDate.js} +0 -0
  35. /package/dist/utils/{hijri-date.mjs → hijriDate.mjs} +0 -0
@@ -11,7 +11,7 @@ const { t, locale } = useI18n();
11
11
  const { current } = useTheme();
12
12
  const props = defineProps({
13
13
  modelValue: { type: [String, Date], required: false, default: "" },
14
- format: { type: String, required: false, default: "YYYY-MM-DD" },
14
+ format: { type: String, required: false, default: "DD-MM-YYYY" },
15
15
  displayFormat: { type: String, required: false },
16
16
  label: { type: String, required: false },
17
17
  forcedLabel: { type: String, required: false },
@@ -92,7 +92,6 @@ const label = (type) => {
92
92
  :error-messages="fromErrorMessages"
93
93
  :min-date="fromMinDate"
94
94
  :max-date="maxFromDate"
95
- format="DD-MM-YYYY"
96
95
  display-format="DD/MM/YYYY"
97
96
  :label="props.label"
98
97
  :forced-label="label('from')"
@@ -116,7 +115,6 @@ const label = (type) => {
116
115
  :min-date="from || toMinDate"
117
116
  :max-date="maxToDate"
118
117
  :disabled="disableFrom"
119
- format="DD-MM-YYYY"
120
118
  display-format="DD/MM/YYYY"
121
119
  :label="props.label"
122
120
  :forced-label="label('to')"
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { HijriJS } from "../../utils/hijri-date";
2
+ import { HijriJS } from "../../utils/hijriDate";
3
3
  import { computed, ref, watch } from "vue";
4
4
  import { useI18n } from "vue-i18n";
5
5
  import { VLabel, VIcon, VValidation, VMessages } from "vuetify/components";
@@ -47,6 +47,7 @@ declare const headers: import("vue").ComputedRef<{
47
47
  groupValues?: string;
48
48
  options?: Record<string, unknown>[] | import("../../types").OptionItem[] | import("vue").Ref<import("../../types").OptionItem[]>;
49
49
  disableIfEmpty?: boolean;
50
+ maxDate?: Date | null;
50
51
  }[]>;
51
52
  declare const moduleIdentifier: import("vue").ComputedRef<string>;
52
53
  declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
@@ -197,6 +197,7 @@ const placeholder = (header) => {
197
197
  :rules="header.rules"
198
198
  :clearable="header.clearable"
199
199
  :min-date="/* @__PURE__ */new Date()"
200
+ :max-date="header.maxDate"
200
201
  :disabled="isDisabled"
201
202
  :error-messages="errorMessages"
202
203
  :error="error"
@@ -201,7 +201,6 @@ watch(
201
201
  v-if="form.type === 'datepicker'"
202
202
  v-model="value[form.name]"
203
203
  show-today
204
- format="DD-MM-YYYY"
205
204
  display-format="DD/MM/YYYY"
206
205
  :label="form.label"
207
206
  :rules="form.rules"
@@ -63,7 +63,8 @@ function useTableFilters({
63
63
  const filterType = currentFilter?.type ?? "text";
64
64
  if ((filterType === "autocomplete" || filterType === "autocompleteGroups" || filterType === "select") && !currentFilter?.multiple) {
65
65
  if (typeof filterValue === "object") {
66
- queryParams[filterKey] = filterValue[currentFilter?.trackBy || "id"];
66
+ const value = Array.isArray(filterValue) ? filterValue[0] : filterValue;
67
+ queryParams[filterKey] = value[currentFilter?.trackBy || "id"];
67
68
  } else {
68
69
  queryParams[filterKey] = filterValue;
69
70
  }
@@ -57,7 +57,8 @@ export function useTableFilters({ formFilters, syncFiltersWithUrl }) {
57
57
  const filterType = currentFilter?.type ?? "text";
58
58
  if ((filterType === "autocomplete" || filterType === "autocompleteGroups" || filterType === "select") && !currentFilter?.multiple) {
59
59
  if (typeof filterValue === "object") {
60
- queryParams[filterKey] = filterValue[currentFilter?.trackBy || "id"];
60
+ const value = Array.isArray(filterValue) ? filterValue[0] : filterValue;
61
+ queryParams[filterKey] = value[currentFilter?.trackBy || "id"];
61
62
  } else {
62
63
  queryParams[filterKey] = filterValue;
63
64
  }
@@ -0,0 +1,54 @@
1
+ {
2
+ "days": {
3
+ "1": "الأحد",
4
+ "2": "الإثنين",
5
+ "3": "الثلاثاء",
6
+ "4": "الأربعاء",
7
+ "5": "الخميس",
8
+ "6": "الجمعة",
9
+ "7": "السبت"
10
+ },
11
+ "days_ranges": {
12
+ "today": "اليوم",
13
+ "week": "أسبوع",
14
+ "yesterday": "أمس",
15
+ "current_month": "الشهر الحالي",
16
+ "previous_month": "الشهر السابق",
17
+ "last_3_months": "آخر 3 شهور",
18
+ "last_6_months": "آخر 6 شهور",
19
+ "current_year": "السنة الحالية",
20
+ "last_2_years": "آخر سنتين",
21
+ "last_3_years": "آخر 3 سنوات"
22
+ },
23
+ "currency": {
24
+ "sr": "ر.س"
25
+ },
26
+ "measurement_units": {
27
+ "km": "كم",
28
+ "km_h": "كم/س"
29
+ },
30
+ "http": {
31
+ "403": "ليس لديك صلاحية لتنفيذ العملية",
32
+ "429": "لقد تخطيت عدد محاولات المسموح به ، الرجاء المحاولة لاحقاً",
33
+ "500": "خلل أثناء تنفيذ العملية"
34
+ },
35
+ "validation": {
36
+ "email": "يجب أن يكون عنوان بريد إلكتروني صحيح ",
37
+ "required": "هذا الحقل مطلوب",
38
+ "confirmed": " كلمة المرور غير متطابق",
39
+ "password_confirmation": "تأكيد كلمة المرور",
40
+ "between": "أدخل رقماً بين {min} و {max}",
41
+ "integer": "يجب أن يكون الحقل عددًا صحيحًا",
42
+ "number": "يجب أن يكون الحقل رقماً ",
43
+ "alphabetic": "يجب أن يكون الحقل أحرف أبجدية",
44
+ "url": "يجب أن يكون الحقل عنوان URL صالحًا",
45
+ "length": "يجب أن يكون الحقل {length} حرفًا",
46
+ "alpha_dash": "غير مسموح بجميع الأحرف",
47
+ "file_size_limit_exceeded": "يجب أن يكون حجم الملف أقل من {size} ميجابايت",
48
+ "file_type_not_allowed": "يجب أن يكون نوع الملف {types}",
49
+ "optional": "اختياري",
50
+ "date": "يجب أن يكون التاريخ {format}",
51
+ "iban": "هذا الحقل يجب ان يتكون من 24 خانة على الأقل ويكون بصيغة الآيبان",
52
+ "invalid": "هذا الحقل غير صحيح"
53
+ }
54
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "days": {
3
+ "1": "Sun",
4
+ "2": "Mon",
5
+ "3": "Tue",
6
+ "4": "Wed",
7
+ "5": "Thu",
8
+ "6": "Fri",
9
+ "7": "Sat"
10
+ },
11
+ "days_ranges": {
12
+ "today": "Today",
13
+ "week": "Week",
14
+ "yesterday": "Yesterday",
15
+ "current_month": "Current month",
16
+ "previous_month": "Previous month",
17
+ "last_3_months": "Last 3 months",
18
+ "last_6_months": "Last 3 months",
19
+ "current_year": "Current year",
20
+ "last_2_years": "Last 2 years",
21
+ "last_3_years": "Last 3 years"
22
+ },
23
+ "currency": {
24
+ "sr": "SAR"
25
+ },
26
+ "measurement_units": {
27
+ "km": "KM",
28
+ "km_h": "KM/H"
29
+ },
30
+ "http": {
31
+ "403": "You do not have permission to perform this operation",
32
+ "429": "You have exceeded the number of attempts allowed, please try again later",
33
+ "500": "An error occurred during the execution of the operation"
34
+ },
35
+ "validation": {
36
+ "email": "The Email field must be a valid email",
37
+ "required": "This field is required",
38
+ "confirmed": "Password does not match",
39
+ "password_confirmation": "Password confirmation",
40
+ "between": "Enter a number between {min} and {max}",
41
+ "integer": "Field must be an integer",
42
+ "number": "Field must be a number",
43
+ "alphabetic": "Field must be alphabetic",
44
+ "url": "Field must be a valid URL",
45
+ "length": "Field must be {length} characters",
46
+ "alpha_dash": "All characters are not allowed",
47
+ "file_size_limit_exceeded": "File size must be less than {size} MB",
48
+ "file_type_not_allowed": "Must be one of the following types: {types}",
49
+ "optional": "Optional",
50
+ "date": "Must be date in format {format}",
51
+ "iban": "This Field Must Consist of at Least 24 Characters and Be in IBAN Format",
52
+ "invalid": "This Field is invalid"
53
+ }
54
+ }
package/dist/types.d.ts CHANGED
@@ -143,6 +143,7 @@ export type EditableDataTableItem = {
143
143
  groupValues?: string
144
144
  options?: Record<string, unknown>[] | OptionItem[] | Ref<OptionItem[]>
145
145
  disableIfEmpty?: boolean
146
+ maxDate?: Date | null
146
147
  }
147
148
 
148
149
  export type OptionItem = {
@@ -204,23 +205,9 @@ export type GridColumn = {
204
205
  xxl?: string
205
206
  }
206
207
 
207
- // Suppress intlify type inference errors
208
- declare module '@intlify/core-base' {
209
- export interface CoreTranslation {
210
- [key: string]: any;
211
- }
212
- }
213
-
214
- // Global type augmentation to suppress TS2742 errors
215
208
  declare global {
216
209
  interface Window {
217
- // Add any global window properties if needed
210
+ i18n?: any;
218
211
  }
219
212
  }
220
213
 
221
- // Suppress TS2742 errors for vue-i18n
222
- declare module 'vue-i18n' {
223
- interface ComposerTranslation {
224
- (key: string, ...args: any[]): string;
225
- }
226
- }
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.client = void 0;
7
7
  var _ofetch = require("ofetch");
8
+ var _toaster = require("./toaster");
9
+ var _i18n = require("./i18n");
8
10
  const clientInstance = _ofetch.ofetch.create({
9
11
  credentials: "include"
10
12
  });
@@ -31,6 +33,18 @@ async function apiRequest(method, path, options) {
31
33
  }),
32
34
  ...headers
33
35
  },
36
+ onResponseError: error => {
37
+ if (error.response.status === 401) {
38
+ localStorage.clear();
39
+ window.location.href = "/login";
40
+ }
41
+ if (error.response.status === 500) {
42
+ (0, _toaster.toaster)().error((0, _i18n.i18n)().global.t("http.500"));
43
+ }
44
+ if (error.response.status === 429) {
45
+ (0, _toaster.toaster)().error((0, _i18n.i18n)().global.t("http.429"));
46
+ }
47
+ },
34
48
  ...restOptions
35
49
  });
36
50
  }
@@ -1,4 +1,6 @@
1
1
  import { ofetch } from "ofetch";
2
+ import { toaster } from "./toaster.mjs";
3
+ import { i18n } from "./i18n.mjs";
2
4
  const clientInstance = ofetch.create({ credentials: "include" });
3
5
  async function apiRequest(method, path, options) {
4
6
  const baseUrl = import.meta.env.VITE_BASE_API;
@@ -17,6 +19,18 @@ async function apiRequest(method, path, options) {
17
19
  ...token && { Authorization: `Bearer ${token}` },
18
20
  ...headers
19
21
  },
22
+ onResponseError: (error) => {
23
+ if (error.response.status === 401) {
24
+ localStorage.clear();
25
+ window.location.href = "/login";
26
+ }
27
+ if (error.response.status === 500) {
28
+ toaster().error(i18n().global.t("http.500"));
29
+ }
30
+ if (error.response.status === 429) {
31
+ toaster().error(i18n().global.t("http.429"));
32
+ }
33
+ },
20
34
  ...restOptions
21
35
  });
22
36
  }
@@ -0,0 +1,8 @@
1
+ export declare const i18n: () => import("vue-i18n").I18n<{
2
+ en: any;
3
+ ar: any;
4
+ }, {}, {}, string, false>;
5
+ export declare const createI18nInstance: (messages: object) => import("vue-i18n").I18n<{
6
+ en: any;
7
+ ar: any;
8
+ }, {}, {}, string, false>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.i18n = exports.createI18nInstance = void 0;
7
+ var _vueI18n = require("vue-i18n");
8
+ var _en = _interopRequireDefault(require("../lang/en.json"));
9
+ var _ar = _interopRequireDefault(require("../lang/ar.json"));
10
+ var _utils = require("./utils");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const defaultMessages = {
13
+ en: _en.default,
14
+ ar: _ar.default
15
+ };
16
+ let _i18nInstance = (0, _vueI18n.createI18n)({
17
+ legacy: false,
18
+ locale: "ar",
19
+ fallbackLocale: "ar",
20
+ globalInjection: true,
21
+ messages: defaultMessages
22
+ });
23
+ const i18n = () => _i18nInstance;
24
+ exports.i18n = i18n;
25
+ const createI18nInstance = messages => {
26
+ const mergedMessages = (0, _utils.mergeDeep)(defaultMessages, messages);
27
+ _i18nInstance = (0, _vueI18n.createI18n)({
28
+ legacy: false,
29
+ locale: "ar",
30
+ fallbackLocale: "ar",
31
+ globalInjection: true,
32
+ messages: mergedMessages
33
+ });
34
+ return _i18nInstance;
35
+ };
36
+ exports.createI18nInstance = createI18nInstance;
@@ -0,0 +1,27 @@
1
+ import { createI18n } from "vue-i18n";
2
+ import en from "../lang/en.json";
3
+ import ar from "../lang/ar.json";
4
+ import { mergeDeep } from "./utils.mjs";
5
+ const defaultMessages = {
6
+ en,
7
+ ar
8
+ };
9
+ let _i18nInstance = createI18n({
10
+ legacy: false,
11
+ locale: "ar",
12
+ fallbackLocale: "ar",
13
+ globalInjection: true,
14
+ messages: defaultMessages
15
+ });
16
+ export const i18n = () => _i18nInstance;
17
+ export const createI18nInstance = (messages) => {
18
+ const mergedMessages = mergeDeep(defaultMessages, messages);
19
+ _i18nInstance = createI18n({
20
+ legacy: false,
21
+ locale: "ar",
22
+ fallbackLocale: "ar",
23
+ globalInjection: true,
24
+ messages: mergedMessages
25
+ });
26
+ return _i18nInstance;
27
+ };
@@ -6,4 +6,5 @@ export * from './formatters';
6
6
  export * from './queryParams';
7
7
  export * from './ruleValidator';
8
8
  export * from './toaster';
9
+ export * from './i18n';
9
10
  export * from './utils';
@@ -91,6 +91,17 @@ Object.keys(_toaster).forEach(function (key) {
91
91
  }
92
92
  });
93
93
  });
94
+ var _i18n = require("./i18n");
95
+ Object.keys(_i18n).forEach(function (key) {
96
+ if (key === "default" || key === "__esModule") return;
97
+ if (key in exports && exports[key] === _i18n[key]) return;
98
+ Object.defineProperty(exports, key, {
99
+ enumerable: true,
100
+ get: function () {
101
+ return _i18n[key];
102
+ }
103
+ });
104
+ });
94
105
  var _utils = require("./utils");
95
106
  Object.keys(_utils).forEach(function (key) {
96
107
  if (key === "default" || key === "__esModule") return;
@@ -6,4 +6,5 @@ export * from "./formatters.mjs";
6
6
  export * from "./queryParams.mjs";
7
7
  export * from "./ruleValidator.mjs";
8
8
  export * from "./toaster.mjs";
9
+ export * from "./i18n.mjs";
9
10
  export * from "./utils.mjs";
@@ -6,22 +6,19 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.responseAlert = responseAlert;
7
7
  exports.toaster = void 0;
8
8
  var _vueSonner = require("vue-sonner");
9
- var _vueI18n = require("vue-i18n");
9
+ var _i18n = require("./i18n");
10
10
  const toaster = () => {
11
- const {
12
- t
13
- } = (0, _vueI18n.useI18n)();
14
11
  const success = message => {
15
- _vueSonner.toast.success(message ?? t("success"));
12
+ _vueSonner.toast.success(message ?? (0, _i18n.i18n)().global.t("success"));
16
13
  };
17
14
  const error = message => {
18
- _vueSonner.toast.error(message ?? t("error"));
15
+ _vueSonner.toast.error(message ?? (0, _i18n.i18n)().global.t("error"));
19
16
  };
20
17
  const successLang = message => {
21
- _vueSonner.toast.success(t(message));
18
+ _vueSonner.toast.success((0, _i18n.i18n)().global.t(message));
22
19
  };
23
20
  const errorLang = message => {
24
- _vueSonner.toast.error(t(message));
21
+ _vueSonner.toast.error((0, _i18n.i18n)().global.t(message));
25
22
  };
26
23
  return {
27
24
  success,
@@ -1,18 +1,17 @@
1
1
  import { toast as sonnerToast } from "vue-sonner";
2
- import { useI18n } from "vue-i18n";
2
+ import { i18n } from "./i18n.mjs";
3
3
  export const toaster = () => {
4
- const { t } = useI18n();
5
4
  const success = (message) => {
6
- sonnerToast.success(message ?? t("success"));
5
+ sonnerToast.success(message ?? i18n().global.t("success"));
7
6
  };
8
7
  const error = (message) => {
9
- sonnerToast.error(message ?? t("error"));
8
+ sonnerToast.error(message ?? i18n().global.t("error"));
10
9
  };
11
10
  const successLang = (message) => {
12
- sonnerToast.success(t(message));
11
+ sonnerToast.success(i18n().global.t(message));
13
12
  };
14
13
  const errorLang = (message) => {
15
- sonnerToast.error(t(message));
14
+ sonnerToast.error(i18n().global.t(message));
16
15
  };
17
16
  return {
18
17
  success,
@@ -6,3 +6,4 @@ export declare const isEmptyArray: (arr: unknown) => boolean;
6
6
  export declare const buildFormData: <T>(data: T | T[], excludedKeys?: string[], formData?: FormData, parentKey?: string) => FormData;
7
7
  export declare const stripLeadingZero: (mobile: string) => string;
8
8
  export declare const cloneObjectDeep: <T>(obj: T) => T;
9
+ export declare const mergeDeep: (target: any, source: any) => any;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stripLeadingZero = exports.isNullOrUndefined = exports.isEmptyArray = exports.isEmpty = exports.generateUniqueId = exports.generateRandomId = exports.cloneObjectDeep = exports.buildFormData = void 0;
6
+ exports.stripLeadingZero = exports.mergeDeep = exports.isNullOrUndefined = exports.isEmptyArray = exports.isEmpty = exports.generateUniqueId = exports.generateRandomId = exports.cloneObjectDeep = exports.buildFormData = void 0;
7
7
  const generateRandomId = length => {
8
8
  const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
9
9
  let result = "";
@@ -67,4 +67,18 @@ exports.stripLeadingZero = stripLeadingZero;
67
67
  const cloneObjectDeep = obj => {
68
68
  return JSON.parse(JSON.stringify(obj));
69
69
  };
70
- exports.cloneObjectDeep = cloneObjectDeep;
70
+ exports.cloneObjectDeep = cloneObjectDeep;
71
+ const mergeDeep = (target, source) => {
72
+ const output = {
73
+ ...target
74
+ };
75
+ for (const key in source) {
76
+ if (typeof source[key] === "object" && source[key] !== null && !Array.isArray(source[key])) {
77
+ output[key] = mergeDeep(target[key] || {}, source[key]);
78
+ } else {
79
+ output[key] = source[key];
80
+ }
81
+ }
82
+ return output;
83
+ };
84
+ exports.mergeDeep = mergeDeep;
@@ -54,3 +54,14 @@ export const stripLeadingZero = (mobile) => {
54
54
  export const cloneObjectDeep = (obj) => {
55
55
  return JSON.parse(JSON.stringify(obj));
56
56
  };
57
+ export const mergeDeep = (target, source) => {
58
+ const output = { ...target };
59
+ for (const key in source) {
60
+ if (typeof source[key] === "object" && source[key] !== null && !Array.isArray(source[key])) {
61
+ output[key] = mergeDeep(target[key] || {}, source[key]);
62
+ } else {
63
+ output[key] = source[key];
64
+ }
65
+ }
66
+ return output;
67
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@winchsa/ui",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -26,22 +26,22 @@
26
26
  "peerDependencies": {
27
27
  "@intlify/unplugin-vue-i18n": "^4.0.0",
28
28
  "@tanstack/vue-query": "^5.74.5",
29
- "@vuepic/vue-datepicker": "^11.0.0",
30
29
  "@vueuse/core": "11.3.0",
31
30
  "@vueuse/router": "^13.1.0",
32
31
  "ofetch": "^1.4.1",
33
32
  "vue": "^3.5.13",
34
33
  "vue-i18n": "9.14.4",
35
- "vue-multiselect": "^3.1.0",
36
34
  "vue-router": "4.4.5",
35
+ "vue-sonner": "^1.3.0",
37
36
  "vue3-perfect-scrollbar": "2.0.0",
38
37
  "vuetify": "3.3.12"
39
38
  },
40
39
  "dependencies": {
40
+ "@vuepic/vue-datepicker": "^11.0.0",
41
41
  "cropperjs": "^1.6.2",
42
42
  "print-js": "^1.6.0",
43
43
  "v-calendar": "^3.1.2",
44
- "vue-sonner": "^1.3.0"
44
+ "vue-multiselect": "^3.1.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@tanstack/eslint-plugin-query": "^5.73.3",
File without changes
@@ -1 +0,0 @@
1
- "use strict";
File without changes
@@ -1,90 +0,0 @@
1
- @charset "UTF-8";
2
- /** if false, disabled buttons will be greyed out */
3
- /*
4
- TODO: Add docs on when to use placeholder vs when to use SASS variable
5
-
6
- Placeholder
7
- - When we want to keep customization to our self between templates use it
8
-
9
- Variables
10
- - When we want to allow customization from both user and our side
11
- - You can also use variable for consistency (e.g. mx 1 rem should be applied to both vertical nav items and vertical nav header)
12
- */
13
- /*
14
- ❗ Heads up
15
- ==================
16
- Here we assume we will always use shorthand property which will apply same padding on four side
17
- This is because this have been used as value of top property by `.popper-content`
18
- */
19
- .v-application .apexcharts-canvasline[stroke=transparent] {
20
- display: "none";
21
- }
22
- .v-application .apexcharts-canvas .apexcharts-tooltip {
23
- box-shadow: 0 3px 8px rgba(var(--v-shadow-key-umbra-color), 0.14), 0 0 transparent, 0 0 transparent;
24
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
25
- background: rgb(var(--v-theme-surface));
26
- }
27
- .v-application .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-title {
28
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
29
- background: rgb(var(--v-theme-surface));
30
- font-weight: 500;
31
- }
32
- .v-application .apexcharts-canvas .apexcharts-tooltip.apexcharts-theme-light {
33
- color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity));
34
- }
35
- .v-application .apexcharts-canvas .apexcharts-tooltip.apexcharts-theme-dark {
36
- color: white;
37
- }
38
- .v-application .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-series-group:first-of-type {
39
- padding-block-end: 0;
40
- }
41
- .v-application .apexcharts-canvas .apexcharts-xaxistooltip {
42
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
43
- background: rgb(var(--v-theme-gray-50));
44
- color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity));
45
- }
46
- .v-application .apexcharts-canvas .apexcharts-xaxistooltip::after {
47
- border-block-end-color: rgb(var(--v-theme-gray-50));
48
- }
49
- .v-application .apexcharts-canvas .apexcharts-xaxistooltip::before {
50
- border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity));
51
- }
52
- .v-application .apexcharts-canvas .apexcharts-yaxistooltip {
53
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
54
- background: rgb(var(--v-theme-gray-50));
55
- }
56
- .v-application .apexcharts-canvas .apexcharts-yaxistooltip::after {
57
- border-inline-start-color: rgb(var(--v-theme-gray-50));
58
- }
59
- .v-application .apexcharts-canvas .apexcharts-yaxistooltip::before {
60
- border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity));
61
- }
62
- .v-application .apexcharts-canvas .apexcharts-xaxistooltip-text,
63
- .v-application .apexcharts-canvas .apexcharts-yaxistooltip-text {
64
- color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity));
65
- }
66
- [dir=rtl] .v-application .apexcharts-canvas .apexcharts-yaxis .apexcharts-yaxis-texts-g .apexcharts-yaxis-label {
67
- text-anchor: start;
68
- }
69
- .v-application .apexcharts-canvas .apexcharts-text,
70
- .v-application .apexcharts-canvas .apexcharts-tooltip-text,
71
- .v-application .apexcharts-canvas .apexcharts-datalabel-label,
72
- .v-application .apexcharts-canvas .apexcharts-datalabel,
73
- .v-application .apexcharts-canvas .apexcharts-xaxistooltip-text,
74
- .v-application .apexcharts-canvas .apexcharts-yaxistooltip-text,
75
- .v-application .apexcharts-canvas .apexcharts-legend-text {
76
- font-family: "Public Sans", sans-serif, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important;
77
- }
78
- .v-application .apexcharts-canvas .apexcharts-pie-label {
79
- fill: white;
80
- filter: none;
81
- }
82
- .v-application .apexcharts-canvas .apexcharts-marker {
83
- box-shadow: none;
84
- }
85
- .v-application .apexcharts-canvas .apexcharts-legend-marker {
86
- margin-inline-end: 0.3875rem !important;
87
- }
88
- [dir=rtl] .v-application .apexcharts-canvas .apexcharts-legend-marker {
89
- margin-inline-end: 0.75rem !important;
90
- }
@@ -1,99 +0,0 @@
1
- @use '../../../../assets/scss/variables/_vuetify.scss' as vuetify;
2
- @use '../../../../@layouts/styles/mixins' as layoutsMixins;
3
- @use '../../base/mixins';
4
-
5
- .v-application .apexcharts-canvas {
6
- &line[stroke='transparent'] {
7
- display: 'none';
8
- }
9
-
10
- .apexcharts-tooltip {
11
- @include mixins.elevation(3);
12
-
13
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
14
- background: rgb(var(--v-theme-surface));
15
-
16
- .apexcharts-tooltip-title {
17
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
18
- background: rgb(var(--v-theme-surface));
19
- font-weight: 500;
20
- }
21
-
22
- &.apexcharts-theme-light {
23
- color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity));
24
- }
25
-
26
- &.apexcharts-theme-dark {
27
- color: white;
28
- }
29
-
30
- .apexcharts-tooltip-series-group:first-of-type {
31
- padding-block-end: 0;
32
- }
33
- }
34
-
35
- .apexcharts-xaxistooltip {
36
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
37
- background: rgb(var(--v-theme-gray-50));
38
- color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity));
39
-
40
- &::after {
41
- border-block-end-color: rgb(var(--v-theme-gray-50));
42
- }
43
-
44
- &::before {
45
- border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity));
46
- }
47
- }
48
-
49
- .apexcharts-yaxistooltip {
50
- border-color: rgba(var(--v-border-color), var(--v-border-opacity));
51
- background: rgb(var(--v-theme-gray-50));
52
-
53
- &::after {
54
- border-inline-start-color: rgb(var(--v-theme-gray-50));
55
- }
56
-
57
- &::before {
58
- border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity));
59
- }
60
- }
61
-
62
- .apexcharts-xaxistooltip-text,
63
- .apexcharts-yaxistooltip-text {
64
- color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity));
65
- }
66
-
67
- .apexcharts-yaxis .apexcharts-yaxis-texts-g .apexcharts-yaxis-label {
68
- @include layoutsMixins.rtl {
69
- text-anchor: start;
70
- }
71
- }
72
-
73
- .apexcharts-text,
74
- .apexcharts-tooltip-text,
75
- .apexcharts-datalabel-label,
76
- .apexcharts-datalabel,
77
- .apexcharts-xaxistooltip-text,
78
- .apexcharts-yaxistooltip-text,
79
- .apexcharts-legend-text {
80
- font-family: vuetify.$body-font-family !important;
81
- }
82
-
83
- .apexcharts-pie-label {
84
- fill: white;
85
- filter: none;
86
- }
87
-
88
- .apexcharts-marker {
89
- box-shadow: none;
90
- }
91
-
92
- .apexcharts-legend-marker {
93
- margin-inline-end: 0.3875rem !important;
94
-
95
- @include layoutsMixins.rtl {
96
- margin-inline-end: 0.75rem !important;
97
- }
98
- }
99
- }
@@ -1,82 +0,0 @@
1
- /** if false, disabled buttons will be greyed out */
2
- .shepherd-button {
3
- border-radius: 6px;
4
- block-size: 1.75rem;
5
- font-size: 0.8125rem;
6
- font-weight: 500;
7
- margin-inline-end: 0.75rem;
8
- padding-block: 0.25rem;
9
- padding-inline: 1rem;
10
- }
11
-
12
- .shepherd-footer {
13
- background: rgb(var(--v-theme-background));
14
- padding-block: 0.5rem 1rem;
15
- padding-inline: 1rem;
16
- }
17
-
18
- .shepherd-element .shepherd-content .shepherd-header {
19
- background: rgb(var(--v-theme-background));
20
- padding-block: 1rem 0;
21
- padding-inline: 1rem;
22
- }
23
-
24
- .shepherd-element .shepherd-content .shepherd-header .shepherd-title {
25
- color: rgb(var(--v-theme-on-background));
26
- font-size: 1.125rem;
27
- font-weight: 500;
28
- }
29
-
30
- .shepherd-text {
31
- padding: 1rem;
32
- background: rgb(var(--v-theme-background));
33
- color: rgb(var(--v-theme-on-background));
34
- font-size: 0.9375rem;
35
- }
36
-
37
- .shepherd-cancel-icon {
38
- color: rgba(var(--v-theme-on-background), var(--v-disabled-opacity)) !important;
39
- font-size: 1.5rem;
40
- }
41
-
42
- .shepherd-element[data-popper-placement^=bottom] {
43
- margin-block-start: 0.75rem !important;
44
- }
45
-
46
- .shepherd-element[data-popper-placement^=top] {
47
- margin-block-end: 0.75rem !important;
48
- }
49
-
50
- .shepherd-element[data-popper-placement^=right] {
51
- margin-inline-start: 0.75rem !important;
52
- }
53
-
54
- .shepherd-element[data-popper-placement^=left] {
55
- margin-inline-end: 0.75rem !important;
56
- }
57
-
58
- .shepherd-element[data-popper-placement] .shepherd-arrow::before {
59
- background: rgb(var(--v-theme-background)) !important;
60
- }
61
-
62
- .shepherd-element {
63
- border-radius: 6px;
64
- background: transparent;
65
- }
66
-
67
- .nextBtnClass,
68
- .nextBtnClass:not(:disabled):hover {
69
- background: rgb(var(--v-theme-primary));
70
- }
71
-
72
- .backBtnClass,
73
- .backBtnClass:not(:disabled):hover {
74
- background: rgba(var(--v-theme-secondary), var(--v-activated-opacity));
75
- color: rgb(var(--v-theme-secondary));
76
- }
77
-
78
- @media screen and (max-width: 600px) {
79
- .shepherd-element {
80
- max-inline-size: 75vw;
81
- }
82
- }
@@ -1,88 +0,0 @@
1
- // commented out because it's not used
2
- // @use 'shepherd.js/dist/css/shepherd.css';
3
-
4
- @use '../../../../assets/scss/variables/vuetify.scss' as variables;
5
-
6
- .shepherd-button {
7
- border-radius: variables.$button-border-radius;
8
- block-size: 1.75rem;
9
- font-size: 0.8125rem;
10
- font-weight: variables.$button-font-weight;
11
- margin-inline-end: 0.75rem;
12
- padding-block: 0.25rem;
13
- padding-inline: 1rem;
14
- }
15
-
16
- .shepherd-footer {
17
- background: rgb(var(--v-theme-background));
18
- padding-block: 0.5rem 1rem;
19
- padding-inline: 1rem;
20
- }
21
-
22
- .shepherd-element .shepherd-content .shepherd-header {
23
- background: rgb(var(--v-theme-background));
24
- padding-block: 1rem 0;
25
- padding-inline: 1rem;
26
- }
27
-
28
- .shepherd-element .shepherd-content .shepherd-header .shepherd-title {
29
- color: rgb(var(--v-theme-on-background));
30
- font-size: 1.125rem;
31
- font-weight: 500;
32
- }
33
-
34
- .shepherd-text {
35
- padding: 1rem;
36
- background: rgb(var(--v-theme-background));
37
- color: rgb(var(--v-theme-on-background));
38
- font-size: variables.$card-text-font-size;
39
- }
40
-
41
- .shepherd-cancel-icon {
42
- color: rgba(var(--v-theme-on-background), var(--v-disabled-opacity)) !important;
43
- font-size: 1.5rem;
44
- }
45
-
46
- .shepherd-element[data-popper-placement^='bottom'] {
47
- margin-block-start: 0.75rem !important;
48
- }
49
-
50
- .shepherd-element[data-popper-placement^='top'] {
51
- margin-block-end: 0.75rem !important;
52
- }
53
-
54
- .shepherd-element[data-popper-placement^='right'] {
55
- margin-inline-start: 0.75rem !important;
56
- }
57
-
58
- .shepherd-element[data-popper-placement^='left'] {
59
- margin-inline-end: 0.75rem !important;
60
- }
61
-
62
- .shepherd-element[data-popper-placement] {
63
- .shepherd-arrow::before {
64
- background: rgb(var(--v-theme-background)) !important;
65
- }
66
- }
67
-
68
- .shepherd-element {
69
- border-radius: variables.$card-border-radius;
70
- background: transparent;
71
- }
72
-
73
- .nextBtnClass,
74
- .nextBtnClass:not(:disabled):hover {
75
- background: rgb(var(--v-theme-primary));
76
- }
77
-
78
- .backBtnClass,
79
- .backBtnClass:not(:disabled):hover {
80
- background: rgba(var(--v-theme-secondary), var(--v-activated-opacity));
81
- color: rgb(var(--v-theme-secondary));
82
- }
83
-
84
- @media screen and (max-width: 600px) {
85
- .shepherd-element {
86
- max-inline-size: 75vw;
87
- }
88
- }
File without changes
File without changes
File without changes