floder-type.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { computed, ref } from "vue";
  2. import { fetchFloderTypes } from "@/api";
  3. import type { FloderTypes, FloderType, Floder } from "@/api";
  4. import { getFloderByType } from "./floder";
  5. import { getUrlType, MetaType } from "@/utils";
  6. export const floderTypes = ref<FloderTypes>([]);
  7. export const getFloderType = (id: FloderType["filesTypeId"]) =>
  8. floderTypes.value.find((type) => type.filesTypeId === id);
  9. export const initialFloderTypes = async () => {
  10. floderTypes.value = await fetchFloderTypes();
  11. };
  12. export type FloderRoot = {
  13. flat: boolean,
  14. modal: boolean
  15. id: number;
  16. title: string;
  17. floders: (ReturnType<typeof getFloderByType>[number] & { metaType: MetaType })[];
  18. children?: FloderRoot[];
  19. };
  20. const gemerateRoot = (parentId: number | null = null) => {
  21. const items: FloderRoot[] = [];
  22. for (let i = 0; i < floderTypes.value.length; i++) {
  23. const type = floderTypes.value[i];
  24. if (type.parentId === parentId) {
  25. const item = {
  26. id: type.filesTypeId,
  27. title: type.filesTypeName,
  28. flat: !!type.flatShow,
  29. modal: !!type.modalShow,
  30. floders: getFloderByType(type).map((floder) => ({
  31. ...floder,
  32. metaType: getUrlType(floder.filesUrl),
  33. })),
  34. children: gemerateRoot(type.filesTypeId)
  35. };
  36. items.push(item)
  37. }
  38. }
  39. return items
  40. };
  41. export const floderRoots = computed(gemerateRoot);
  42. export const getLevelRoot = (floder: Floder, roots = floderRoots.value): FloderRoot | undefined => {
  43. for (const root of roots) {
  44. if (root.floders.some(f => f.filesId === floder.filesId)) {
  45. return root;
  46. } else if (root.children?.length) {
  47. const cRoot = getLevelRoot(floder, root.children)
  48. if (cRoot) {
  49. return cRoot
  50. }
  51. }
  52. }
  53. }
  54. export const getFlatFloders = (root: FloderRoot, floders: FloderRoot['floders'] = []) => {
  55. floders.push(...root.floders)
  56. if (root.children?.length) {
  57. root.children.forEach(child => getFlatFloders(child, floders))
  58. }
  59. return floders
  60. }
  61. export type { FloderType, FloderTypes };