navigation.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import { defineStore } from "pinia";
  2. import { ref, computed, watch } from "vue";
  3. import { Cookies } from "quasar";
  4. import { permissionStore } from "src/stores/permission";
  5. import { userStore } from "src/stores/user";
  6. export const navigationStore = defineStore("navigation", () => {
  7. const miniState = ref(Cookies.get("miniState") === "true");
  8. const toggleMini = () => {
  9. miniState.value = !miniState.value;
  10. };
  11. watch(miniState, (val) => {
  12. Cookies.set("miniState", val, { path: "/", sameSite: "Lax" });
  13. });
  14. const navigationStructure = Object.freeze([
  15. //ADMINISTRADOR
  16. {
  17. type: "single",
  18. title: "ui.navigation.dashboard",
  19. name: "DashboardPage",
  20. icon: "mdi-view-dashboard-outline",
  21. permission: false,
  22. permissionScope: "dashboard",
  23. allowedTypes: ["administrador"],
  24. },
  25. {
  26. type: "single",
  27. title: "ui.navigation.associados",
  28. name: "GestaoAssociadosPage",
  29. icon: "mdi-account-group-outline",
  30. permission: false,
  31. permissionScope: "associado",
  32. allowedTypes: ["administrador"],
  33. },
  34. {
  35. type: "single",
  36. title: "ui.navigation.partners",
  37. name: "ParceirosPage",
  38. icon: "mdi-handshake-outline",
  39. permission: false,
  40. permissionScope: "parceiro",
  41. allowedTypes: ["administrador"],
  42. },
  43. {
  44. type: "single",
  45. title: "ui.navigation.convenios_medicos",
  46. name: "ConveniosMedicosPage",
  47. icon: "mdi-hospital-box-outline",
  48. permission: false,
  49. permissionScope: "parceiro",
  50. allowedTypes: ["administrador"],
  51. },
  52. {
  53. type: "single",
  54. title: "ui.navigation.store",
  55. name: "LojaPage",
  56. icon: "mdi-cart-outline",
  57. permission: false,
  58. permissionScope: "loja",
  59. allowedTypes: ["administrador"],
  60. },
  61. {
  62. type: "single",
  63. title: "ui.navigation.appointments",
  64. name: "AppointmentsPage",
  65. icon: "mdi-calendar-check-outline",
  66. permission: false,
  67. permissionScope: "agendamento",
  68. allowedTypes: ["administrador"],
  69. },
  70. {
  71. type: "single",
  72. title: "ui.navigation.notifications",
  73. name: "NotificationsAdminPage",
  74. icon: "mdi-bell-outline",
  75. permission: false,
  76. permissionScope: "notificacao",
  77. allowedTypes: ["administrador"],
  78. },
  79. {
  80. type: "single",
  81. title: "ui.navigation.relatorios",
  82. name: "RelatoriosPage",
  83. icon: "mdi-chart-bar",
  84. permission: false,
  85. permissionScope: "relatorio",
  86. allowedTypes: ["administrador"],
  87. },
  88. {
  89. type: "single",
  90. title: "ui.navigation.company_settings",
  91. name: "CompanySettingsPage",
  92. icon: "mdi-cog-outline",
  93. permission: false,
  94. permissionScope: "configuracoes-empresa",
  95. allowedTypes: ["administrador"],
  96. },
  97. //ASSOCIADO
  98. {
  99. type: "single",
  100. title: "ui.navigation.meu_perfil",
  101. name: "MeuPerfilPage",
  102. icon: "mdi-account-outline",
  103. permission: false,
  104. permissionScope: "associado.perfil",
  105. allowedTypes: ["associado"],
  106. },
  107. {
  108. type: "single",
  109. title: "ui.navigation.carteirinha",
  110. name: "CarteirinhaPage",
  111. icon: "mdi-card-account-details-outline",
  112. permission: false,
  113. permissionScope: "associado.carteirinha",
  114. allowedTypes: ["associado"],
  115. },
  116. {
  117. type: "single",
  118. title: "ui.navigation.convenios",
  119. name: "ConveniosPage",
  120. icon: "mdi-heart-outline",
  121. permission: false,
  122. permissionScope: "associado.convenio",
  123. allowedTypes: ["associado"],
  124. },
  125. {
  126. type: "single",
  127. title: "ui.navigation.loja",
  128. name: "AssociadoLojaPage",
  129. icon: "mdi-cart-outline",
  130. permission: false,
  131. permissionScope: "associado.loja",
  132. allowedTypes: ["associado"],
  133. },
  134. {
  135. type: "single",
  136. title: "ui.navigation.meus_interesses",
  137. name: "AssociadoInteressesPage",
  138. icon: "mdi-heart-outline",
  139. permission: false,
  140. permissionScope: "associado.interesses",
  141. allowedTypes: ["associado"],
  142. },
  143. {
  144. type: "single",
  145. title: "ui.navigation.meus_agendamentos",
  146. name: "AssociadoAgendamentosPage",
  147. icon: "mdi-calendar-clock-outline",
  148. permission: false,
  149. permissionScope: "associado.agendamento",
  150. allowedTypes: ["associado"],
  151. },
  152. {
  153. type: "single",
  154. title: "ui.navigation.notifications",
  155. name: "NotificacoesAssociadoPage",
  156. icon: "mdi-bell-outline",
  157. permission: false,
  158. permissionScope: "associado.notificacao",
  159. allowedTypes: ["associado"],
  160. },
  161. //PARCEIRO
  162. {
  163. type: "single",
  164. title: "ui.navigation.dashboard",
  165. name: "ParceiroHomePage",
  166. icon: "mdi-view-dashboard-outline",
  167. permission: false,
  168. permissionScope: "dashboard",
  169. allowedTypes: ["parceiro"],
  170. },
  171. {
  172. type: "single",
  173. title: "ui.navigation.validar_carteirinha",
  174. name: "ValidarCarteirinhaPage",
  175. icon: "mdi-check",
  176. permission: false,
  177. permissionScope: "parceiro.carteirinha",
  178. allowedTypes: ["parceiro"],
  179. },
  180. {
  181. type: "single",
  182. title: "ui.navigation.appointments",
  183. name: "AgendamentosPage",
  184. icon: "mdi-calendar-clock-outline",
  185. permission: false,
  186. permissionScope: "parceiro.agendamento",
  187. allowedTypes: ["parceiro"],
  188. },
  189. {
  190. type: "single",
  191. title: "ui.navigation.meus_dados",
  192. name: "MeusDadosPage",
  193. icon: "mdi-account-box-outline",
  194. permission: false,
  195. permissionScope: "parceiro.dados",
  196. allowedTypes: ["parceiro"],
  197. },
  198. {
  199. type: "single",
  200. title: "ui.navigation.notifications",
  201. name: "NotificacoesPage",
  202. icon: "mdi-bell-outline",
  203. permission: false,
  204. permissionScope: "parceiro.notificacao",
  205. allowedTypes: ["parceiro"],
  206. },
  207. ]);
  208. const getNavigationAccess = () => {
  209. const { getAccess } = permissionStore();
  210. const { userTipo } = userStore();
  211. return navigationStructure
  212. .filter((menu) => {
  213. if (!menu.allowedTypes || menu.allowedTypes.length === 0) return true;
  214. return menu.allowedTypes.includes(userTipo);
  215. })
  216. .map((menu) => {
  217. if (menu.type === "expansive") {
  218. if (getAccess(menu.permissionScope, "menu")) menu.permission = true;
  219. menu.childrens = menu.childrens.filter((child) => {
  220. if (!child?.permissionScope) return true;
  221. child.permission = getAccess(child.permissionScope, "menu");
  222. return child.permission;
  223. });
  224. return menu.childrens.length > 0 ? menu : null;
  225. } else {
  226. if (!menu?.permissionScope) return menu;
  227. menu.permission = getAccess(menu.permissionScope, "menu");
  228. return menu;
  229. }
  230. })
  231. .filter((menu) => menu !== null && menu.permission);
  232. };
  233. const navigationItems = computed(() => getNavigationAccess());
  234. return {
  235. miniState,
  236. toggleMini,
  237. navigationItems,
  238. };
  239. });