vueless 1.2.10-beta.7 → 1.2.10-beta.9

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/index.d.ts CHANGED
@@ -30,6 +30,7 @@ export { default as useUI } from "./composables/useUI";
30
30
  export { useDarkMode } from "./composables/useDarkMode";
31
31
  export { useRequestQueue } from "./composables/useRequestQueue";
32
32
  export { useLoaderOverlay } from "./ui.loader-overlay/useLoaderOverlay";
33
+ export { useLoaderProgress } from "./ui.loader-progress/useLoaderProgress";
33
34
  export { useMutationObserver } from "./composables/useMutationObserver";
34
35
  export { Direction, useAutoPosition } from "./composables/useAutoPosition";
35
36
  export { useComponentLocaleMessages } from "./composables/useComponentLocaleMassages";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "1.2.10-beta.7",
3
+ "version": "1.2.10-beta.9",
4
4
  "description": "Vue Styleless UI Component Library, powered by Tailwind CSS.",
5
5
  "author": "Johnny Grid <hello@vueless.com> (https://vueless.com)",
6
6
  "homepage": "https://vueless.com",
@@ -27,26 +27,15 @@ const inputRangeToError = defineModel<string>("inputRangeToError", { required: t
27
27
  const rangeStart = defineModel<string>("rangeStart", { required: true });
28
28
  const rangeEnd = defineModel<string>("rangeEnd", { required: true });
29
29
 
30
- function isGraterThanTo(value: string) {
31
- if (!value) return false;
30
+ function isFromGreaterThanTo(fromValue: string, toValue: string) {
31
+ if (!fromValue || !toValue) return false;
32
32
 
33
- const parsedValue = parseDate(value, INPUT_RANGE_FORMAT, props.locale);
34
- const parsedTo = parseDate(localValue.value.to, props.dateFormat, props.locale);
33
+ const parsedFrom = parseDate(fromValue, INPUT_RANGE_FORMAT, props.locale);
34
+ const parsedTo = parseDate(toValue, INPUT_RANGE_FORMAT, props.locale);
35
35
 
36
- if (!parsedValue || !parsedTo) return false;
36
+ if (!parsedFrom || !parsedTo) return false;
37
37
 
38
- return parsedValue > parsedTo && !isSameDay(parsedValue, parsedTo);
39
- }
40
-
41
- function isSmallerThanFrom(value: string) {
42
- if (!value) return false;
43
-
44
- const parsedValue = parseDate(value, INPUT_RANGE_FORMAT, props.locale);
45
- const parsedFrom = parseDate(localValue.value.from, props.dateFormat, props.locale);
46
-
47
- if (!parsedValue || !parsedFrom) return false;
48
-
49
- return parsedValue < parsedFrom && !isSameDay(parsedValue, parsedFrom);
38
+ return parsedFrom > parsedTo && !isSameDay(parsedFrom, parsedTo);
50
39
  }
51
40
 
52
41
  function validateInput(value: string, type: `${InputRangeType}`) {
@@ -60,18 +49,30 @@ function validateInput(value: string, type: `${InputRangeType}`) {
60
49
  error = props.locale.notCorrectMonthNumber;
61
50
  } else if (isWrongDayNumber(value) && value) {
62
51
  error = props.locale.notCorrectDayNumber;
63
- } else if (isGraterThanTo(value) && type === InputRangeType.Start) {
52
+ } else if (type === InputRangeType.Start && isFromGreaterThanTo(value, rangeEnd.value)) {
64
53
  error = props.locale.fromDateGraterThanSecond;
65
- } else if (isSmallerThanFrom(value) && type === InputRangeType.End) {
54
+ } else if (type === InputRangeType.End && isFromGreaterThanTo(rangeStart.value, value)) {
66
55
  error = props.locale.toDateSmallerThanFirst;
67
56
  }
68
57
 
69
58
  if (type === InputRangeType.Start) {
70
59
  inputRangeFromError.value = error;
60
+
61
+ if (!error && rangeEnd.value) {
62
+ inputRangeToError.value = isFromGreaterThanTo(value, rangeEnd.value)
63
+ ? props.locale.toDateSmallerThanFirst
64
+ : "";
65
+ }
71
66
  }
72
67
 
73
68
  if (type === InputRangeType.End) {
74
69
  inputRangeToError.value = error;
70
+
71
+ if (!error && rangeStart.value) {
72
+ inputRangeFromError.value = isFromGreaterThanTo(rangeStart.value, value)
73
+ ? props.locale.fromDateGraterThanSecond
74
+ : "";
75
+ }
75
76
  }
76
77
  }
77
78
 
@@ -3,7 +3,6 @@ import { computed, watch, ref, useTemplateRef, onBeforeMount, onBeforeUnmount }
3
3
 
4
4
  import useUI from "../composables/useUI";
5
5
  import { getDefaults } from "../utils/ui";
6
- import { useRequestQueue } from "../composables/useRequestQueue";
7
6
  import { getRequestWithoutQuery } from "../utils/requestQueue";
8
7
 
9
8
  import { useLoaderProgress } from "./useLoaderProgress";
@@ -18,7 +17,7 @@ defineOptions({ inheritAttrs: false });
18
17
 
19
18
  const props = withDefaults(defineProps<Props>(), {
20
19
  ...getDefaults<Props, Config>(defaultConfig, COMPONENT_NAME),
21
- resources: () => "",
20
+ resources: "any",
22
21
  });
23
22
 
24
23
  const error = ref(false);
@@ -27,8 +26,7 @@ const progress = ref(0);
27
26
  const opacity = ref(1);
28
27
  const status = ref<number | null>(null);
29
28
 
30
- const { requestQueue } = useRequestQueue();
31
- const { loaderProgressOff, loaderProgressOn } = useLoaderProgress();
29
+ const { progressRequestQueue, loaderProgressOff, loaderProgressOn } = useLoaderProgress();
32
30
  const progressRef = useTemplateRef<HTMLDivElement>("progress-bar");
33
31
 
34
32
  const isLoading = computed(() => {
@@ -51,15 +49,15 @@ const resourceSubscriptions = computed(() => {
51
49
  });
52
50
 
53
51
  const isActiveRequests = computed(() => {
54
- const isAnyRequestActive = props.resources === "any" && requestQueue.value.length;
52
+ const isAnyRequestActive = props.resources === "any" && progressRequestQueue.value.length;
55
53
  const isSubscribedRequestsActive = resourceSubscriptions.value.some((resource) =>
56
- requestQueue.value.includes(resource),
54
+ progressRequestQueue.value.includes(resource),
57
55
  );
58
56
 
59
57
  return isAnyRequestActive || isSubscribedRequestsActive;
60
58
  });
61
59
 
62
- watch(() => requestQueue, onChangeRequestsQueue, { immediate: true, deep: true });
60
+ watch(() => progressRequestQueue, onChangeRequestsQueue, { immediate: true, deep: true });
63
61
 
64
62
  watch(
65
63
  () => props.loading,
@@ -16,26 +16,33 @@ import defaultConfig from "../config?raw"
16
16
  To control the loader state in Vue components use `useLoaderProgress` composable.
17
17
 
18
18
  The loader uses queue of resources and will be shown until at least one item is present in a queue.
19
+ The queue approach is useful if you want to implement global loading handling (for example in axios interceptors)
19
20
 
20
21
  <Source code={`
21
22
  import { useLoaderProgress } from "vueless";
22
23
 
23
24
  const {
25
+ isLoading,
24
26
  loaderProgressOn,
25
27
  loaderProgressOff,
26
- requestQueue,
28
+ progressRequestQueue,
27
29
  } = useLoaderProgress();
28
30
 
29
- // show loader (add resource into queue)
30
- loaderProgressOn("/transactions");
31
- loaderProgressOff(["/transactions", "/products"]);
31
+ /* get loader state */
32
+ console.log(isLoading.value);
32
33
 
33
- // hide loader (remove resource from queue)
34
- loaderProgressOff("/transactions");
35
- loaderProgressOff(["/transactions", "/products"]);
34
+ /* show loader */
35
+ loaderProgressOn(); // simple
36
+ loaderProgressOn("/transactions"); // single resource
37
+ loaderProgressOff(["/transactions", "/products"]); // multiple resources
36
38
 
37
- // get current global resource queue
38
- console.log(requestQueue.value);
39
+ /* hide loader */
40
+ loaderProgressOff(); // simple
41
+ loaderProgressOff("/transactions"); // single resource
42
+ loaderProgressOff(["/transactions", "/products"]); // multiple resources
43
+
44
+ /* access loader progress resource queue */
45
+ console.log(progressRequestQueue.value);
39
46
  `} language="jsx" dark />
40
47
 
41
48
  ## Using loader outside Vue components
@@ -44,11 +51,15 @@ To control the loader state outside Vue components, use the following methods.
44
51
  <Source code={`
45
52
  import { loaderProgressOn, loaderProgressOff } from "vueless";
46
53
 
47
- // show loader
48
- loaderProgressOn("/transactions");
54
+ /* show loader */
55
+ loaderProgressOn(); // simple
56
+ loaderProgressOn("/transactions"); // single resource
57
+ loaderProgressOff(["/transactions", "/products"]); // multiple resources
49
58
 
50
- // hide loader
51
- loaderProgressOff("/transactions");
59
+ /* hide loader */
60
+ loaderProgressOff(); // simple
61
+ loaderProgressOff("/transactions"); // single resource
62
+ loaderProgressOff(["/transactions", "/products"]); // multiple resources
52
63
  `} language="jsx" dark />
53
64
 
54
65
  ## Default config
@@ -69,7 +69,6 @@ const EnumTemplate: StoryFn<ULoaderProgressArgs> = (args: ULoaderProgressArgs, {
69
69
  v-for="option in argTypes?.[args.enum]?.options"
70
70
  :key="option"
71
71
  v-bind="getArgs(args, option)"
72
- :resources="args.resources"
73
72
  class="static"
74
73
  />
75
74
  </UCol>
@@ -2,33 +2,51 @@ import { inject, readonly, ref } from "vue";
2
2
 
3
3
  import type { Ref } from "vue";
4
4
 
5
- import { useRequestQueue } from "../composables/useRequestQueue";
5
+ import { getRequestWithoutQuery } from "../utils/requestQueue";
6
6
 
7
7
  type LoaderProgress = {
8
8
  isLoading: Readonly<Ref<boolean, boolean>>;
9
9
  loaderProgressOn: (request: string | string[]) => void;
10
10
  loaderProgressOff: (request: string | string[]) => void;
11
+ progressRequestQueue: Readonly<Ref<readonly string[]>>;
11
12
  };
12
13
 
13
14
  export const LoaderProgressSymbol = Symbol.for("vueless:loader-progress");
14
15
 
15
- const { addToRequestQueue, removeFromRequestQueue } = useRequestQueue();
16
+ const progressRequestQueue = ref<string[]>([]);
17
+
18
+ function addToProgressRequestQueue(url: string | string[]): void {
19
+ Array.isArray(url)
20
+ ? progressRequestQueue.value.push(...url.map(getRequestWithoutQuery))
21
+ : progressRequestQueue.value.push(getRequestWithoutQuery(url));
22
+ }
23
+
24
+ function removeFromProgressRequestQueue(url: string | string[]): void {
25
+ if (Array.isArray(url)) {
26
+ url.map(getRequestWithoutQuery).forEach(removeFromProgressRequestQueue);
27
+ } else {
28
+ progressRequestQueue.value = progressRequestQueue.value.filter(
29
+ (item) => item !== getRequestWithoutQuery(url),
30
+ );
31
+ }
32
+ }
16
33
 
17
34
  const isLoading = ref(true);
18
35
 
19
36
  function loaderProgressOn(request?: string | string[]): void {
20
- request ? addToRequestQueue(request) : (isLoading.value = true);
37
+ request ? addToProgressRequestQueue(request) : (isLoading.value = true);
21
38
  }
22
39
 
23
40
  function loaderProgressOff(request?: string | string[]): void {
24
- request ? removeFromRequestQueue(request) : (isLoading.value = false);
41
+ request ? removeFromProgressRequestQueue(request) : (isLoading.value = false);
25
42
  }
26
43
 
27
44
  export function createLoaderProgress(): LoaderProgress {
28
45
  return {
29
- isLoading: readonly(isLoading),
30
46
  loaderProgressOn,
31
47
  loaderProgressOff,
48
+ isLoading: readonly(isLoading),
49
+ progressRequestQueue: readonly(progressRequestQueue) as Readonly<Ref<readonly string[]>>,
32
50
  };
33
51
  }
34
52