@digigov/react-modules 1.2.0-8e254888 → 1.2.0-a0ac149e
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/Faq/Faq.stories.d.ts +8 -0
- package/Faq/Results/index.js +29 -0
- package/Faq/Results/package.json +6 -0
- package/Faq/Results.d.ts +9 -0
- package/Faq/Results.js.map +7 -0
- package/Faq/__stories__/Default.d.ts +2 -0
- package/Faq/hooks/index.js +66 -0
- package/Faq/hooks/package.json +6 -0
- package/Faq/hooks.d.ts +15 -0
- package/Faq/hooks.js.map +7 -0
- package/Faq/index.d.ts +43 -0
- package/Faq/index.js +169 -0
- package/Faq/index.js.map +7 -0
- package/Faq/index.test.d.ts +1 -0
- package/Faq/package.json +6 -0
- package/Faq/slug/index.js +97 -0
- package/Faq/slug/package.json +6 -0
- package/Faq/slug.d.ts +1 -0
- package/Faq/slug.js.map +7 -0
- package/Faq/splitted.test.d.ts +1 -0
- package/Faq/utils/index.js +8 -0
- package/Faq/utils/package.json +6 -0
- package/Faq/utils.d.ts +1 -0
- package/Faq/utils.js.map +7 -0
- package/FilteredResults/__stories__/Default.d.ts +1 -1
- package/cjs/Faq/Results/index.js +58 -0
- package/cjs/Faq/Results.js.map +7 -0
- package/cjs/Faq/hooks/index.js +90 -0
- package/cjs/Faq/hooks.js.map +7 -0
- package/cjs/Faq/index.js +194 -0
- package/cjs/Faq/index.js.map +7 -0
- package/cjs/Faq/slug/index.js +120 -0
- package/cjs/Faq/slug.js.map +7 -0
- package/cjs/Faq/utils/index.js +31 -0
- package/cjs/Faq/utils.js.map +7 -0
- package/cjs/index.js +3 -1
- package/cjs/index.js.map +2 -2
- package/cjs/lazy/index.js +1 -0
- package/cjs/lazy.js.map +2 -2
- package/cjs/registry/index.js +10 -0
- package/cjs/registry.js.map +2 -2
- package/index.d.ts +1 -0
- package/index.js +2 -1
- package/index.js.map +2 -2
- package/lazy/index.js +1 -0
- package/package.json +8 -8
- package/registry/index.js +10 -0
- package/src/Faq/Faq.stories.js +7 -0
- package/src/Faq/Results.tsx +53 -0
- package/src/Faq/__stories__/Default.tsx +292 -0
- package/src/Faq/hooks.ts +89 -0
- package/src/Faq/index.test.tsx +24 -0
- package/src/Faq/index.tsx +286 -0
- package/src/Faq/slug.ts +140 -0
- package/src/Faq/splitted.test.tsx +19 -0
- package/src/Faq/utils.ts +5 -0
- package/src/FilteredResults/__stories__/Default.tsx +1 -1
- package/src/FilteredResults/index.test.tsx +4 -0
- package/src/FilteredResults/splitted.test.tsx +4 -0
- package/src/index.ts +1 -0
- package/src/lazy.js +1 -0
- package/src/registry.js +10 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare namespace _default {
|
|
2
|
+
export let title: string;
|
|
3
|
+
export { Faq as component };
|
|
4
|
+
export let displayName: string;
|
|
5
|
+
}
|
|
6
|
+
export default _default;
|
|
7
|
+
export { Default } from "@digigov/react-modules/Faq/__stories__/Default";
|
|
8
|
+
import Faq from '@digigov/react-modules/Faq';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React, { useCallback } from "react";
|
|
2
|
+
import { useFormContext } from "@digigov/form/FormBuilder";
|
|
3
|
+
import Button from "@digigov/ui/form/Button";
|
|
4
|
+
import { Heading } from "@digigov/ui/typography/Heading";
|
|
5
|
+
const Results = React.forwardRef(
|
|
6
|
+
function Results2({ filteredSections, Onclose, activeQa, primarySections }, ref) {
|
|
7
|
+
const { resetField, submit } = useFormContext();
|
|
8
|
+
const handleReset = useCallback(
|
|
9
|
+
(e) => {
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
12
|
+
urlParams.delete("text");
|
|
13
|
+
urlParams.delete("activeQa");
|
|
14
|
+
window.history.replaceState({}, "", "?" + urlParams.toString());
|
|
15
|
+
resetField("text", { defaultValue: "" });
|
|
16
|
+
Onclose(activeQa);
|
|
17
|
+
submit();
|
|
18
|
+
},
|
|
19
|
+
[resetField, Onclose, submit, activeQa]
|
|
20
|
+
// Added necessary dependencies
|
|
21
|
+
);
|
|
22
|
+
return /* @__PURE__ */ React.createElement(Heading, { ref, size: "sm", marginTop: 4 }, "\u0391\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03B1: ", filteredSections, " \u03B1\u03C0\u03CC ", primarySections, ".", " ", /* @__PURE__ */ React.createElement(Button, { variant: "link", onClick: (e) => handleReset(e) }, "\u0395\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\u03C2"));
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
var Results_default = Results;
|
|
26
|
+
export {
|
|
27
|
+
Results_default as default
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=Results.js.map
|
package/Faq/Results.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ResultsProps {
|
|
3
|
+
filteredSections: number;
|
|
4
|
+
primarySections: number;
|
|
5
|
+
Onclose: (v: string) => void;
|
|
6
|
+
activeQa: string;
|
|
7
|
+
}
|
|
8
|
+
declare const Results: React.ForwardRefExoticComponent<ResultsProps & React.RefAttributes<HTMLHeadingElement>>;
|
|
9
|
+
export default Results;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/Faq/Results.tsx"],
|
|
4
|
+
"sourcesContent": ["// Results.tsx\nimport React, { useCallback } from 'react';\nimport { useFormContext } from '@digigov/form/FormBuilder';\nimport Button from '@digigov/ui/form/Button';\nimport { Heading } from '@digigov/ui/typography/Heading';\n\ninterface ResultsProps {\n filteredSections: number;\n primarySections: number;\n Onclose: (v: string) => void;\n activeQa: string;\n}\n\nconst Results = React.forwardRef<HTMLHeadingElement, ResultsProps>(\n function Results(\n { filteredSections, Onclose, activeQa, primarySections },\n ref\n ) {\n const { resetField, submit } = useFormContext();\n const handleReset = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n // Remove 'text' from the URL\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.delete('text');\n urlParams.delete('activeQa');\n window.history.replaceState({}, '', '?' + urlParams.toString());\n\n // Reset the form field\n resetField('text', { defaultValue: '' });\n\n // Close active FAQ\n Onclose(activeQa);\n\n // Submit the form (if needed)\n submit();\n },\n [resetField, Onclose, submit, activeQa] // Added necessary dependencies\n );\n\n return (\n <Heading ref={ref} size=\"sm\" marginTop={4}>\n \u0391\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03B1: {filteredSections} \u03B1\u03C0\u03CC {primarySections}.{' '}\n <Button variant=\"link\" onClick={(e) => handleReset(e)}>\n \u0395\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\u03C2\n </Button>\n </Heading>\n );\n }\n);\n\nexport default Results;\n"],
|
|
5
|
+
"mappings": "AACA,OAAO,SAAS,mBAAmB;AACnC,SAAS,sBAAsB;AAC/B,OAAO,YAAY;AACnB,SAAS,eAAe;AASxB,MAAM,UAAU,MAAM;AAAA,EACpB,SAASA,SACP,EAAE,kBAAkB,SAAS,UAAU,gBAAgB,GACvD,KACA;AACA,UAAM,EAAE,YAAY,OAAO,IAAI,eAAe;AAC9C,UAAM,cAAc;AAAA,MAClB,CAAC,MAA2C;AAC1C,UAAE,eAAe;AAGjB,cAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,kBAAU,OAAO,MAAM;AACvB,kBAAU,OAAO,UAAU;AAC3B,eAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,MAAM,UAAU,SAAS,CAAC;AAG9D,mBAAW,QAAQ,EAAE,cAAc,GAAG,CAAC;AAGvC,gBAAQ,QAAQ;AAGhB,eAAO;AAAA,MACT;AAAA,MACA,CAAC,YAAY,SAAS,QAAQ,QAAQ;AAAA;AAAA,IACxC;AAEA,WACE,oCAAC,WAAQ,KAAU,MAAK,MAAK,WAAW,KAAG,8EAC1B,kBAAiB,wBAAM,iBAAgB,KAAE,KACxD,oCAAC,UAAO,SAAQ,QAAO,SAAS,CAAC,MAAM,YAAY,CAAC,KAAG,qHAEvD,CACF;AAAA,EAEJ;AACF;AAEA,IAAO,kBAAQ;",
|
|
6
|
+
"names": ["Results"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { slug } from "@digigov/react-modules/Faq/slug";
|
|
3
|
+
const removeAccents = (text) => {
|
|
4
|
+
return text.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
|
5
|
+
};
|
|
6
|
+
const useURLParamsSearch = (searchFunc, {
|
|
7
|
+
navigate,
|
|
8
|
+
filteredSections
|
|
9
|
+
}) => {
|
|
10
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
11
|
+
const currentParams = Object.fromEntries(urlParams.entries());
|
|
12
|
+
const hashId = window.location.hash ? window.location.hash.slice(1) : "";
|
|
13
|
+
const hashExistsInFilteredSections = filteredSections.some(
|
|
14
|
+
(section) => section.qa.some(
|
|
15
|
+
({ id, question }) => id === hashId || slug(question) === hashId
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
const search = (params) => {
|
|
19
|
+
const updatedParams = Object.entries({
|
|
20
|
+
...currentParams,
|
|
21
|
+
...params
|
|
22
|
+
}).filter(([, value]) => Boolean(value)).reduce(
|
|
23
|
+
(acc, [key, value]) => {
|
|
24
|
+
acc[key] = value;
|
|
25
|
+
return acc;
|
|
26
|
+
},
|
|
27
|
+
{}
|
|
28
|
+
);
|
|
29
|
+
const newUrl = Object.keys(updatedParams).length ? "?" + new URLSearchParams(updatedParams).toString() : window.location.pathname;
|
|
30
|
+
const finalURL = hashExistsInFilteredSections ? newUrl + `#${hashId}` : newUrl;
|
|
31
|
+
navigate(finalURL);
|
|
32
|
+
return searchFunc(params);
|
|
33
|
+
};
|
|
34
|
+
return { search, values: { text: currentParams.text }, hashId };
|
|
35
|
+
};
|
|
36
|
+
const useFaqSearch = (questions) => {
|
|
37
|
+
const [filteredSections, setFilteredSections] = useState(questions.sections);
|
|
38
|
+
const search = (values) => {
|
|
39
|
+
if (!values || !values.text?.trim()) {
|
|
40
|
+
setFilteredSections(questions.sections);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const searchValue = values.text.trim();
|
|
44
|
+
const normalizedSearchWord = removeAccents(searchValue.toLowerCase());
|
|
45
|
+
const filteredSections2 = questions.sections.map((section) => {
|
|
46
|
+
const filteredQa = section.qa.filter(({ question, answer }) => {
|
|
47
|
+
const normalizedQuestion = removeAccents(
|
|
48
|
+
question?.toLowerCase() || ""
|
|
49
|
+
);
|
|
50
|
+
const normalizedAnswer = removeAccents(answer?.toLowerCase() || "");
|
|
51
|
+
return normalizedQuestion.includes(normalizedSearchWord) || normalizedAnswer.includes(normalizedSearchWord);
|
|
52
|
+
});
|
|
53
|
+
return { ...section, qa: filteredQa };
|
|
54
|
+
}).filter((section) => section.qa.length > 0);
|
|
55
|
+
setFilteredSections(filteredSections2);
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
filteredSections,
|
|
59
|
+
search
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
useFaqSearch,
|
|
64
|
+
useURLParamsSearch
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=hooks.js.map
|
package/Faq/hooks.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { sectionsConfigType, SectionType } from '@digigov/react-modules/Faq';
|
|
2
|
+
export declare const useURLParamsSearch: (searchFunc: (params: Record<string, string | undefined>) => void, { navigate, filteredSections, }: {
|
|
3
|
+
navigate: (url: string) => void;
|
|
4
|
+
filteredSections: SectionType[];
|
|
5
|
+
}) => {
|
|
6
|
+
search: (params: Record<string, string>) => void;
|
|
7
|
+
values: {
|
|
8
|
+
text: string;
|
|
9
|
+
};
|
|
10
|
+
hashId: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const useFaqSearch: (questions: sectionsConfigType) => {
|
|
13
|
+
filteredSections: SectionType[];
|
|
14
|
+
search: (values: Record<string, string>) => void;
|
|
15
|
+
};
|
package/Faq/hooks.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/Faq/hooks.ts"],
|
|
4
|
+
"sourcesContent": ["import { useState } from 'react';\nimport { sectionsConfigType, SectionType } from '@digigov/react-modules/Faq';\nimport { slug } from '@digigov/react-modules/Faq/slug';\nconst removeAccents = (text: string) => {\n return text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\nexport const useURLParamsSearch = (\n searchFunc: (params: Record<string, string | undefined>) => void,\n {\n navigate,\n filteredSections,\n }: { navigate: (url: string) => void; filteredSections: SectionType[] }\n) => {\n const urlParams = new URLSearchParams(window.location.search);\n const currentParams = Object.fromEntries(urlParams.entries());\n const hashId = window.location.hash ? window.location.hash.slice(1) : '';\n\n // When filtered sections change, check if hash should be preserved\n const hashExistsInFilteredSections = filteredSections.some((section) =>\n section.qa.some(\n ({ id, question }) => id === hashId || slug(question) === hashId\n )\n );\n\n const search = (params: Record<string, string>) => {\n const updatedParams = Object.entries({\n ...currentParams,\n ...params,\n })\n .filter(([, value]) => Boolean(value)) // Ensure value is not empty\n .reduce(\n (acc, [key, value]) => {\n acc[key] = value as string; // Explicitly cast to string\n return acc;\n },\n {} as Record<string, string>\n ); // Ensure correct type\n\n const newUrl = Object.keys(updatedParams).length\n ? '?' + new URLSearchParams(updatedParams).toString()\n : window.location.pathname; // Reset to base URL if no params\n\n const finalURL = hashExistsInFilteredSections\n ? newUrl + `#${hashId}`\n : newUrl;\n navigate(finalURL);\n return searchFunc(params);\n };\n return { search, values: { text: currentParams.text }, hashId };\n};\n\nexport const useFaqSearch = (questions: sectionsConfigType) => {\n const [filteredSections, setFilteredSections] = useState(questions.sections);\n\n const search = (values: Record<string, string>) => {\n if (!values || !values.text?.trim()) {\n setFilteredSections(questions.sections);\n return;\n }\n\n const searchValue: string = values.text.trim(); // Ensure no spaces-only search\n const normalizedSearchWord = removeAccents(searchValue.toLowerCase());\n\n const filteredSections = questions.sections\n .map((section: SectionType) => {\n const filteredQa = section.qa.filter(({ question, answer }: any) => {\n const normalizedQuestion = removeAccents(\n question?.toLowerCase() || ''\n );\n const normalizedAnswer = removeAccents(answer?.toLowerCase() || '');\n return (\n normalizedQuestion.includes(normalizedSearchWord) ||\n normalizedAnswer.includes(normalizedSearchWord)\n );\n });\n\n return { ...section, qa: filteredQa };\n })\n .filter((section: SectionType) => section.qa.length > 0);\n\n setFilteredSections(filteredSections);\n };\n\n return {\n filteredSections,\n search,\n };\n};\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gBAAgB;AAEzB,SAAS,YAAY;AACrB,MAAM,gBAAgB,CAAC,SAAiB;AACtC,SAAO,KAAK,UAAU,KAAK,EAAE,QAAQ,oBAAoB,EAAE;AAC7D;AAEO,MAAM,qBAAqB,CAChC,YACA;AAAA,EACE;AAAA,EACA;AACF,MACG;AACH,QAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,QAAM,gBAAgB,OAAO,YAAY,UAAU,QAAQ,CAAC;AAC5D,QAAM,SAAS,OAAO,SAAS,OAAO,OAAO,SAAS,KAAK,MAAM,CAAC,IAAI;AAGtE,QAAM,+BAA+B,iBAAiB;AAAA,IAAK,CAAC,YAC1D,QAAQ,GAAG;AAAA,MACT,CAAC,EAAE,IAAI,SAAS,MAAM,OAAO,UAAU,KAAK,QAAQ,MAAM;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,WAAmC;AACjD,UAAM,gBAAgB,OAAO,QAAQ;AAAA,MACnC,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC,EACE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,EACpC;AAAA,MACC,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACrB,YAAI,GAAG,IAAI;AACX,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAEF,UAAM,SAAS,OAAO,KAAK,aAAa,EAAE,SACtC,MAAM,IAAI,gBAAgB,aAAa,EAAE,SAAS,IAClD,OAAO,SAAS;AAEpB,UAAM,WAAW,+BACb,SAAS,IAAI,MAAM,KACnB;AACJ,aAAS,QAAQ;AACjB,WAAO,WAAW,MAAM;AAAA,EAC1B;AACA,SAAO,EAAE,QAAQ,QAAQ,EAAE,MAAM,cAAc,KAAK,GAAG,OAAO;AAChE;AAEO,MAAM,eAAe,CAAC,cAAkC;AAC7D,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,UAAU,QAAQ;AAE3E,QAAM,SAAS,CAAC,WAAmC;AACjD,QAAI,CAAC,UAAU,CAAC,OAAO,MAAM,KAAK,GAAG;AACnC,0BAAoB,UAAU,QAAQ;AACtC;AAAA,IACF;AAEA,UAAM,cAAsB,OAAO,KAAK,KAAK;AAC7C,UAAM,uBAAuB,cAAc,YAAY,YAAY,CAAC;AAEpE,UAAMA,oBAAmB,UAAU,SAChC,IAAI,CAAC,YAAyB;AAC7B,YAAM,aAAa,QAAQ,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,MAAW;AAClE,cAAM,qBAAqB;AAAA,UACzB,UAAU,YAAY,KAAK;AAAA,QAC7B;AACA,cAAM,mBAAmB,cAAc,QAAQ,YAAY,KAAK,EAAE;AAClE,eACE,mBAAmB,SAAS,oBAAoB,KAChD,iBAAiB,SAAS,oBAAoB;AAAA,MAElD,CAAC;AAED,aAAO,EAAE,GAAG,SAAS,IAAI,WAAW;AAAA,IACtC,CAAC,EACA,OAAO,CAAC,YAAyB,QAAQ,GAAG,SAAS,CAAC;AAEzD,wBAAoBA,iBAAgB;AAAA,EACtC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["filteredSections"]
|
|
7
|
+
}
|
package/Faq/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface sectionsConfigType {
|
|
3
|
+
sections: SectionType[];
|
|
4
|
+
}
|
|
5
|
+
export interface QaType {
|
|
6
|
+
id?: string;
|
|
7
|
+
question: string;
|
|
8
|
+
answer: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SectionType {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
qa: QaType[];
|
|
14
|
+
}
|
|
15
|
+
export interface TocType {
|
|
16
|
+
title: string;
|
|
17
|
+
placement: 'top' | 'left' | 'right' | 'none';
|
|
18
|
+
}
|
|
19
|
+
export interface SearchFilterType {
|
|
20
|
+
title?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ContentsType {
|
|
23
|
+
title: string;
|
|
24
|
+
toc: TocType;
|
|
25
|
+
search?: SearchFilterType;
|
|
26
|
+
}
|
|
27
|
+
export interface NavigationListProps {
|
|
28
|
+
title?: string;
|
|
29
|
+
sections: SectionType[];
|
|
30
|
+
}
|
|
31
|
+
export interface FaqProps {
|
|
32
|
+
contents: ContentsType;
|
|
33
|
+
sections: SectionType[];
|
|
34
|
+
initialSections: sectionsConfigType;
|
|
35
|
+
search: (values: Record<string, string>) => void;
|
|
36
|
+
submitValues: {
|
|
37
|
+
text: string;
|
|
38
|
+
};
|
|
39
|
+
activeQa: string;
|
|
40
|
+
onActiveQa: (v: string) => void;
|
|
41
|
+
}
|
|
42
|
+
export declare const Faq: React.ForwardRefExoticComponent<FaqProps & React.RefAttributes<HTMLDivElement>>;
|
|
43
|
+
export default Faq;
|
package/Faq/index.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import React, { useEffect, useContext } from "react";
|
|
2
|
+
import { Field } from "@digigov/form/Field";
|
|
3
|
+
import FormBuilder from "@digigov/form/FormBuilder";
|
|
4
|
+
import { FormContext } from "@digigov/form/FormContext";
|
|
5
|
+
import Results from "@digigov/react-modules/Faq/Results";
|
|
6
|
+
import { createId } from "@digigov/react-modules/Faq/utils";
|
|
7
|
+
import PageTitleContainer, {
|
|
8
|
+
PageTitleHeading
|
|
9
|
+
} from "@digigov/ui/app/PageTitleContainer";
|
|
10
|
+
import {
|
|
11
|
+
Accordion,
|
|
12
|
+
AccordionSection,
|
|
13
|
+
AccordionSectionContent,
|
|
14
|
+
AccordionSectionSummary,
|
|
15
|
+
AccordionSectionSummaryHeading
|
|
16
|
+
} from "@digigov/ui/content/Accordion";
|
|
17
|
+
import { useAccordion } from "@digigov/ui/content/Accordion/hooks";
|
|
18
|
+
import Markdown from "@digigov/ui/content/Markdown";
|
|
19
|
+
import { SearchButton } from "@digigov/ui/form/SearchContainer";
|
|
20
|
+
import { Stack } from "@digigov/ui/layouts";
|
|
21
|
+
import { Aside } from "@digigov/ui/layouts/Basic/Aside";
|
|
22
|
+
import { Container } from "@digigov/ui/layouts/Basic/Container";
|
|
23
|
+
import { Main } from "@digigov/ui/layouts/Basic/Main";
|
|
24
|
+
import Grid from "@digigov/ui/layouts/Grid";
|
|
25
|
+
import SectionBreak from "@digigov/ui/layouts/SectionBreak";
|
|
26
|
+
import { BackToTop } from "@digigov/ui/navigation/BackToTopLink";
|
|
27
|
+
import NavList, { NavListItemAction } from "@digigov/ui/navigation/NavList";
|
|
28
|
+
import { Heading } from "@digigov/ui/typography/Heading";
|
|
29
|
+
import Hint from "@digigov/ui/typography/Hint";
|
|
30
|
+
const FormBuilderSyncValues = ({ values, autoSubmit }) => {
|
|
31
|
+
const form = useContext(FormContext);
|
|
32
|
+
const previousValues = form.getValues();
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const mergedObject = { ...values, ...previousValues };
|
|
35
|
+
let shouldSubmit = false;
|
|
36
|
+
for (const key in mergedObject) {
|
|
37
|
+
if (values[key] !== void 0 && previousValues[key] !== values[key]) {
|
|
38
|
+
shouldSubmit = true;
|
|
39
|
+
previousValues[key] = values[key];
|
|
40
|
+
form.setValue(key, values[key]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (autoSubmit && shouldSubmit) {
|
|
44
|
+
form.submit();
|
|
45
|
+
}
|
|
46
|
+
}, [autoSubmit, form, previousValues, values]);
|
|
47
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
48
|
+
};
|
|
49
|
+
const NavigationList = React.forwardRef(
|
|
50
|
+
function NavigationList2({ title, sections }, ref) {
|
|
51
|
+
return /* @__PURE__ */ React.createElement(NavList, { ref, layout: "vertical", marginBottom: 10 }, title && /* @__PURE__ */ React.createElement(Heading, { size: "md", id: "contents", marginBottom: 4 }, title), sections && sections.length > 0 && sections.map(({ id, title: title2 }, index) => /* @__PURE__ */ React.createElement(NavListItemAction, { key: index, href: `#${createId(id, title2)}` }, title2)));
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
const Faq = React.forwardRef(function FAQ({
|
|
55
|
+
contents,
|
|
56
|
+
sections,
|
|
57
|
+
initialSections,
|
|
58
|
+
submitValues,
|
|
59
|
+
activeQa,
|
|
60
|
+
onActiveQa,
|
|
61
|
+
search
|
|
62
|
+
}, ref) {
|
|
63
|
+
const { section, currentOpen, onOpen, close } = useAccordion({
|
|
64
|
+
singleOpen: true,
|
|
65
|
+
defaultOpen: 0
|
|
66
|
+
});
|
|
67
|
+
const placement = contents.toc?.placement || "none";
|
|
68
|
+
const filteredSections = sections.reduce(
|
|
69
|
+
(acc, section2) => acc + (section2.qa.length || 0),
|
|
70
|
+
0
|
|
71
|
+
);
|
|
72
|
+
const primarySections = initialSections.sections.reduce(
|
|
73
|
+
(acc, section2) => acc + (section2.qa.length || 0),
|
|
74
|
+
0
|
|
75
|
+
);
|
|
76
|
+
const hash = window.location.hash.slice(1);
|
|
77
|
+
const currentId = activeQa ? activeQa : hash;
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (onActiveQa) {
|
|
80
|
+
if (currentOpen && activeQa !== currentOpen) {
|
|
81
|
+
onActiveQa(currentOpen);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}, [activeQa, currentOpen, onActiveQa]);
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (activeQa && activeQa !== currentOpen) {
|
|
87
|
+
onOpen(activeQa);
|
|
88
|
+
}
|
|
89
|
+
}, [activeQa, currentOpen, onOpen]);
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
if (currentId) {
|
|
92
|
+
const element = document.getElementById(currentId);
|
|
93
|
+
if (element) {
|
|
94
|
+
element.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}, [activeQa, currentId, hash]);
|
|
98
|
+
const Onclose = (activeQa2) => {
|
|
99
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
100
|
+
urlParams.delete("text");
|
|
101
|
+
urlParams.delete("activeQa");
|
|
102
|
+
window.history.pushState({}, "", "?" + urlParams.toString());
|
|
103
|
+
onActiveQa("");
|
|
104
|
+
close(activeQa2);
|
|
105
|
+
};
|
|
106
|
+
const handleSubmit = (data) => {
|
|
107
|
+
search(data);
|
|
108
|
+
onActiveQa("");
|
|
109
|
+
close(activeQa);
|
|
110
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
111
|
+
urlParams.delete("activeQa");
|
|
112
|
+
window.history.replaceState({}, "", "?" + urlParams.toString());
|
|
113
|
+
};
|
|
114
|
+
return /* @__PURE__ */ React.createElement(Container, { ref }, placement !== "none" && placement === "left" && /* @__PURE__ */ React.createElement(Aside, { sticky: false }, /* @__PURE__ */ React.createElement(NavigationList, { title: contents.toc?.title, sections })), /* @__PURE__ */ React.createElement(Main, null, /* @__PURE__ */ React.createElement(PageTitleContainer, null, /* @__PURE__ */ React.createElement(PageTitleHeading, { size: "xl", id: "faq" }, contents?.title)), placement !== "none" && placement === "top" && /* @__PURE__ */ React.createElement(NavigationList, { title: contents?.toc?.title, sections }), contents.search && /* @__PURE__ */ React.createElement(FormBuilder, { onSubmit: handleSubmit, initial: { text: "" } }, submitValues && /* @__PURE__ */ React.createElement(FormBuilderSyncValues, { values: submitValues, autoSubmit: true }), /* @__PURE__ */ React.createElement(
|
|
115
|
+
Stack,
|
|
116
|
+
{
|
|
117
|
+
direction: "row",
|
|
118
|
+
flexWrap: "nowrap",
|
|
119
|
+
alignItems: "flex-end",
|
|
120
|
+
spacing: 4
|
|
121
|
+
},
|
|
122
|
+
/* @__PURE__ */ React.createElement(Grid, { container: true, style: { width: "100%" } }, /* @__PURE__ */ React.createElement(
|
|
123
|
+
Field,
|
|
124
|
+
{
|
|
125
|
+
type: "string",
|
|
126
|
+
key: "text",
|
|
127
|
+
name: "text",
|
|
128
|
+
placeholder: "\u0391\u03BD\u03B1\u03B6\u03B7\u03C4\u03AE\u03C3\u03C4\u03B5 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C1\u03CE\u03C4\u03B7\u03C3\u03AE \u03C3\u03B1\u03C2",
|
|
129
|
+
label: { primary: contents.search.title }
|
|
130
|
+
}
|
|
131
|
+
)),
|
|
132
|
+
/* @__PURE__ */ React.createElement(
|
|
133
|
+
SearchButton,
|
|
134
|
+
{
|
|
135
|
+
type: "submit",
|
|
136
|
+
mb: { md: 10 },
|
|
137
|
+
style: { minHeight: "2.75rem" }
|
|
138
|
+
}
|
|
139
|
+
)
|
|
140
|
+
), filteredSections !== primarySections && /* @__PURE__ */ React.createElement(
|
|
141
|
+
Results,
|
|
142
|
+
{
|
|
143
|
+
filteredSections,
|
|
144
|
+
primarySections,
|
|
145
|
+
Onclose,
|
|
146
|
+
activeQa
|
|
147
|
+
}
|
|
148
|
+
)), /* @__PURE__ */ React.createElement(Grid, null, sections && sections.length > 0 ? sections.map(({ id: sectionId, title, qa }, index) => /* @__PURE__ */ React.createElement(React.Fragment, { key: index }, /* @__PURE__ */ React.createElement(Heading, { id: createId(sectionId, title), size: "lg" }, title), /* @__PURE__ */ React.createElement(Accordion, { marginBottom: qa && qa.length > 0 ? 12 : 0 }, qa?.map(({ id, question, answer }, indx) => /* @__PURE__ */ React.createElement(
|
|
149
|
+
AccordionSection,
|
|
150
|
+
{
|
|
151
|
+
key: indx,
|
|
152
|
+
...section(createId(id, question))
|
|
153
|
+
},
|
|
154
|
+
/* @__PURE__ */ React.createElement(AccordionSectionSummary, null, /* @__PURE__ */ React.createElement(
|
|
155
|
+
AccordionSectionSummaryHeading,
|
|
156
|
+
{
|
|
157
|
+
"aria-controls": createId(id, question)
|
|
158
|
+
},
|
|
159
|
+
question
|
|
160
|
+
)),
|
|
161
|
+
/* @__PURE__ */ React.createElement(AccordionSectionContent, { id: createId(id, question) }, /* @__PURE__ */ React.createElement(Markdown, { content: answer }))
|
|
162
|
+
))), /* @__PURE__ */ React.createElement(SectionBreak, { visible: false }))) : /* @__PURE__ */ React.createElement(Hint, { marginBottom: 10 }, "\u0394\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03B1.")), /* @__PURE__ */ React.createElement(BackToTop, { topLimitId: "contents", id: "back-to-top" }, "\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C3\u03C4\u03B1 \u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03B1")), placement !== "none" && placement === "right" && /* @__PURE__ */ React.createElement(Aside, { sticky: false }, /* @__PURE__ */ React.createElement(NavigationList, { title: contents?.toc?.title, sections })));
|
|
163
|
+
});
|
|
164
|
+
var Faq_default = Faq;
|
|
165
|
+
export {
|
|
166
|
+
Faq,
|
|
167
|
+
Faq_default as default
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
package/Faq/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/Faq/index.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useEffect, useContext } from 'react';\nimport { Field } from '@digigov/form/Field';\nimport FormBuilder from '@digigov/form/FormBuilder';\nimport { FormContext } from '@digigov/form/FormContext';\nimport Results from '@digigov/react-modules/Faq/Results';\nimport { createId } from '@digigov/react-modules/Faq/utils';\nimport PageTitleContainer, {\n PageTitleHeading,\n} from '@digigov/ui/app/PageTitleContainer';\nimport {\n Accordion,\n AccordionSection,\n AccordionSectionContent,\n AccordionSectionSummary,\n AccordionSectionSummaryHeading,\n} from '@digigov/ui/content/Accordion';\nimport { useAccordion } from '@digigov/ui/content/Accordion/hooks';\nimport Markdown from '@digigov/ui/content/Markdown';\nimport { SearchButton } from '@digigov/ui/form/SearchContainer';\nimport { Stack } from '@digigov/ui/layouts';\nimport { Aside } from '@digigov/ui/layouts/Basic/Aside';\nimport { Container } from '@digigov/ui/layouts/Basic/Container';\nimport { Main } from '@digigov/ui/layouts/Basic/Main';\nimport Grid from '@digigov/ui/layouts/Grid';\nimport SectionBreak from '@digigov/ui/layouts/SectionBreak';\nimport { BackToTop } from '@digigov/ui/navigation/BackToTopLink';\nimport NavList, { NavListItemAction } from '@digigov/ui/navigation/NavList';\nimport { Heading } from '@digigov/ui/typography/Heading';\nimport Hint from '@digigov/ui/typography/Hint';\n\nexport interface sectionsConfigType {\n sections: SectionType[];\n}\n\nexport interface QaType {\n id?: string;\n question: string;\n answer: string;\n}\n\nexport interface SectionType {\n id: string;\n title: string;\n qa: QaType[];\n}\n\nexport interface TocType {\n title: string;\n placement: 'top' | 'left' | 'right' | 'none';\n}\n\nexport interface SearchFilterType {\n title?: string;\n}\n\nexport interface ContentsType {\n title: string;\n toc: TocType;\n search?: SearchFilterType;\n}\n\nexport interface NavigationListProps {\n title?: string;\n sections: SectionType[];\n}\n\nexport interface FaqProps {\n contents: ContentsType;\n sections: SectionType[];\n initialSections: sectionsConfigType;\n search: (values: Record<string, string>) => void;\n submitValues: { text: string };\n activeQa: string;\n onActiveQa: (v: string) => void;\n}\n\nconst FormBuilderSyncValues = ({ values, autoSubmit }) => {\n const form = useContext(FormContext);\n const previousValues = form.getValues();\n useEffect(() => {\n const mergedObject = { ...values, ...previousValues };\n let shouldSubmit = false;\n for (const key in mergedObject) {\n // catching the filters that have been parsed from url & avoid continuous submitting\n if (values[key] !== undefined && previousValues[key] !== values[key]) {\n shouldSubmit = true;\n previousValues[key] = values[key];\n form.setValue(key, values[key]);\n }\n }\n if (autoSubmit && shouldSubmit) {\n form.submit();\n }\n }, [autoSubmit, form, previousValues, values]);\n return <></>;\n};\n\nconst NavigationList = React.forwardRef<HTMLUListElement, NavigationListProps>(\n function NavigationList({ title, sections }, ref) {\n return (\n <NavList ref={ref} layout=\"vertical\" marginBottom={10}>\n {title && (\n <Heading size=\"md\" id=\"contents\" marginBottom={4}>\n {title}\n </Heading>\n )}\n {sections &&\n sections.length > 0 &&\n sections.map(({ id, title }, index) => (\n <NavListItemAction key={index} href={`#${createId(id, title)}`}>\n {title}\n </NavListItemAction>\n ))}\n </NavList>\n );\n }\n);\n\nexport const Faq = React.forwardRef<HTMLDivElement, FaqProps>(function FAQ(\n {\n contents,\n sections,\n initialSections,\n submitValues,\n activeQa,\n onActiveQa,\n search,\n },\n ref\n) {\n const { section, currentOpen, onOpen, close } = useAccordion({\n singleOpen: true,\n defaultOpen: 0,\n });\n const placement = contents.toc?.placement || 'none';\n const filteredSections = sections.reduce(\n (acc, section) => acc + (section.qa.length || 0),\n 0\n );\n const primarySections = initialSections.sections.reduce(\n (acc, section) => acc + (section.qa.length || 0),\n 0\n );\n const hash = window.location.hash.slice(1);\n const currentId = activeQa ? activeQa : hash;\n\n useEffect(() => {\n if (onActiveQa) {\n if (currentOpen && activeQa !== currentOpen) {\n onActiveQa(currentOpen as string);\n }\n }\n }, [activeQa, currentOpen, onActiveQa]);\n\n useEffect(() => {\n if (activeQa && activeQa !== currentOpen) {\n onOpen(activeQa);\n }\n }, [activeQa, currentOpen, onOpen]);\n\n useEffect(() => {\n // Scroll to the target element if it exists\n if (currentId) {\n const element = document.getElementById(currentId);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n }, [activeQa, currentId, hash]);\n\n const Onclose = (activeQa) => {\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.delete('text');\n urlParams.delete('activeQa');\n window.history.pushState({}, '', '?' + urlParams.toString());\n onActiveQa('');\n close(activeQa);\n };\n const handleSubmit = (data) => {\n search(data);\n onActiveQa('');\n close(activeQa);\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.delete('activeQa');\n window.history.replaceState({}, '', '?' + urlParams.toString());\n };\n\n return (\n <Container ref={ref}>\n {placement !== 'none' && placement === 'left' && (\n <Aside sticky={false}>\n <NavigationList title={contents.toc?.title} sections={sections} />\n </Aside>\n )}\n <Main>\n <PageTitleContainer>\n <PageTitleHeading size=\"xl\" id=\"faq\">\n {contents?.title}\n </PageTitleHeading>\n </PageTitleContainer>\n {placement !== 'none' && placement === 'top' && (\n <NavigationList title={contents?.toc?.title} sections={sections} />\n )}\n\n {contents.search && (\n <FormBuilder onSubmit={handleSubmit} initial={{ text: '' }}>\n {submitValues && (\n <FormBuilderSyncValues values={submitValues} autoSubmit={true} />\n )}\n <Stack\n direction=\"row\"\n flexWrap=\"nowrap\"\n alignItems=\"flex-end\"\n spacing={4}\n >\n <Grid container style={{ width: '100%' }}>\n <Field\n type=\"string\"\n key=\"text\"\n name=\"text\"\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03B7\u03C4\u03AE\u03C3\u03C4\u03B5 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C1\u03CE\u03C4\u03B7\u03C3\u03AE \u03C3\u03B1\u03C2\"\n label={{ primary: contents.search.title }}\n />\n </Grid>\n <SearchButton\n type=\"submit\"\n mb={{ md: 10 }}\n style={{ minHeight: '2.75rem' }}\n />\n </Stack>\n {filteredSections !== primarySections && (\n <Results\n filteredSections={filteredSections}\n primarySections={primarySections}\n Onclose={Onclose}\n activeQa={activeQa}\n />\n )}\n </FormBuilder>\n )}\n <Grid>\n {sections && sections.length > 0 ? (\n sections.map(({ id: sectionId, title, qa }, index) => (\n <React.Fragment key={index}>\n <Heading id={createId(sectionId, title)} size=\"lg\">\n {title}\n </Heading>\n <Accordion marginBottom={qa && qa.length > 0 ? 12 : 0}>\n {qa?.map(({ id, question, answer }, indx) => (\n <AccordionSection\n key={indx}\n {...section(createId(id, question))}\n >\n <AccordionSectionSummary>\n <AccordionSectionSummaryHeading\n aria-controls={createId(id, question)}\n >\n {question}\n </AccordionSectionSummaryHeading>\n </AccordionSectionSummary>\n <AccordionSectionContent id={createId(id, question)}>\n <Markdown content={answer} />\n </AccordionSectionContent>\n </AccordionSection>\n ))}\n </Accordion>\n <SectionBreak visible={false} />\n </React.Fragment>\n ))\n ) : (\n <Hint marginBottom={10}>\u0394\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03B1.</Hint>\n )}\n </Grid>\n <BackToTop topLimitId=\"contents\" id=\"back-to-top\">\n \u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C3\u03C4\u03B1 \u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03B1\n </BackToTop>\n </Main>\n {placement !== 'none' && placement === 'right' && (\n <Aside sticky={false}>\n <NavigationList title={contents?.toc?.title} sections={sections} />\n </Aside>\n )}\n </Container>\n );\n});\nexport default Faq;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["NavigationList", "title", "section", "activeQa"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/Faq/package.json
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
function slug(text, maxWidth = 50) {
|
|
2
|
+
const greekToLatinMap = {
|
|
3
|
+
\u03B1: "a",
|
|
4
|
+
\u03B2: "b",
|
|
5
|
+
\u03B3: "g",
|
|
6
|
+
\u03B4: "d",
|
|
7
|
+
\u03B5: "e",
|
|
8
|
+
\u03B6: "z",
|
|
9
|
+
\u03B7: "i",
|
|
10
|
+
\u03B8: "th",
|
|
11
|
+
\u03B9: "i",
|
|
12
|
+
\u03BA: "k",
|
|
13
|
+
\u03BB: "l",
|
|
14
|
+
\u03BC: "m",
|
|
15
|
+
\u03BD: "n",
|
|
16
|
+
\u03BE: "x",
|
|
17
|
+
\u03BF: "o",
|
|
18
|
+
\u03C0: "p",
|
|
19
|
+
\u03C1: "r",
|
|
20
|
+
\u03C3: "s",
|
|
21
|
+
\u03C4: "t",
|
|
22
|
+
\u03C5: "y",
|
|
23
|
+
\u03C6: "f",
|
|
24
|
+
\u03C7: "ch",
|
|
25
|
+
\u03C8: "ps",
|
|
26
|
+
\u03C9: "o",
|
|
27
|
+
\u03AC: "a",
|
|
28
|
+
\u03AD: "e",
|
|
29
|
+
\u03AF: "i",
|
|
30
|
+
\u03CC: "o",
|
|
31
|
+
\u03CD: "y",
|
|
32
|
+
\u03AE: "i",
|
|
33
|
+
\u03CE: "o",
|
|
34
|
+
\u03C2: "s",
|
|
35
|
+
\u03CA: "i",
|
|
36
|
+
\u03B0: "y",
|
|
37
|
+
\u03CB: "y",
|
|
38
|
+
\u0390: "i",
|
|
39
|
+
\u0391: "A",
|
|
40
|
+
\u0392: "B",
|
|
41
|
+
\u0393: "G",
|
|
42
|
+
\u0394: "D",
|
|
43
|
+
\u0395: "E",
|
|
44
|
+
\u0396: "Z",
|
|
45
|
+
\u0397: "I",
|
|
46
|
+
\u0398: "TH",
|
|
47
|
+
\u0399: "I",
|
|
48
|
+
\u039A: "K",
|
|
49
|
+
\u039B: "L",
|
|
50
|
+
\u039C: "M",
|
|
51
|
+
\u039D: "N",
|
|
52
|
+
\u039E: "X",
|
|
53
|
+
\u039F: "O",
|
|
54
|
+
\u03A0: "P",
|
|
55
|
+
\u03A1: "R",
|
|
56
|
+
\u03A3: "S",
|
|
57
|
+
\u03A4: "T",
|
|
58
|
+
\u03A5: "Y",
|
|
59
|
+
\u03A6: "F",
|
|
60
|
+
\u03A7: "CH",
|
|
61
|
+
\u03A8: "PS",
|
|
62
|
+
\u03A9: "O",
|
|
63
|
+
\u0386: "A",
|
|
64
|
+
\u0388: "E",
|
|
65
|
+
\u038A: "I",
|
|
66
|
+
\u038C: "O",
|
|
67
|
+
\u038E: "Y",
|
|
68
|
+
\u0389: "I",
|
|
69
|
+
\u038F: "O",
|
|
70
|
+
\u03AA: "I",
|
|
71
|
+
\u03AB: "Y"
|
|
72
|
+
};
|
|
73
|
+
const latinText = text.split("").map((char) => greekToLatinMap[char] || char).join("");
|
|
74
|
+
const processedText = latinText.toLowerCase().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
|
|
75
|
+
let slug2 = processedText.substring(0, maxWidth);
|
|
76
|
+
const remainingText = processedText.substring(maxWidth);
|
|
77
|
+
slug2 = slug2.replace(/-+$/, "");
|
|
78
|
+
const id = generateIDFromText(remainingText);
|
|
79
|
+
return `${slug2}${id && "-"}${id}`;
|
|
80
|
+
}
|
|
81
|
+
function generateIDFromText(text) {
|
|
82
|
+
if (!text) return "";
|
|
83
|
+
let processedText = text.replace(/-/g, "").replace(/[^a-z0-9]/g, "");
|
|
84
|
+
if (!processedText) processedText = "default";
|
|
85
|
+
let hash = 0;
|
|
86
|
+
for (let i = 0; i < processedText.length; i++) {
|
|
87
|
+
const char = processedText.charCodeAt(i);
|
|
88
|
+
hash = (hash << 5) - hash + char;
|
|
89
|
+
hash = hash & hash;
|
|
90
|
+
}
|
|
91
|
+
const id = Math.abs(hash).toString(36);
|
|
92
|
+
return id;
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
slug
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=slug.js.map
|
package/Faq/slug.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function slug(text: string, maxWidth?: number): string;
|
package/Faq/slug.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/Faq/slug.ts"],
|
|
4
|
+
"sourcesContent": ["export function slug(text: string, maxWidth = 50): string {\n // Greek to Latin character mapping\n const greekToLatinMap: Record<string, string> = {\n \u03B1: 'a',\n \u03B2: 'b',\n \u03B3: 'g',\n \u03B4: 'd',\n \u03B5: 'e',\n \u03B6: 'z',\n \u03B7: 'i',\n \u03B8: 'th',\n \u03B9: 'i',\n \u03BA: 'k',\n \u03BB: 'l',\n \u03BC: 'm',\n \u03BD: 'n',\n \u03BE: 'x',\n \u03BF: 'o',\n \u03C0: 'p',\n \u03C1: 'r',\n \u03C3: 's',\n \u03C4: 't',\n \u03C5: 'y',\n \u03C6: 'f',\n \u03C7: 'ch',\n \u03C8: 'ps',\n \u03C9: 'o',\n \u03AC: 'a',\n \u03AD: 'e',\n \u03AF: 'i',\n \u03CC: 'o',\n \u03CD: 'y',\n \u03AE: 'i',\n \u03CE: 'o',\n \u03C2: 's',\n \u03CA: 'i',\n \u03B0: 'y',\n \u03CB: 'y',\n \u0390: 'i',\n \u0391: 'A',\n \u0392: 'B',\n \u0393: 'G',\n \u0394: 'D',\n \u0395: 'E',\n \u0396: 'Z',\n \u0397: 'I',\n \u0398: 'TH',\n \u0399: 'I',\n \u039A: 'K',\n \u039B: 'L',\n \u039C: 'M',\n \u039D: 'N',\n \u039E: 'X',\n \u039F: 'O',\n \u03A0: 'P',\n \u03A1: 'R',\n \u03A3: 'S',\n \u03A4: 'T',\n \u03A5: 'Y',\n \u03A6: 'F',\n \u03A7: 'CH',\n \u03A8: 'PS',\n \u03A9: 'O',\n \u0386: 'A',\n \u0388: 'E',\n \u038A: 'I',\n \u038C: 'O',\n \u038E: 'Y',\n \u0389: 'I',\n \u038F: 'O',\n \u03AA: 'I',\n \u03AB: 'Y',\n };\n\n // Convert Greek characters to Latin\n const latinText = text\n .split('')\n .map((char) => greekToLatinMap[char] || char)\n .join('');\n\n // Convert to lowercase, replace spaces with hyphens, remove special characters\n const processedText = latinText\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n\n // Calculate the available width for the slug (subtracting 1 for the hyphen and at least 8 for the ID)\n // const availableWidth = Math.max(0, maxWidth - 9);\n\n // Split the processed text into slug and remaining text for ID\n let slug = processedText.substring(0, maxWidth);\n const remainingText = processedText.substring(maxWidth);\n\n // Remove trailing hyphens from the slug\n slug = slug.replace(/-+$/, '');\n\n // Generate ID from the remaining text\n const id = generateIDFromText(remainingText);\n\n // Combine the slug and ID\n return `${slug}${id && '-'}${id}`;\n}\nfunction generateIDFromText(text: string): string {\n // If text is empty or maxLength is 0 or less, return a default ID\n if (!text) return '';\n\n // Remove hyphens and take only alphanumeric characters\n let processedText = text.replace(/-/g, '').replace(/[^a-z0-9]/g, '');\n\n // If processed text is empty, use a default base\n if (!processedText) processedText = 'default';\n\n // Calculate a simple hash of the processed text\n let hash = 0;\n for (let i = 0; i < processedText.length; i++) {\n const char = processedText.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n // Convert hash to a positive number and then to base 36 (0-9 and a-z)\n const id = Math.abs(hash).toString(36);\n\n // Ensure the ID is at least 8 characters long, padding with '0' if necessary\n return id;\n // return id.padEnd(8, '0').substring(0, maxLength);\n}\n\n// Test the function\n// console.log(createSlugWithID('\u039A\u03B1\u03BB\u03B7\u03BC\u03AD\u03C1\u03B1 \u03BA\u03CC\u03C3\u03BC\u03B5! Hello world!', 10));\n// console.log(createSlugWithID('\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC \u03BA\u03B1\u03B9 English mixed', 80));\n// console.log(\n// createSlugWithID(\n// '\u0391\u03C5\u03C4\u03CC \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B4\u03BF\u03BA\u03B9\u03BC\u03AC\u03C3\u03BF\u03C5\u03BC\u03B5 \u03C4\u03BF \u03CC\u03C1\u03B9\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C5\u03C2',\n// 90\n// )\n// );\n"],
|
|
5
|
+
"mappings": "AAAO,SAAS,KAAK,MAAc,WAAW,IAAY;AAExD,QAAM,kBAA0C;AAAA,IAC9C,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,IACH,QAAG;AAAA,EACL;AAGA,QAAM,YAAY,KACf,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,gBAAgB,IAAI,KAAK,IAAI,EAC3C,KAAK,EAAE;AAGV,QAAM,gBAAgB,UACnB,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,YAAY,EAAE,EACtB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE;AAMpB,MAAIA,QAAO,cAAc,UAAU,GAAG,QAAQ;AAC9C,QAAM,gBAAgB,cAAc,UAAU,QAAQ;AAGtD,EAAAA,QAAOA,MAAK,QAAQ,OAAO,EAAE;AAG7B,QAAM,KAAK,mBAAmB,aAAa;AAG3C,SAAO,GAAGA,KAAI,GAAG,MAAM,GAAG,GAAG,EAAE;AACjC;AACA,SAAS,mBAAmB,MAAsB;AAEhD,MAAI,CAAC,KAAM,QAAO;AAGlB,MAAI,gBAAgB,KAAK,QAAQ,MAAM,EAAE,EAAE,QAAQ,cAAc,EAAE;AAGnE,MAAI,CAAC,cAAe,iBAAgB;AAGpC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAM,OAAO,cAAc,WAAW,CAAC;AACvC,YAAQ,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,KAAK,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE;AAGrC,SAAO;AAET;",
|
|
6
|
+
"names": ["slug"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/Faq/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createId: (id: string | undefined, text: string) => string;
|
package/Faq/utils.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/Faq/utils.ts"],
|
|
4
|
+
"sourcesContent": ["import { slug } from '@digigov/react-modules/Faq/slug';\n\nexport const createId = (id: string | undefined, text: string) => {\n return id ? id : slug(text); // Fallback to slug(text) when id is undefined\n};\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY;AAEd,MAAM,WAAW,CAAC,IAAwB,SAAiB;AAChE,SAAO,KAAK,KAAK,KAAK,IAAI;AAC5B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export declare const Default: () => React.JSX.Element;
|
|
2
|
+
export declare const Default: (_: any) => React.JSX.Element;
|