@vc-shell/framework 1.0.71 → 1.0.72

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 (44) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/core/composables/usePermissions/index.ts +21 -8
  3. package/core/composables/useUser/index.ts +5 -4
  4. package/core/plugins/modularity/index.ts +17 -2
  5. package/core/utilities/index.ts +1 -0
  6. package/core/utilities/kebabToCamel.ts +7 -0
  7. package/dist/core/composables/usePermissions/index.d.ts +1 -2
  8. package/dist/core/composables/usePermissions/index.d.ts.map +1 -1
  9. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  10. package/dist/core/plugins/modularity/index.d.ts +4 -1
  11. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  12. package/dist/core/utilities/index.d.ts +1 -0
  13. package/dist/core/utilities/index.d.ts.map +1 -1
  14. package/dist/core/utilities/kebabToCamel.d.ts +2 -0
  15. package/dist/core/utilities/kebabToCamel.d.ts.map +1 -0
  16. package/dist/framework.mjs +11483 -11161
  17. package/dist/index.css +1 -1
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts +5 -7
  21. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts.map +1 -1
  22. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts +5 -5
  23. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
  24. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts +20 -4
  25. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  26. package/dist/shared/components/blade-navigation/types/index.d.ts +1 -1
  27. package/dist/shared/components/blade-navigation/types/index.d.ts.map +1 -1
  28. package/dist/tsconfig.tsbuildinfo +1 -1
  29. package/dist/ui/components/atoms/vc-link/vc-link.stories.d.ts.map +1 -1
  30. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  31. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  32. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  33. package/package.json +5 -4
  34. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +6 -10
  35. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +148 -62
  36. package/shared/components/blade-navigation/types/index.ts +1 -1
  37. package/shared/pages/LoginPage/components/login/Login.vue +1 -1
  38. package/ui/components/atoms/vc-link/vc-link.stories.ts +0 -1
  39. package/ui/components/atoms/vc-link/vc-link.vue +2 -2
  40. package/ui/components/molecules/vc-select/vc-select.vue +3 -3
  41. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +1 -0
  42. package/ui/components/organisms/vc-app/vc-app.vue +6 -3
  43. package/dist/injectionSymbols.d.ts +0 -6
  44. package/dist/injectionSymbols.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [1.0.72](https://github.com/VirtoCommerce/vc-shell/compare/v1.0.71...v1.0.72) (2023-06-07)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * authData length check ([bd04284](https://github.com/VirtoCommerce/vc-shell/commit/bd04284fd91887a41ba99f52bd37d844a13c2e8a))
7
+ * vc-app-bar mobile styles ([75955d4](https://github.com/VirtoCommerce/vc-shell/commit/75955d4cb9692a3430395f8dbf5943b5c2eb8f36))
8
+ * vc-select dropdown closing ([ecde06f](https://github.com/VirtoCommerce/vc-shell/commit/ecde06ffd679d06f7d8f75304437510f4e46063c))
9
+
10
+
11
+ ### Features
12
+
13
+ * blade nav last state, permissions ([d98144a](https://github.com/VirtoCommerce/vc-shell/commit/d98144a2e5f2b4241543f7624fc7d811aa3f951f))
14
+
15
+
16
+
1
17
  ## [1.0.71](https://github.com/VirtoCommerce/vc-shell/compare/v1.0.70...v1.0.71) (2023-06-02)
2
18
 
3
19
 
@@ -1,32 +1,45 @@
1
+ import { Ref, ref } from "vue";
1
2
  import { useUser } from "./../useUser";
2
- import { computed, ComputedRef } from "vue";
3
3
 
4
4
  interface IUsePermissions {
5
- readonly userPermissions: ComputedRef<string[]>;
6
5
  checkPermission(permissions: string | string[]): boolean;
6
+ fetchUserPermissions(): Promise<void>;
7
7
  }
8
-
8
+ const userPermissions: Ref<string[]> = ref([]);
9
9
  export function usePermissions(): IUsePermissions {
10
- const { user } = useUser();
10
+ const { user, loadUser } = useUser();
11
+
12
+ async function fetchUserPermissions() {
13
+ if (user.value?.permissions) {
14
+ userPermissions.value = user.value?.permissions;
15
+ } else {
16
+ try {
17
+ const userData = await loadUser();
18
+ userPermissions.value = userData.permissions;
19
+ } catch (e) {
20
+ throw new Error("Unable to load user permissions");
21
+ }
22
+ }
23
+ }
11
24
 
12
25
  function checkPermission(permissions: string | string[] | undefined) {
13
26
  if (!permissions) {
14
27
  return true;
15
28
  } else if (permissions || (permissions && permissions instanceof Array)) {
16
29
  if (typeof permissions === "string") {
17
- return user.value?.permissions.includes(permissions);
30
+ return userPermissions.value?.includes(permissions);
18
31
  } else if (permissions.length > 0) {
19
- return user.value?.permissions.some((role) => {
32
+ return userPermissions.value?.some((role) => {
20
33
  return permissions.includes(role);
21
34
  });
22
35
  }
23
36
  } else {
24
- console.error("Permissions must be a string or strings array");
37
+ throw new Error("Permissions must be a string or strings array");
25
38
  }
26
39
  }
27
40
 
28
41
  return {
29
- userPermissions: computed(() => user.value?.permissions),
30
42
  checkPermission,
43
+ fetchUserPermissions,
31
44
  };
32
45
  }
@@ -156,8 +156,8 @@ export function useUser(): IUseUser {
156
156
 
157
157
  async function getAccessToken(): Promise<string | null> {
158
158
  console.debug(`[@vc-shell/framework#useUser:getAccessToken] - Entry point`);
159
- if (!authData.value) {
160
- authData.value = readAuthData();
159
+ if (!authData.value || Object.keys(authData.value).length === 0) {
160
+ authData.value = await readAuthData();
161
161
  }
162
162
 
163
163
  if (authData.value && Date.now() >= (authData.value.expiresAt ?? 0)) {
@@ -166,6 +166,7 @@ export function useUser(): IUseUser {
166
166
  authData.value.refreshToken ?? "",
167
167
  {}
168
168
  );
169
+
169
170
  console.log("[useUser]: an access token is expired, using refresh token to receive a new");
170
171
  try {
171
172
  const newToken = await token.refresh();
@@ -190,8 +191,8 @@ export function useUser(): IUseUser {
190
191
  function storeAuthData(authData: AuthData) {
191
192
  localStorage.setItem(VC_AUTH_DATA_KEY, JSON.stringify({ ...(authData || {}) }));
192
193
  }
193
- function readAuthData(): AuthData {
194
- return JSON.parse(localStorage.getItem(VC_AUTH_DATA_KEY) || "{}") as AuthData;
194
+ async function readAuthData(): Promise<AuthData> {
195
+ return (await JSON.parse(localStorage.getItem(VC_AUTH_DATA_KEY) || "{}")) as AuthData;
195
196
  }
196
197
 
197
198
  function addOffsetToCurrentDate(offsetInSeconds: number): number {
@@ -1,5 +1,8 @@
1
1
  import { App } from "vue";
2
2
  import { i18n } from "./../i18n";
3
+ import { Router } from "vue-router";
4
+ import { BladeConstructor } from "./../../../shared/components/blade-navigation/types";
5
+ import { kebabToPascal } from "./../../utilities";
3
6
 
4
7
  export const createModule = (components: unknown, locales?: unknown) => ({
5
8
  install(app: App): void {
@@ -21,10 +24,22 @@ export const createAppModule = (pages: unknown, locales?: unknown, notificationT
21
24
  const module = createModule(pages, locales);
22
25
 
23
26
  return {
24
- install(app: App): void {
27
+ install(app: App, options: { router: Router }): void {
28
+ const { router } = options;
25
29
  // Register pages
26
- Object.entries(pages).forEach(([, page]) => {
30
+ Object.entries(pages).forEach(([, page]: [string, BladeConstructor]) => {
27
31
  app.config.globalProperties.pages?.push(page);
32
+
33
+ // Dynamically add pages to vue router
34
+ if (page.url) {
35
+ const mainRouteName = router.getRoutes().find((r) => r.meta?.root)?.name;
36
+
37
+ router.addRoute(mainRouteName, {
38
+ name: kebabToPascal(page.url.substring(1)),
39
+ path: page.url.substring(1),
40
+ component: page,
41
+ });
42
+ }
28
43
  });
29
44
 
30
45
  if (notificationTemplates) {
@@ -1 +1,2 @@
1
1
  export * from "./camelToSnake";
2
+ export * from "./kebabToCamel";
@@ -0,0 +1,7 @@
1
+ const kebabToCamel = (str: string) => str.replace(/-./g, (x) => x[1].toUpperCase());
2
+
3
+ export function kebabToPascal(str: string) {
4
+ const camelCase = kebabToCamel(str);
5
+ const pascalCase = camelCase[0].toUpperCase() + camelCase.substr(1);
6
+ return pascalCase;
7
+ }
@@ -1,7 +1,6 @@
1
- import { ComputedRef } from "vue";
2
1
  interface IUsePermissions {
3
- readonly userPermissions: ComputedRef<string[]>;
4
2
  checkPermission(permissions: string | string[]): boolean;
3
+ fetchUserPermissions(): Promise<void>;
5
4
  }
6
5
  export declare function usePermissions(): IUsePermissions;
7
6
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/usePermissions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,WAAW,EAAE,MAAM,KAAK,CAAC;AAE5C,UAAU,eAAe;IACvB,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;CAC1D;AAED,wBAAgB,cAAc,IAAI,eAAe,CAuBhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/usePermissions/index.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACzD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAgB,cAAc,IAAI,eAAe,CAoChD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useUser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,GAAG,EAAO,WAAW,EAAmC,MAAM,KAAK,CAAC;AAEvF,OAAO,EACL,UAAU,EAGV,cAAc,EAEd,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAY,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmB/E,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAChE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnG,oBAAoB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/E,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1F,yBAAyB,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAClG,eAAe,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACnE,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,sBAAsB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,qBAAqB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,wBAAgB,OAAO,IAAI,QAAQ,CA2UlC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useUser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,GAAG,EAAO,WAAW,EAAmC,MAAM,KAAK,CAAC;AAEvF,OAAO,EACL,UAAU,EAGV,cAAc,EAEd,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAY,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmB/E,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAChE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnG,oBAAoB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/E,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1F,yBAAyB,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAClG,eAAe,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACnE,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,sBAAsB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,qBAAqB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,wBAAgB,OAAO,IAAI,QAAQ,CA4UlC"}
@@ -1,8 +1,11 @@
1
1
  import { App } from "vue";
2
+ import { Router } from "vue-router";
2
3
  export declare const createModule: (components: unknown, locales?: unknown) => {
3
4
  install(app: App): void;
4
5
  };
5
6
  export declare const createAppModule: (pages: unknown, locales?: unknown, notificationTemplates?: unknown) => {
6
- install(app: App): void;
7
+ install(app: App, options: {
8
+ router: Router;
9
+ }): void;
7
10
  };
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/plugins/modularity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG1B,eAAO,MAAM,YAAY,eAAgB,OAAO,YAAY,OAAO;iBACpD,GAAG,GAAG,IAAI;CAavB,CAAC;AAEH,eAAO,MAAM,eAAe,UAAW,OAAO,YAAY,OAAO,0BAA0B,OAAO;iBAIjF,GAAG,GAAG,IAAI;CAe1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/plugins/modularity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpC,eAAO,MAAM,YAAY,eAAgB,OAAO,YAAY,OAAO;iBACpD,GAAG,GAAG,IAAI;CAavB,CAAC;AAEH,eAAO,MAAM,eAAe,UAAW,OAAO,YAAY,OAAO,0BAA0B,OAAO;iBAIjF,GAAG,WAAW;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CA2BvD,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from "./camelToSnake";
2
+ export * from "./kebabToCamel";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../core/utilities/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../core/utilities/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function kebabToPascal(str: string): string;
2
+ //# sourceMappingURL=kebabToCamel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kebabToCamel.d.ts","sourceRoot":"","sources":["../../../core/utilities/kebabToCamel.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,UAIxC"}