Skip to content
Snippets Groups Projects
SearchPage.tsx 9.57 KiB
Newer Older
import { AudioOutlined } from "@ant-design/icons";
import { SearchOutlined } from '@ant-design/icons';
import {
  Button,
  Card,
  Col,
  Form,
  Input,
  List,
  Row,
  Select,
  Slider,
  Space,
  Table,
  Typography,
} from "antd";
import React, { useState } from "react";
import { Link } from "react-router-dom";
import { cardsDataExample, CategoryIO, DirectorIO, MovieIO } from "./Preview";

const { Search } = Input;
const { Option } = Select;
Tomáš Havlíček's avatar
Tomáš Havlíček committed

//TODO replace with result of input search and API call
const resultsExample: MovieIO[] = [
  {
    id: "789",
    name: "Saw",
    originalName: "Saw",
    intro: "Jigsaw is the bad guy and this is the game",
    picture:
      "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse3.mm.bing.net%2Fth%3Fid%3DOIP.Jo6M-3oyAlMsB4-F__Z9bwHaHa%26pid%3DApi&f=1",
    published: "1.6.2000",
    runtimeMinutes: 120,
    director: {
      id: "123456789",
      name: "Karel",
      surname: "Macka",
      birthdate: "20.2.1987",
    },
  },
  {
    id: "999",
    name: "Saw 2",
    originalName: "Saw 2",
    intro: "The sequel to the first one",
    picture:
      "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fimages01.kaleidescape.com%2Ftransformed%2Fcovers%2F1134x1624s%2F189%2F18976008.jpg&f=1&nofb=1",
    published: "1.1.2002",
    runtimeMinutes: 150,
    director: {
      id: "123456789",
      name: "Karel",
      surname: "Vomacka",
      birthdate: "20.2.1987",
    },
  },
];
//replace with api call only once
const categoriesList: CategoryIO[] = [
  {
    id: "123",
    name: "Horror",
    movies: [],
  },
  {
    id: "1231",
    name: "Comedy",
    movies: [],
  },
  {
    id: "1232",
    name: "Drama",
    movies: [],
  },
  {
    id: "1234",
    name: "Romcom",
    movies: [],
  },
  {
    id: "1235",
    name: "Western",
    movies: [],
  },
  {
    id: "1236",
    name: "Documentary",
    movies: [],
  },
  {
    id: "1237",
    name: "Adam Sandler",
    movies: [],
  },
  {
    id: "1238",
    name: "Czech",
    movies: [],
  },
];

//replace with api call only once
const directorsList: DirectorIO[] = [{
  name: "Karel1",
  surname: "Vomacka",
  birthdate: "17.5.1979",
  id: "1561",
},{
  name: "Karel2",
  surname: "Vomacka",
  birthdate: "17.5.1979",
  id: "1562",
},{
  name: "Karel3",
  surname: "Vomacka",
  birthdate: "17.5.1979",
  id: "1563",
},{
  name: "Karel4",
  surname: "Vomacka",
  birthdate: "17.5.1979",
  id: "1564",
},{
  name: "Karel5",
  surname: "Vomacka",
  birthdate: "17.5.1979",
  id: "1565",
},{
  name: "Karel6",
  surname: "Vomacka",
  birthdate: "17.5.1979",
  id: "1566",
},

]

const runtimeMarks = {
  0: "0",
  30: "30",
  60: "60",
  90: "90",
  120: "120",
  150: "150",
  180: "180",
  210: "210",
  240: "240",
  270: "270",
  300: "300",
};

const yearMarks = {
  1920: "1920",
  1940: "1940",
  1960: "1960",
  1980: "1980",
  2000: "2000",
  2020: "2020",
};

//for searching movies
export const SearchPage = () => {
  const [pressed, setPressed] = useState(true); //may modify or delte in future
  const [searchValue, setSearch] = useState("");

  //function that happens when search button is pressed
  const onSearch = (value: string) => {
    console.log(searchValue); // just debug tool
    setPressed(true);
  }; // API request search goes here - request search with value inside variable "searchValue"
  //columns stays the same
  const columns = [
    {
      title: "Name",
      dataIndex: "name",
      sorter: (a: MovieIO, b: MovieIO) => {
        if (a.name < b.name) {
          return -1;
        }
        if (a.name > b.name) {
          return 1;
        }
      render: (text: string, record: MovieIO) => (
        <Link to={`/movie/${record.id}`}>
          <a>{record.name}</a>
        </Link>
      ),
    },
    {
      title: "Original name",
      className: "original-name",
      dataIndex: "originalName",
      sorter: (a: MovieIO, b: MovieIO) => {
        if (a.originalName < b.originalName) {
          return -1;
        }
        if (a.originalName > b.originalName) {
          return 1;
        }
    },
    {
      title: "Release Date",
      dataIndex: "published",
      sorter: (a: MovieIO, b: MovieIO) => {
        const first = a.published.split(".").reverse();
        const second = b.published.split(".").reverse();
        if (first[0] > second[0]) {
          return 1;
        }
        if (first[0] < second[0]) {
          return -1;
        }
        if (first[1] > second[1]) {
          return 1;
        }
        if (first[1] < second[1]) {
          return -1;
        }
        if (first[2] > second[2]) {
          return 1;
        }
        if (first[2] < second[2]) {
          return -1;
        }
    },
    {
      title: "Runtime",
      dataIndex: "runtimeMinutes",
      sorter: (a: MovieIO, b: MovieIO) => a.runtimeMinutes - b.runtimeMinutes,
      title: "Director",
      dataIndex: ["director", "surname"],
      sorter: (a: MovieIO, b: MovieIO) => {
        //surname has higher priority
        if (a.director.surname < b.director.surname) {
          return -1;
        }
        if (a.director.surname > b.director.surname) {
          return 1;
        }
        if (a.director.name < b.director.name) {
          return -1;
        }
        if (a.director.name > b.director.name) {
          return 1;
        }
        return 0;
      },
      render: (text: string, record: MovieIO) => (
        <Link to={`/director/${record.director.id}`}>
          <a>
            {record.director.name} {record.director.surname}
          </a>
      <Space
        direction="vertical"
        style={{ display: "flex", padding: 24, textAlign: "center" }}
      >
        <Form>
          <Row>
            <Col span={6}>
              <div>Name</div> <Input></Input>
            </Col>
            <Col span={6}>
              <div>Original name</div>
              <Input></Input>
            </Col>
          </Row>
          <Col span={12}>
            <div>Runtime</div>
            <Slider
              marks={runtimeMarks}
              range={{ draggableTrack: true }}
              step={10}
              max={300}
              defaultValue={[60, 120]}
            ></Slider>
          </Col>

          <Row>
            <Col span={12}>
              <div>Year published</div>
              <Slider
                marks={yearMarks}
                range={{ draggableTrack: true }}
                min={1920}
                max={2022}
                defaultValue={[2000, 2010]}
              ></Slider>
            </Col>
            <Col></Col>
          </Row>
          <Row>
            <Col span={6}>
              <div>Category</div>
              <Select
                showSearch
                style={{ width: "100%" }}
                placeholder="Search to Select"
                optionFilterProp="children"
                filterOption={(input, option) =>
                  (option!.children as unknown as string).includes(input)
                }
                filterSort={(optionA, optionB) =>
                  (optionA!.children as unknown as string)
                    .toLowerCase()
                    .localeCompare(
                      (optionB!.children as unknown as string).toLowerCase()
                    )
                }
              >
                {categoriesList.map((cat: CategoryIO) => {
                  return <Option value={cat.id}>{cat.name}</Option>;
                })}
              </Select>
            </Col>
            <Col span={6}>
              <div>Directors</div>
              <Select
                showSearch
                style={{ width: "100%" }}
                placeholder="Search to Select"
                optionFilterProp="children"
                filterOption={(input, option) =>
                  (option!.children as unknown as string).includes(input)
                }
                filterSort={(optionA, optionB) =>
                  (optionA!.children as unknown as string)
                    .toLowerCase()
                    .localeCompare(
                      (optionB!.children as unknown as string).toLowerCase()
                    )
                }
              >
              {directorsList.map((dir:DirectorIO) => {
                return(<Option value={dir.id}>{dir.name + " " + dir.surname}</Option>)

              })}
              </Select>
            </Col>
          </Row>
          <Row>
            <Col span={12}>
            <Button style={{width: "100%"}} type="primary" icon={<SearchOutlined />} size="large">
      Search
    </Button>
            </Col>
            
          </Row>
        </Form>
      </Space>
      {pressed && (
        <Space
          direction="vertical"
          style={{ display: "flex", padding: 24, textAlign: "left" }}
        >
          <Table
            onRow={(record, rowIndex) => {
              return {
                onClick: (event) => {
                  console.log(record.id); //remove later
                },
              }; //here change to view movie
            }}
            columns={columns}
            dataSource={resultsExample}
            bordered
            title={() => "Results"}
          />
        </Space>
      )}