search.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. import React, { Component } from "react";
  2. import Router from "next/router";
  3. import ContentWrapper from "@/components/Layout/ContentWrapper";
  4. import { Row, Col, Button, Table, Pagination, PaginationItem, PaginationLink } from "reactstrap";
  5. // React Slider
  6. import Slider from "rc-slider";
  7. import "rc-slider/assets/index.css";
  8. // React Select
  9. import Select from "react-select";
  10. // DateTimePicker
  11. import Datetime from "react-datetime";
  12. import "react-datetime/css/react-datetime.css";
  13. import https from "https";
  14. import CardTool from "@/components/Common/CardTool";
  15. import dummyData from "./PT-ID.json";
  16. var pembina = [];
  17. class Search extends Component {
  18. static async getInitialProps(ctx) {
  19. pembina = [];
  20. const httpsAgent = new https.Agent({
  21. rejectUnauthorized: false,
  22. });
  23. // const res = await fetch('https://api.kemdikbud.go.id:8243/pddikti/1.2/lembaga-non-sp', {
  24. // method: 'get',
  25. // headers: new Headers({
  26. // 'Authorization': 'Bearer 5b62f743-eef2-3370-8c66-6951b2e9c2c5',
  27. // 'Accept': 'application/json'
  28. // }),
  29. // agent: httpsAgent
  30. // }
  31. // )
  32. // const jsonPembina = await res.json();
  33. //jsonPembina = JSON.parse(jsonPembina);
  34. // id: "ABEAE958-4F20-40EF-B145-B8014EC98D8F",nama: "Badan Intelijen Negara",singkatan: "BIN"
  35. // { value: 'australian-capital-territory', label: 'Australian Capital Territory', className: 'State-ACT' },
  36. // var numrows = jsonPembina.length;
  37. // for (var i = 0; i < numrows; i++) {
  38. // pembina.push({ value: jsonPembina[i].id, label: jsonPembina[i].nama, className: "State-" + jsonPembina[i].singkatan });
  39. // }
  40. // console.log("pembina : ", pembina);
  41. //return { data: json }
  42. }
  43. state = {
  44. selectedOptionMulti: [],
  45. data: [],
  46. };
  47. handleChangeSelectMulti = (selectedOptionMulti) => {
  48. this.setState({ selectedOptionMulti });
  49. };
  50. renderInputGroup = (props) => {
  51. return (
  52. <div className="input-group date">
  53. <input className="form-control" {...props} />
  54. <span className="input-group-append input-group-addon">
  55. <span className="input-group-text fas fa-calendar-alt"></span>
  56. </span>
  57. </div>
  58. );
  59. };
  60. handleClick = (e, PT_ID) => {
  61. //router = useRouter();
  62. const query = { ptId: PT_ID };
  63. // '/app/profile'
  64. e.preventDefault();
  65. Router.push({
  66. pathname: "/app/profile-pt",
  67. query: { ptId: PT_ID },
  68. });
  69. };
  70. fetchData = async () => {
  71. var qPembina = "";
  72. console.log("this.state.selectedOptionMulti.value : ", this.state.selectedOptionMulti.value);
  73. if (this.state.selectedOptionMulti.value !== undefined) {
  74. qPembina = "&pembina=" + this.state.selectedOptionMulti.value;
  75. }
  76. //console.log('qpembina : ', qPembina);
  77. const searchValue = "q=" + document.getElementById("searchInput").value;
  78. const httpsAgent = new https.Agent({
  79. rejectUnauthorized: false,
  80. });
  81. //console.log('post agent : ');
  82. //const res = await fetch('https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/707C3895-B546-4DA5-A6A7-EFE7461A7C7E', {
  83. // const res = await fetch("https://api.kemdikbud.go.id:8243/pddikti/1.2/pt?" + searchValue + qPembina, {
  84. // method: "get",
  85. // headers: new Headers({
  86. // Authorization: "Bearer 5b62f743-eef2-3370-8c66-6951b2e9c2c5",
  87. // Accept: "application/json",
  88. // }),
  89. // agent: httpsAgent,
  90. // });
  91. const jsonData = dummyData;
  92. this.setState({ data: jsonData });
  93. //console.log('jsonData : ', jsonData);
  94. //Get unique for filter by pembina
  95. // const uniquePembina = [
  96. // new Set(jsonData.map(
  97. // item => item.pembina.nama
  98. // ))
  99. // ]
  100. };
  101. handleApplyClick = () => {
  102. console.log("selectedOptionMulti : ", this.state.selectedOptionMulti);
  103. //const dataTables = this.fetchData().jsonData;
  104. this.fetchData();
  105. //console.log('this.state.data :', this.state.data);
  106. if (this.state.data.length > 0) {
  107. this.renderTableData();
  108. }
  109. };
  110. handleSearchClick = () => {
  111. //const dataTables = this.fetchData().jsonData;
  112. this.fetchData();
  113. //console.log('this.state.data :', this.state.data);
  114. if (this.state.data.length > 0) {
  115. this.renderTableData();
  116. }
  117. };
  118. renderTableData() {
  119. //const dataTable = this.props.data;
  120. //if (dataTable === true ) {
  121. return this.state.data.map((pt, index) => {
  122. return (
  123. <tr>
  124. <td>
  125. <label>{index + 1}</label>
  126. </td>
  127. <td>
  128. <div className="media align-items-center">
  129. <a className="mr-3" href="">
  130. <img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
  131. </a>
  132. <div className="media-body d-flex">
  133. <div>
  134. <h4 className="m-0">{pt.nama}</h4>
  135. <small className="text-muted">
  136. {pt.sk_pendirian} - {pt.website} - {pt.email}
  137. </small>
  138. <p>{pt.alamat.jalan}</p>
  139. </div>
  140. <div className="ml-auto">
  141. <Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
  142. View
  143. </Button>
  144. </div>
  145. </div>
  146. </div>
  147. </td>
  148. </tr>
  149. );
  150. });
  151. //}
  152. }
  153. render() {
  154. // used for react select
  155. const { selectedOptionMulti } = this.state;
  156. return (
  157. <ContentWrapper>
  158. <div className="content-heading">
  159. <div>
  160. Search
  161. <small>Search and filter results</small>
  162. </div>
  163. </div>
  164. <Row>
  165. <Col lg="9">
  166. <div className="form-group mb-4">
  167. <input className="form-control mb-2" type="text" id="searchInput" placeholder="Pencarian Nama Perguruan Tinggi" />
  168. <div className="d-flex">
  169. <button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>
  170. Search
  171. </button>
  172. <div className="ml-auto">
  173. {/* <label className="c-checkbox">
  174. <input id="inlineCheckbox10" type="checkbox" defaultValue="option1"/>
  175. <span className="fa fa-check"></span>Nama Perguruan Tinggi</label> */}
  176. {/* <label className="c-checkbox">
  177. <input id="inlineCheckbox20" type="checkbox" defaultValue="option2"/>
  178. <span className="fa fa-check"></span>Pembina</label> */}
  179. {/* <label className="c-checkbox">
  180. <input id="inlineCheckbox30" type="checkbox" defaultValue="option3"/>
  181. <span className="fa fa-check"></span>Apps</label> */}
  182. </div>
  183. </div>
  184. </div>
  185. {/* START card */}
  186. <div className="card card-default">
  187. <div className="card-header">
  188. {/* <CardTool refresh onRefresh={(_,done) => setTimeout(done,2000)}/> */}
  189. Search Results
  190. </div>
  191. {/* START table-responsive */}
  192. <Table striped bordered hover>
  193. <thead>
  194. <tr>
  195. {/* <th data-check-all="" className="wd-xxs">
  196. <div className="checkbox c-checkbox">
  197. <label className="m-0">
  198. <input type="checkbox"/>
  199. <span className="fa fa-check"></span>
  200. </label>
  201. </div>
  202. </th> */}
  203. <th>No. </th>
  204. <th>Description</th>
  205. </tr>
  206. </thead>
  207. <tbody>{this.renderTableData()}</tbody>
  208. </Table>
  209. {/* END table-responsive */}
  210. <div className="card-footer">
  211. <div className="d-flex">
  212. {/* <button className="btn btn-sm btn-secondary">Clear</button> */}
  213. {/* <nav className="ml-auto">
  214. <Pagination size="sm">
  215. <PaginationItem active>
  216. <PaginationLink>1</PaginationLink>
  217. </PaginationItem>
  218. <PaginationItem>
  219. <PaginationLink>2</PaginationLink>
  220. </PaginationItem>
  221. <PaginationItem>
  222. <PaginationLink>3</PaginationLink>
  223. </PaginationItem>
  224. <PaginationItem>
  225. <PaginationLink next>»</PaginationLink>
  226. </PaginationItem>
  227. </Pagination>
  228. </nav> */}
  229. </div>
  230. </div>
  231. </div>
  232. {/* END card */}
  233. </Col>
  234. <Col lg="3">
  235. <h3 className="m-0 pb-3">Filters</h3>
  236. <div className="form-group mb-4">
  237. <label className="col-form-label mb-2">by Pembina</label>
  238. <br />
  239. <Select name="multi-select-name" multi simpleValue value={selectedOptionMulti} onChange={this.handleChangeSelectMulti} options={pembina} />
  240. </div>
  241. <Button color="secondary" size="lg" onClick={(e) => this.handleApplyClick()}>
  242. Apply
  243. </Button>
  244. </Col>
  245. </Row>
  246. </ContentWrapper>
  247. );
  248. }
  249. }
  250. export default Search;