Newer
Older
import { AudioOutlined } from "@ant-design/icons";
import { SearchOutlined } from "@ant-design/icons";
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";
//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",
publishedAt: "1.6.2000",
runTimeMinutes: 120,
director: {
id: "123456789",
name: "Karel",
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",
publishedAt: "1.1.2002",
runTimeMinutes: 150,
director: {
id: "123456789",
name: "Karel",
surname: "Vomacka",
birthdate: "20.2.1987",
},
},
];
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 delete in future
const [form] = Form.useForm();
// here will be API call for search on BE, everything needed is in values
const onSubmit = (values: any) => {
alert(JSON.stringify(values));
};
//function that happens when search button is pressed
console.log(searchValue); // just debug tool
}; // API request search goes here - request search with value inside variable "searchValue"
const onReset = () => {
form.resetFields();
};
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",
const first = a.publishedAt.split(".").reverse();
const second = b.publishedAt.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;
}
sorter: (a: MovieIO, b: MovieIO) => a.runTimeMinutes - b.runTimeMinutes,
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 form={form} onFinish={onSubmit}>
<Row gutter={20}>
<Form.Item name="name" label="Name">
<Input></Input>
</Form.Item>
<Form.Item name="originalName" label="Original name">
<Input></Input>
</Form.Item>
</Col>
</Row>
<Row gutter={20}>
<Col span={12}>
<Form.Item name="runtime" label="Runtime minutes">
<Slider
marks={runtimeMarks}
range={{ draggableTrack: true }}
step={10}
max={300}
defaultValue={[60, 120]}
></Slider>
</Form.Item>
<Form.Item name="published" label="Year published">
<Slider
marks={yearMarks}
range={{ draggableTrack: true }}
min={1920}
max={2022}
defaultValue={[2000, 2010]}
></Slider>
<Form.Item name="category" label="Category">
<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>
<Form.Item name="director" label="Director">
<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>
);
})}
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
<Divider></Divider>
</Col>
</Row>
<Row gutter={20}>
<Col span={6}>
<Form.Item name="searchbutton">
<Button
htmlType="submit"
style={{ width: "100%" }}
type="primary"
icon={<SearchOutlined />}
size="large"
>
Search
</Button>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="reset">
<Button
size="large"
type="default"
style={{ width: "100%" }}
onClick={onReset}
>
Reset
</Button>
</Form.Item>
</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>
)}