@c-rex/templates 0.0.12 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -6
- package/src/home/layout.tsx +36 -15
- package/src/home/page.tsx +65 -41
- package/src/info/page.tsx +30 -49
- package/src/layout.tsx +10 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c-rex/templates",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"src"
|
|
@@ -41,13 +41,18 @@
|
|
|
41
41
|
"typescript": "latest"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"react-dom": "^18",
|
|
47
|
-
"@c-rex/services": "*",
|
|
44
|
+
"@c-rex/components": "*",
|
|
45
|
+
"@c-rex/contexts": "*",
|
|
48
46
|
"@c-rex/interfaces": "*",
|
|
47
|
+
"@c-rex/services": "*",
|
|
49
48
|
"@c-rex/ui": "*",
|
|
50
49
|
"@c-rex/utils": "*",
|
|
51
|
-
"
|
|
50
|
+
"i18next": "^25.1.3",
|
|
51
|
+
"next": "^14",
|
|
52
|
+
"next-intl": "^4.1.0",
|
|
53
|
+
"nuqs": "^2.4.3",
|
|
54
|
+
"react": "^18",
|
|
55
|
+
"react-dom": "^18",
|
|
56
|
+
"react-i18next": "^15.5.1"
|
|
52
57
|
}
|
|
53
58
|
}
|
package/src/home/layout.tsx
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import React from "react";
|
|
1
2
|
import { informationUnits } from "@c-rex/interfaces";
|
|
2
|
-
import { InformationUnitsService } from "@c-rex/services";
|
|
3
|
+
import { InformationUnitsService, LanguageService } from "@c-rex/services";
|
|
4
|
+
import { getConfigs } from "@c-rex/utils/next-cookies";
|
|
3
5
|
import { HomePage } from "./page";
|
|
4
6
|
|
|
5
7
|
interface SearchParams {
|
|
@@ -16,10 +18,23 @@ const loadData = async ({
|
|
|
16
18
|
page,
|
|
17
19
|
language,
|
|
18
20
|
}: SearchParams): Promise<any> => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
if (search === undefined || search === "") {
|
|
22
|
+
return {
|
|
23
|
+
data: { items: [] },
|
|
24
|
+
filters: {
|
|
25
|
+
searchValue: "",
|
|
26
|
+
page: 0,
|
|
27
|
+
selectedLanguage: [],
|
|
28
|
+
availableLanguages: [],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const pageAux = Number(page);
|
|
34
|
+
const configs = await getConfigs();
|
|
35
|
+
const searchValue = search as string;
|
|
36
|
+
const languageService = new LanguageService(configs.languageSwitcher.endpoint);
|
|
37
|
+
const availableLanguagesAndCountries = await languageService.getLanguagesAndCountries();
|
|
23
38
|
|
|
24
39
|
let data = { items: [] } as unknown as informationUnits;
|
|
25
40
|
let selectedLanguages: string[] = [];
|
|
@@ -30,12 +45,14 @@ const loadData = async ({
|
|
|
30
45
|
}
|
|
31
46
|
|
|
32
47
|
if (searchValue) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
const service = new InformationUnitsService();
|
|
49
|
+
|
|
50
|
+
data = await service.getList({
|
|
51
|
+
queries: searchValue.split(" ").join(","),
|
|
52
|
+
page: pageAux,
|
|
53
|
+
fields: [],
|
|
54
|
+
languages: selectedLanguages
|
|
55
|
+
});
|
|
39
56
|
}
|
|
40
57
|
|
|
41
58
|
return {
|
|
@@ -43,16 +60,20 @@ const loadData = async ({
|
|
|
43
60
|
filters: {
|
|
44
61
|
searchValue: searchValue,
|
|
45
62
|
page: pageAux,
|
|
46
|
-
|
|
47
|
-
availableLanguages:
|
|
63
|
+
selectedLanguages: selectedLanguages,
|
|
64
|
+
availableLanguages: availableLanguagesAndCountries,
|
|
48
65
|
},
|
|
49
66
|
};
|
|
50
67
|
};
|
|
51
68
|
|
|
52
69
|
export const HomeLayout = async ({ searchParams }: HomeProps) => {
|
|
53
|
-
const { data } = await loadData(searchParams);
|
|
70
|
+
const { data, filters: { selectedLanguages, availableLanguages } } = await loadData(searchParams);
|
|
54
71
|
|
|
55
72
|
return (
|
|
56
|
-
<HomePage
|
|
73
|
+
<HomePage
|
|
74
|
+
data={data}
|
|
75
|
+
selectedLanguages={selectedLanguages}
|
|
76
|
+
availableLanguages={availableLanguages}
|
|
77
|
+
/>
|
|
57
78
|
);
|
|
58
79
|
};
|
package/src/home/page.tsx
CHANGED
|
@@ -1,65 +1,89 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { FC } from "react";
|
|
3
|
+
import React, { FC } from "react";
|
|
4
4
|
import { informationUnits } from "@c-rex/interfaces";
|
|
5
|
-
import {
|
|
6
|
-
import { updateUrlWithParams } from "@c-rex/utils";
|
|
7
|
-
import { useRouter } from "next/navigation";
|
|
5
|
+
import { call } from "@c-rex/utils";
|
|
8
6
|
import { Button } from "@c-rex/ui/button";
|
|
9
7
|
import { AutoComplete } from "@c-rex/components/autocomplete";
|
|
10
8
|
import { ResultList } from "@c-rex/components/result-list";
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
import { useTranslations } from 'next-intl'
|
|
10
|
+
import { parseAsInteger, parseAsString, useQueryStates } from 'nuqs'
|
|
11
|
+
import { DialogFilter } from "@c-rex/components/dialog-filter";
|
|
12
|
+
import { getCookie } from "@c-rex/utils/next-cookies";
|
|
13
|
+
import { CONTENT_LANG_KEY } from "@c-rex/constants";
|
|
14
|
+
import { SearchProvider } from "@c-rex/contexts/search";
|
|
13
15
|
|
|
14
16
|
interface HomePageProps {
|
|
15
17
|
data: informationUnits;
|
|
18
|
+
selectedLanguages: string[];
|
|
19
|
+
availableLanguages: any;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
|
-
export const HomePage: FC<HomePageProps> = ({
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
export const HomePage: FC<HomePageProps> = ({
|
|
23
|
+
data,
|
|
24
|
+
selectedLanguages,
|
|
25
|
+
availableLanguages,
|
|
26
|
+
}) => {
|
|
27
|
+
const t = useTranslations();
|
|
28
|
+
const [params, setParams] = useQueryStates({
|
|
29
|
+
search: {
|
|
30
|
+
defaultValue: "",
|
|
31
|
+
parse(value) {
|
|
32
|
+
return value
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
operator: parseAsString,
|
|
36
|
+
language: parseAsString,
|
|
37
|
+
page: parseAsInteger,
|
|
38
|
+
}, {
|
|
39
|
+
history: 'push',
|
|
40
|
+
shallow: false,
|
|
41
|
+
});
|
|
21
42
|
|
|
22
|
-
const
|
|
23
|
-
const service = new InformationUnitsService();
|
|
24
|
-
return service.getSuggestions(value);
|
|
43
|
+
const { search } = params;
|
|
25
44
|
|
|
45
|
+
const onSearch = (value: string): Promise<string[]> => {
|
|
46
|
+
return call('InformationUnitsService.getSuggestions', { query: value });
|
|
26
47
|
}
|
|
27
48
|
|
|
28
49
|
const onSelect = (value: string) => {
|
|
29
|
-
|
|
30
|
-
{
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
key: "page",
|
|
40
|
-
value: "1",
|
|
41
|
-
},
|
|
42
|
-
]);
|
|
50
|
+
getCookie(CONTENT_LANG_KEY).then((language) => {
|
|
51
|
+
setParams({
|
|
52
|
+
search: value,
|
|
53
|
+
operator: "OR",
|
|
54
|
+
page: 1,
|
|
55
|
+
language: language,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
43
58
|
};
|
|
44
59
|
|
|
45
60
|
return (
|
|
46
|
-
<
|
|
47
|
-
<div className="
|
|
48
|
-
<div className="
|
|
49
|
-
<
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<div className="
|
|
57
|
-
<
|
|
61
|
+
<SearchProvider>
|
|
62
|
+
<div className="container">
|
|
63
|
+
<div className="grid grid-cols-12 gap-4 py-6">
|
|
64
|
+
<div className="col-span-12 sm:col-span-9 md:col-span-10">
|
|
65
|
+
<AutoComplete
|
|
66
|
+
initialValue={search}
|
|
67
|
+
onSearch={onSearch}
|
|
68
|
+
onSelect={onSelect}
|
|
69
|
+
/>
|
|
70
|
+
</div>
|
|
71
|
+
<div className="col-span-12 sm:col-span-3 md:col-span-2">
|
|
72
|
+
<div className="flex justify-end">
|
|
73
|
+
<DialogFilter
|
|
74
|
+
|
|
75
|
+
startSelectedLanguages={selectedLanguages}
|
|
76
|
+
availableLanguages={availableLanguages}
|
|
77
|
+
trigger={(
|
|
78
|
+
<Button variant="default">{t("filters")}</Button>
|
|
79
|
+
)}
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
58
82
|
</div>
|
|
59
83
|
</div>
|
|
60
|
-
</div>
|
|
61
84
|
|
|
62
|
-
|
|
63
|
-
|
|
85
|
+
<ResultList items={data.items} />
|
|
86
|
+
</div>
|
|
87
|
+
</SearchProvider>
|
|
64
88
|
);
|
|
65
89
|
};
|
package/src/info/page.tsx
CHANGED
|
@@ -1,65 +1,46 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { FC
|
|
4
|
-
import { InformationUnitsService } from "@c-rex/services";
|
|
3
|
+
import React, { FC } from "react";
|
|
5
4
|
import { TreeOfContent } from "@c-rex/interfaces";
|
|
6
|
-
import { SidebarInset, SidebarProvider
|
|
7
|
-
import { Separator } from "@c-rex/ui/separator";
|
|
5
|
+
import { SidebarInset, SidebarProvider } from "@c-rex/ui/sidebar";
|
|
8
6
|
import { AppSidebar } from "@c-rex/components/sidebar";
|
|
9
7
|
import { Breadcrumb } from "@c-rex/components/breadcrumb";
|
|
10
|
-
//import { generateTreeOfContent } from "@c-rex/utils";
|
|
11
|
-
//import { generateBreadcrumbItems } from "@c-rex/utils";
|
|
12
8
|
|
|
13
9
|
interface InfoPageTemplateProps {
|
|
14
10
|
htmlContent: string;
|
|
15
|
-
|
|
11
|
+
breadcrumbItems: TreeOfContent[];
|
|
12
|
+
sidebarItems: TreeOfContent[];
|
|
13
|
+
availableVersions: any
|
|
16
14
|
}
|
|
17
15
|
|
|
18
|
-
export const InfoPageTemplate: FC<InfoPageTemplateProps> = ({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
if (effectRan.current) return;
|
|
26
|
-
effectRan.current = true;
|
|
27
|
-
|
|
28
|
-
const loadNavigationData = async () => {
|
|
29
|
-
const service = new InformationUnitsService();
|
|
30
|
-
const informationUnitsItem = await service.getItem(id);
|
|
31
|
-
|
|
32
|
-
if (informationUnitsItem?.directoryNodes != undefined) {
|
|
33
|
-
/*
|
|
34
|
-
const treeOfContent = await generateTreeOfContent(
|
|
35
|
-
informationUnitsItem.directoryNodes,
|
|
36
|
-
);
|
|
37
|
-
const breadcrumbItems = generateBreadcrumbItems(treeOfContent);
|
|
38
|
-
|
|
39
|
-
setBreadcrumbItems(breadcrumbItems);
|
|
40
|
-
setSidebarItems(treeOfContent);
|
|
41
|
-
*/
|
|
42
|
-
setLoading(false);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
loadNavigationData();
|
|
47
|
-
}, [id]);
|
|
48
|
-
|
|
16
|
+
export const InfoPageTemplate: FC<InfoPageTemplateProps> = ({
|
|
17
|
+
htmlContent,
|
|
18
|
+
breadcrumbItems,
|
|
19
|
+
sidebarItems,
|
|
20
|
+
availableVersions
|
|
21
|
+
}) => {
|
|
49
22
|
return (
|
|
50
23
|
<SidebarProvider>
|
|
51
|
-
<AppSidebar
|
|
24
|
+
<AppSidebar
|
|
25
|
+
data={sidebarItems}
|
|
26
|
+
availableVersions={availableVersions}
|
|
27
|
+
className="top-20"
|
|
28
|
+
side="right"
|
|
29
|
+
variant="floating"
|
|
30
|
+
collapsible="icon"
|
|
31
|
+
/>
|
|
52
32
|
<SidebarInset>
|
|
53
|
-
<
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
33
|
+
<div className="container flex flex-col">
|
|
34
|
+
<header className="flex h-16 shrink-0 items-center justify-between">
|
|
35
|
+
<div className="flex shrink-0 items-center">
|
|
36
|
+
<Breadcrumb items={breadcrumbItems} />
|
|
37
|
+
</div>
|
|
38
|
+
</header>
|
|
39
|
+
|
|
40
|
+
<div
|
|
41
|
+
dangerouslySetInnerHTML={{ __html: htmlContent }}
|
|
42
|
+
/>
|
|
43
|
+
</div>
|
|
63
44
|
</SidebarInset>
|
|
64
45
|
</SidebarProvider>
|
|
65
46
|
);
|
package/src/layout.tsx
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
//import "@/styles/global.css";
|
|
2
|
-
|
|
3
1
|
import React from "react";
|
|
4
2
|
import { NavBar } from "@c-rex/components/navbar";
|
|
3
|
+
import { NextIntlClientProvider } from 'next-intl';
|
|
4
|
+
import { getLocale } from "next-intl/server";
|
|
5
5
|
|
|
6
6
|
interface DefaultRootLayoutProps {
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export const DefaultRootLayout = ({
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
export const DefaultRootLayout = async ({ children }: DefaultRootLayoutProps) => {
|
|
11
|
+
const locale = await getLocale();
|
|
12
|
+
|
|
13
13
|
return (
|
|
14
|
-
<html lang=
|
|
14
|
+
<html lang={locale} suppressHydrationWarning>
|
|
15
15
|
<head />
|
|
16
16
|
<body className="min-h-screen bg-background font-sans antialiased">
|
|
17
17
|
<div className="items-center flex flex-col">
|
|
18
|
+
<NextIntlClientProvider>
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
<NavBar />
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
{children}
|
|
23
|
+
</NextIntlClientProvider>
|
|
22
24
|
</div>
|
|
23
25
|
</body>
|
|
24
26
|
</html>
|