client.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // @ts-ignore Import module
  2. import { createApp, reactive } from 'https://unpkg.com/petite-vue?module'
  3. export interface PeridoV1 {
  4. IdNivel: number;
  5. IdPeriodo: number;
  6. NombreNivel: string;
  7. NombrePeriodo: string;
  8. in_db: boolean;
  9. linked: boolean;
  10. }
  11. export interface PeridoV2 {
  12. ClaveCarrera: string;
  13. FechaFin: string;
  14. FechaInicio: string;
  15. IdPeriodo: number;
  16. NombreCarrera: string;
  17. }
  18. const webServices = {
  19. getPeriodosV1: async (): Promise<PeridoV1[]> => {
  20. try {
  21. const response = await fetch('periodos.v1.php');
  22. return await response.json();
  23. } catch (error) {
  24. console.log(error);
  25. return [];
  26. }
  27. },
  28. getPeriodosV2: async (): Promise<PeridoV2[]> => {
  29. try {
  30. const response = await fetch('periodos.v2.php');
  31. return await response.json();
  32. } catch (error) {
  33. console.log(error);
  34. return [];
  35. }
  36. }
  37. }
  38. const store = reactive({
  39. periodosV1: [] as PeridoV1[],
  40. periodosV2: [] as PeridoV2[],
  41. errors: [] as string[],
  42. fechas(idPeriodo: number): { inicio: string, fin: string } {
  43. const periodo = this.periodosV2.find((periodo: PeridoV2) => periodo.IdPeriodo === idPeriodo);
  44. return {
  45. inicio: periodo ? periodo.FechaInicio : '',
  46. fin: periodo ? periodo.FechaFin : ''
  47. }
  48. },
  49. periodov1(idPeriodo: number): PeridoV1 | undefined {
  50. return this.periodosV1.find((periodo: PeridoV1) => periodo.IdPeriodo === idPeriodo);
  51. },
  52. periodov2(idPeriodo: number): PeridoV2[] {
  53. return this.periodosV2.filter((periodo: PeridoV2) => periodo.IdPeriodo === idPeriodo);
  54. },
  55. async addPeriodo(periodo: PeridoV1 | PeridoV2) {
  56. try {
  57. const result = await fetch('backend/periodos.php', {
  58. method: 'POST',
  59. body: JSON.stringify({
  60. ...periodo,
  61. ...this.fechas(periodo.IdPeriodo)
  62. }),
  63. headers: {
  64. 'Content-Type': 'application/json'
  65. }
  66. }).then((response) => response.json());
  67. if (result.success) {
  68. this.periodosV1 = this.periodosV1.map((periodoV1: PeridoV1) => {
  69. if (periodoV1.IdPeriodo === periodo.IdPeriodo) {
  70. periodoV1.in_db = true;
  71. }
  72. return periodoV1;
  73. });
  74. return result;
  75. }
  76. else {
  77. this.errors.push(result.message);
  78. }
  79. } catch (error) {
  80. this.errors.push(error);
  81. }
  82. },
  83. async addCarreras(idPeriodo: number) {
  84. try {
  85. const periodoV1 = this.periodov1(idPeriodo) as PeridoV1;
  86. const periodoV2 = this.periodov2(idPeriodo) as PeridoV2[];
  87. const data = periodoV2.map(({ ClaveCarrera, NombreCarrera }: PeridoV2) =>
  88. ({
  89. ClaveCarrera: ClaveCarrera,
  90. NombreCarrera: NombreCarrera,
  91. IdNivel: periodoV1.IdNivel,
  92. })
  93. );
  94. const result = await fetch('backend/carreras.php', {
  95. method: 'POST',
  96. body: JSON.stringify(data),
  97. headers: {
  98. 'Content-Type': 'application/json'
  99. }
  100. }).then((response) => response.json());
  101. if (result.success) {
  102. await webServices.getPeriodosV1().then((periodosV1) => {
  103. this.periodosV1 = periodosV1;
  104. });
  105. await webServices.getPeriodosV2().then((periodosV2) => {
  106. this.periodosV2 = periodosV2;
  107. });
  108. }
  109. } catch (error) {
  110. this.errors.push(error);
  111. }
  112. }
  113. })
  114. createApp({
  115. store,
  116. info(IdPeriodo: number): PeridoV2 {
  117. const periodo = store.periodosV2.find((periodo: PeridoV2) => periodo.IdPeriodo === IdPeriodo &&
  118. periodo.FechaInicio != '' && periodo.FechaFin != '');
  119. return periodo
  120. },
  121. complete(IdPeriodo: number): boolean {
  122. const info = this.info(IdPeriodo);
  123. return info !== undefined;
  124. },
  125. mounted: async () => {
  126. await webServices.getPeriodosV1().then((periodosV1) => {
  127. store.periodosV1 = periodosV1;
  128. });
  129. await webServices.getPeriodosV2().then((periodosV2) => {
  130. store.periodosV2 = periodosV2;
  131. });
  132. }
  133. }).mount()