@strapi/admin 5.29.0 → 5.30.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/dist/admin/admin/src/components/FormInputs/String.js +2 -1
- package/dist/admin/admin/src/components/FormInputs/String.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.mjs +2 -1
- package/dist/admin/admin/src/components/FormInputs/String.mjs.map +1 -1
- package/dist/admin/admin/src/components/Theme.js +34 -1
- package/dist/admin/admin/src/components/Theme.js.map +1 -1
- package/dist/admin/admin/src/components/Theme.mjs +34 -1
- package/dist/admin/admin/src/components/Theme.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.js +1 -0
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.mjs +1 -0
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.js +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.js +1 -0
- package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -0
- package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +4 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +4 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/server/server/src/services/user.js +30 -0
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +30 -0
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -24,7 +24,8 @@ const StringInput = /*#__PURE__*/ React.forwardRef(({ name, required, label, hin
|
|
|
24
24
|
ref: composedRefs,
|
|
25
25
|
onChange: field.onChange,
|
|
26
26
|
value: field.value ?? '',
|
|
27
|
-
...props
|
|
27
|
+
...props,
|
|
28
|
+
type: "text"
|
|
28
29
|
}),
|
|
29
30
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Hint, {}),
|
|
30
31
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"String.js","sources":["../../../../../../admin/src/components/FormInputs/String.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { TextInput, useComposedRefs, Field } from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { type InputProps, useField } from '../Form';\n\nconst StringInput = forwardRef<HTMLInputElement, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField<HTMLInputElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <TextInput\n ref={composedRefs}\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedStringInput = memo(StringInput);\n\nexport { MemoizedStringInput as StringInput };\n"],"names":["StringInput","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","TextInput","onChange","value","Hint","Error","MemoizedStringInput","memo"],"mappings":";;;;;;;;AAOA,MAAMA,4BAAcC,gBAClB,CAAA,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,aAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,qCAAqCV,CAAAA,IAAAA,CAAAA;IAEtD,MAAMW,YAAAA,GAAeC,6BAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,eAAA,CAACC,mBAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,cAAA,CAACH,mBAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,cAACG,CAAAA,sBAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;AACLU,gBAAAA,QAAAA,EAAUd,MAAMc,QAAQ;gBACxBC,KAAOf,EAAAA,KAAAA,CAAMe,KAAK,IAAI,EAAA;AACrB,gBAAA,GAAGjB;;
|
|
1
|
+
{"version":3,"file":"String.js","sources":["../../../../../../admin/src/components/FormInputs/String.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { TextInput, useComposedRefs, Field } from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { type InputProps, useField } from '../Form';\n\nconst StringInput = forwardRef<HTMLInputElement, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField<HTMLInputElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <TextInput\n ref={composedRefs}\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n type=\"text\"\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedStringInput = memo(StringInput);\n\nexport { MemoizedStringInput as StringInput };\n"],"names":["StringInput","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","TextInput","onChange","value","type","Hint","Error","MemoizedStringInput","memo"],"mappings":";;;;;;;;AAOA,MAAMA,4BAAcC,gBAClB,CAAA,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,aAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,qCAAqCV,CAAAA,IAAAA,CAAAA;IAEtD,MAAMW,YAAAA,GAAeC,6BAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,eAAA,CAACC,mBAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,cAAA,CAACH,mBAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,cAACG,CAAAA,sBAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;AACLU,gBAAAA,QAAAA,EAAUd,MAAMc,QAAQ;gBACxBC,KAAOf,EAAAA,KAAAA,CAAMe,KAAK,IAAI,EAAA;AACrB,gBAAA,GAAGjB,KAAK;gBACTkB,IAAK,EAAA;;AAEP,0BAAAN,cAAA,CAACH,mBAAMU,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAP,cAAA,CAACH,mBAAMW,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGF,MAAMC,oCAAsBC,UAAK7B,CAAAA,WAAAA;;;;"}
|
|
@@ -22,7 +22,8 @@ const StringInput = /*#__PURE__*/ forwardRef(({ name, required, label, hint, lab
|
|
|
22
22
|
ref: composedRefs,
|
|
23
23
|
onChange: field.onChange,
|
|
24
24
|
value: field.value ?? '',
|
|
25
|
-
...props
|
|
25
|
+
...props,
|
|
26
|
+
type: "text"
|
|
26
27
|
}),
|
|
27
28
|
/*#__PURE__*/ jsx(Field.Hint, {}),
|
|
28
29
|
/*#__PURE__*/ jsx(Field.Error, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"String.mjs","sources":["../../../../../../admin/src/components/FormInputs/String.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { TextInput, useComposedRefs, Field } from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { type InputProps, useField } from '../Form';\n\nconst StringInput = forwardRef<HTMLInputElement, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField<HTMLInputElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <TextInput\n ref={composedRefs}\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedStringInput = memo(StringInput);\n\nexport { MemoizedStringInput as StringInput };\n"],"names":["StringInput","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","TextInput","onChange","value","Hint","Error","MemoizedStringInput","memo"],"mappings":";;;;;;AAOA,MAAMA,4BAAcC,UAClB,CAAA,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,QAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,kBAAqCV,CAAAA,IAAAA,CAAAA;IAEtD,MAAMW,YAAAA,GAAeC,gBAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,IAAA,CAACC,MAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,GAAA,CAACH,MAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,GAACG,CAAAA,SAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;AACLU,gBAAAA,QAAAA,EAAUd,MAAMc,QAAQ;gBACxBC,KAAOf,EAAAA,KAAAA,CAAMe,KAAK,IAAI,EAAA;AACrB,gBAAA,GAAGjB;;
|
|
1
|
+
{"version":3,"file":"String.mjs","sources":["../../../../../../admin/src/components/FormInputs/String.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { TextInput, useComposedRefs, Field } from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { type InputProps, useField } from '../Form';\n\nconst StringInput = forwardRef<HTMLInputElement, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField<HTMLInputElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <TextInput\n ref={composedRefs}\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n type=\"text\"\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedStringInput = memo(StringInput);\n\nexport { MemoizedStringInput as StringInput };\n"],"names":["StringInput","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","TextInput","onChange","value","type","Hint","Error","MemoizedStringInput","memo"],"mappings":";;;;;;AAOA,MAAMA,4BAAcC,UAClB,CAAA,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,QAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,kBAAqCV,CAAAA,IAAAA,CAAAA;IAEtD,MAAMW,YAAAA,GAAeC,gBAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,IAAA,CAACC,MAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,GAAA,CAACH,MAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,GAACG,CAAAA,SAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;AACLU,gBAAAA,QAAAA,EAAUd,MAAMc,QAAQ;gBACxBC,KAAOf,EAAAA,KAAAA,CAAMe,KAAK,IAAI,EAAA;AACrB,gBAAA,GAAGjB,KAAK;gBACTkB,IAAK,EAAA;;AAEP,0BAAAN,GAAA,CAACH,MAAMU,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAP,GAAA,CAACH,MAAMW,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGF,MAAMC,oCAAsBC,IAAK7B,CAAAA,WAAAA;;;;"}
|
|
@@ -33,6 +33,14 @@ const Theme = ({ children, themes })=>{
|
|
|
33
33
|
const [systemTheme, setSystemTheme] = React__namespace.useState();
|
|
34
34
|
const { locale } = reactIntl.useIntl();
|
|
35
35
|
const dispatch = reactRedux.useDispatch();
|
|
36
|
+
const isIos = [
|
|
37
|
+
'iPad Simulator',
|
|
38
|
+
'iPhone Simulator',
|
|
39
|
+
'iPod Simulator',
|
|
40
|
+
'iPad',
|
|
41
|
+
'iPhone',
|
|
42
|
+
'iPod'
|
|
43
|
+
].includes(navigator.platform) || navigator.userAgent.includes('Mac') && 'ontouchend' in document;
|
|
36
44
|
// Listen to changes in the system theme
|
|
37
45
|
React__namespace.useEffect(()=>{
|
|
38
46
|
const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');
|
|
@@ -62,7 +70,9 @@ const Theme = ({ children, themes })=>{
|
|
|
62
70
|
*/ theme: themes?.[computedThemeName || 'light'],
|
|
63
71
|
children: [
|
|
64
72
|
children,
|
|
65
|
-
/*#__PURE__*/ jsxRuntime.jsx(GlobalStyle, {
|
|
73
|
+
/*#__PURE__*/ jsxRuntime.jsx(GlobalStyle, {
|
|
74
|
+
$shouldOverrideInputFontSize: isIos
|
|
75
|
+
})
|
|
66
76
|
]
|
|
67
77
|
});
|
|
68
78
|
};
|
|
@@ -70,6 +80,29 @@ const GlobalStyle = styled.createGlobalStyle`
|
|
|
70
80
|
body {
|
|
71
81
|
background: ${({ theme })=>theme.colors.neutral100};
|
|
72
82
|
}
|
|
83
|
+
|
|
84
|
+
// Temporary fix override to fix iOS zoom due to the 14px input font size
|
|
85
|
+
${({ $shouldOverrideInputFontSize })=>$shouldOverrideInputFontSize ? `
|
|
86
|
+
input[type="color"],
|
|
87
|
+
input[type="date"],
|
|
88
|
+
input[type="datetime"],
|
|
89
|
+
input[type="datetime-local"],
|
|
90
|
+
input[type="email"],
|
|
91
|
+
input[type="month"],
|
|
92
|
+
input[type="number"],
|
|
93
|
+
input[type="password"],
|
|
94
|
+
input[type="search"],
|
|
95
|
+
input[type="tel"],
|
|
96
|
+
input[type="text"],
|
|
97
|
+
input[type="time"],
|
|
98
|
+
input[type="url"],
|
|
99
|
+
input[type="week"],
|
|
100
|
+
select:focus,
|
|
101
|
+
textarea {
|
|
102
|
+
font-size: 16px !important;
|
|
103
|
+
line-height: 2.4rem !important;
|
|
104
|
+
}
|
|
105
|
+
` : undefined}
|
|
73
106
|
`;
|
|
74
107
|
|
|
75
108
|
exports.Theme = Theme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Theme.js","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle
|
|
1
|
+
{"version":3,"file":"Theme.js","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n const isIos =\n ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform\n ) ||\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document);\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle $shouldOverrideInputFontSize={isIos} />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle<{ $shouldOverrideInputFontSize: boolean }>`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n // Temporary fix override to fix iOS zoom due to the 14px input font size\n ${({ $shouldOverrideInputFontSize }) =>\n $shouldOverrideInputFontSize\n ? `\n input[type=\"color\"],\n input[type=\"date\"],\n input[type=\"datetime\"],\n input[type=\"datetime-local\"],\n input[type=\"email\"],\n input[type=\"month\"],\n input[type=\"number\"],\n input[type=\"password\"],\n input[type=\"search\"],\n input[type=\"tel\"],\n input[type=\"text\"],\n input[type=\"time\"],\n input[type=\"url\"],\n input[type=\"week\"],\n select:focus,\n textarea {\n font-size: 16px !important;\n line-height: 2.4rem !important;\n }\n `\n : undefined}\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n"],"names":["Theme","children","themes","currentTheme","useTypedSelector","state","admin_app","theme","systemTheme","setSystemTheme","React","useState","locale","useIntl","dispatch","useDispatch","isIos","includes","navigator","platform","userAgent","document","useEffect","themeWatcher","window","matchMedia","matches","listener","event","addEventListener","removeEventListener","setAvailableThemes","Object","keys","computedThemeName","_jsxs","DesignSystemProvider","_jsx","GlobalStyle","$shouldOverrideInputFontSize","createGlobalStyle","colors","neutral100","undefined"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAMA,QAAQ,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAc,GAAA;IAC7C,MAAM,EAAEC,YAAY,EAAE,GAAGC,sBAAAA,CAAiB,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,CAACC,KAAK,CAAA;AAC1E,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAe,CAAA,GAAGC,iBAAMC,QAAQ,EAAA;IACpD,MAAM,EAAEC,MAAM,EAAE,GAAGC,iBAAAA,EAAAA;AACnB,IAAA,MAAMC,QAAWC,GAAAA,sBAAAA,EAAAA;AACjB,IAAA,MAAMC,KACJ,GAAA;AAAC,QAAA,gBAAA;AAAkB,QAAA,kBAAA;AAAoB,QAAA,gBAAA;AAAkB,QAAA,MAAA;AAAQ,QAAA,QAAA;AAAU,QAAA;KAAO,CAACC,QAAQ,CACzFC,SAAAA,CAAUC,QAAQ,CAAA,IAEnBD,SAAUE,CAAAA,SAAS,CAACH,QAAQ,CAAC,KAAA,CAAA,IAAU,YAAgBI,IAAAA,QAAAA;;AAG1DX,IAAAA,gBAAAA,CAAMY,SAAS,CAAC,IAAA;QACd,MAAMC,YAAAA,GAAeC,MAAOC,CAAAA,UAAU,CAAC,8BAAA,CAAA;QACvChB,cAAec,CAAAA,YAAAA,CAAaG,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAE/C,QAAA,MAAMC,WAAW,CAACC,KAAAA,GAAAA;YAChBnB,cAAemB,CAAAA,KAAAA,CAAMF,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAC1C,SAAA;QACAH,YAAaM,CAAAA,gBAAgB,CAAC,QAAUF,EAAAA,QAAAA,CAAAA;;QAGxC,OAAO,IAAA;YACLJ,YAAaO,CAAAA,mBAAmB,CAAC,QAAUH,EAAAA,QAAAA,CAAAA;AAC7C,SAAA;AACF,KAAA,EAAG,EAAE,CAAA;AAELjB,IAAAA,gBAAAA,CAAMY,SAAS,CAAC,IAAA;QACdR,QAASiB,CAAAA,0BAAAA,CAAmBC,MAAOC,CAAAA,IAAI,CAAC/B,MAAAA,CAAAA,CAAAA,CAAAA;KACvC,EAAA;AAACY,QAAAA,QAAAA;AAAUZ,QAAAA;AAAO,KAAA,CAAA;IAErB,MAAMgC,iBAAAA,GAAoB/B,YAAiB,KAAA,QAAA,GAAWK,WAAcL,GAAAA,YAAAA;AAEpE,IAAA,qBACEgC,eAACC,CAAAA,iCAAAA,EAAAA;QACCxB,MAAQA,EAAAA,MAAAA;AACR;;;;AAIC,UACDL,KAAOL,EAAAA,MAAAA,GAASgC,iBAAAA,IAAqB,OAAQ,CAAA;;AAE5CjC,YAAAA,QAAAA;0BACDoC,cAACC,CAAAA,WAAAA,EAAAA;gBAAYC,4BAA8BvB,EAAAA;;;;AAGjD;AAEA,MAAMsB,WAAAA,GAAcE,wBAA4D;;gBAEhE,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMkC,CAAAA,MAAM,CAACC,UAAU,CAAC;;;;AAIvD,EAAA,EAAE,CAAC,EAAEH,4BAA4B,EAAE,GACjCA,+BACI;;;;;;;;;;;;;;;;;;;;AAoBN,EAAA,CAAC,GACKI,SAAU;AAClB,CAAC;;;;"}
|
|
@@ -12,6 +12,14 @@ const Theme = ({ children, themes })=>{
|
|
|
12
12
|
const [systemTheme, setSystemTheme] = React.useState();
|
|
13
13
|
const { locale } = useIntl();
|
|
14
14
|
const dispatch = useDispatch();
|
|
15
|
+
const isIos = [
|
|
16
|
+
'iPad Simulator',
|
|
17
|
+
'iPhone Simulator',
|
|
18
|
+
'iPod Simulator',
|
|
19
|
+
'iPad',
|
|
20
|
+
'iPhone',
|
|
21
|
+
'iPod'
|
|
22
|
+
].includes(navigator.platform) || navigator.userAgent.includes('Mac') && 'ontouchend' in document;
|
|
15
23
|
// Listen to changes in the system theme
|
|
16
24
|
React.useEffect(()=>{
|
|
17
25
|
const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');
|
|
@@ -41,7 +49,9 @@ const Theme = ({ children, themes })=>{
|
|
|
41
49
|
*/ theme: themes?.[computedThemeName || 'light'],
|
|
42
50
|
children: [
|
|
43
51
|
children,
|
|
44
|
-
/*#__PURE__*/ jsx(GlobalStyle, {
|
|
52
|
+
/*#__PURE__*/ jsx(GlobalStyle, {
|
|
53
|
+
$shouldOverrideInputFontSize: isIos
|
|
54
|
+
})
|
|
45
55
|
]
|
|
46
56
|
});
|
|
47
57
|
};
|
|
@@ -49,6 +59,29 @@ const GlobalStyle = createGlobalStyle`
|
|
|
49
59
|
body {
|
|
50
60
|
background: ${({ theme })=>theme.colors.neutral100};
|
|
51
61
|
}
|
|
62
|
+
|
|
63
|
+
// Temporary fix override to fix iOS zoom due to the 14px input font size
|
|
64
|
+
${({ $shouldOverrideInputFontSize })=>$shouldOverrideInputFontSize ? `
|
|
65
|
+
input[type="color"],
|
|
66
|
+
input[type="date"],
|
|
67
|
+
input[type="datetime"],
|
|
68
|
+
input[type="datetime-local"],
|
|
69
|
+
input[type="email"],
|
|
70
|
+
input[type="month"],
|
|
71
|
+
input[type="number"],
|
|
72
|
+
input[type="password"],
|
|
73
|
+
input[type="search"],
|
|
74
|
+
input[type="tel"],
|
|
75
|
+
input[type="text"],
|
|
76
|
+
input[type="time"],
|
|
77
|
+
input[type="url"],
|
|
78
|
+
input[type="week"],
|
|
79
|
+
select:focus,
|
|
80
|
+
textarea {
|
|
81
|
+
font-size: 16px !important;
|
|
82
|
+
line-height: 2.4rem !important;
|
|
83
|
+
}
|
|
84
|
+
` : undefined}
|
|
52
85
|
`;
|
|
53
86
|
|
|
54
87
|
export { Theme };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Theme.mjs","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle
|
|
1
|
+
{"version":3,"file":"Theme.mjs","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n const isIos =\n ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform\n ) ||\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document);\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle $shouldOverrideInputFontSize={isIos} />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle<{ $shouldOverrideInputFontSize: boolean }>`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n // Temporary fix override to fix iOS zoom due to the 14px input font size\n ${({ $shouldOverrideInputFontSize }) =>\n $shouldOverrideInputFontSize\n ? `\n input[type=\"color\"],\n input[type=\"date\"],\n input[type=\"datetime\"],\n input[type=\"datetime-local\"],\n input[type=\"email\"],\n input[type=\"month\"],\n input[type=\"number\"],\n input[type=\"password\"],\n input[type=\"search\"],\n input[type=\"tel\"],\n input[type=\"text\"],\n input[type=\"time\"],\n input[type=\"url\"],\n input[type=\"week\"],\n select:focus,\n textarea {\n font-size: 16px !important;\n line-height: 2.4rem !important;\n }\n `\n : undefined}\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n"],"names":["Theme","children","themes","currentTheme","useTypedSelector","state","admin_app","theme","systemTheme","setSystemTheme","React","useState","locale","useIntl","dispatch","useDispatch","isIos","includes","navigator","platform","userAgent","document","useEffect","themeWatcher","window","matchMedia","matches","listener","event","addEventListener","removeEventListener","setAvailableThemes","Object","keys","computedThemeName","_jsxs","DesignSystemProvider","_jsx","GlobalStyle","$shouldOverrideInputFontSize","createGlobalStyle","colors","neutral100","undefined"],"mappings":";;;;;;;;;AAkBA,MAAMA,QAAQ,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAc,GAAA;IAC7C,MAAM,EAAEC,YAAY,EAAE,GAAGC,gBAAAA,CAAiB,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,CAACC,KAAK,CAAA;AAC1E,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAe,CAAA,GAAGC,MAAMC,QAAQ,EAAA;IACpD,MAAM,EAAEC,MAAM,EAAE,GAAGC,OAAAA,EAAAA;AACnB,IAAA,MAAMC,QAAWC,GAAAA,WAAAA,EAAAA;AACjB,IAAA,MAAMC,KACJ,GAAA;AAAC,QAAA,gBAAA;AAAkB,QAAA,kBAAA;AAAoB,QAAA,gBAAA;AAAkB,QAAA,MAAA;AAAQ,QAAA,QAAA;AAAU,QAAA;KAAO,CAACC,QAAQ,CACzFC,SAAAA,CAAUC,QAAQ,CAAA,IAEnBD,SAAUE,CAAAA,SAAS,CAACH,QAAQ,CAAC,KAAA,CAAA,IAAU,YAAgBI,IAAAA,QAAAA;;AAG1DX,IAAAA,KAAAA,CAAMY,SAAS,CAAC,IAAA;QACd,MAAMC,YAAAA,GAAeC,MAAOC,CAAAA,UAAU,CAAC,8BAAA,CAAA;QACvChB,cAAec,CAAAA,YAAAA,CAAaG,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAE/C,QAAA,MAAMC,WAAW,CAACC,KAAAA,GAAAA;YAChBnB,cAAemB,CAAAA,KAAAA,CAAMF,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAC1C,SAAA;QACAH,YAAaM,CAAAA,gBAAgB,CAAC,QAAUF,EAAAA,QAAAA,CAAAA;;QAGxC,OAAO,IAAA;YACLJ,YAAaO,CAAAA,mBAAmB,CAAC,QAAUH,EAAAA,QAAAA,CAAAA;AAC7C,SAAA;AACF,KAAA,EAAG,EAAE,CAAA;AAELjB,IAAAA,KAAAA,CAAMY,SAAS,CAAC,IAAA;QACdR,QAASiB,CAAAA,kBAAAA,CAAmBC,MAAOC,CAAAA,IAAI,CAAC/B,MAAAA,CAAAA,CAAAA,CAAAA;KACvC,EAAA;AAACY,QAAAA,QAAAA;AAAUZ,QAAAA;AAAO,KAAA,CAAA;IAErB,MAAMgC,iBAAAA,GAAoB/B,YAAiB,KAAA,QAAA,GAAWK,WAAcL,GAAAA,YAAAA;AAEpE,IAAA,qBACEgC,IAACC,CAAAA,oBAAAA,EAAAA;QACCxB,MAAQA,EAAAA,MAAAA;AACR;;;;AAIC,UACDL,KAAOL,EAAAA,MAAAA,GAASgC,iBAAAA,IAAqB,OAAQ,CAAA;;AAE5CjC,YAAAA,QAAAA;0BACDoC,GAACC,CAAAA,WAAAA,EAAAA;gBAAYC,4BAA8BvB,EAAAA;;;;AAGjD;AAEA,MAAMsB,WAAAA,GAAcE,iBAA4D;;gBAEhE,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMkC,CAAAA,MAAM,CAACC,UAAU,CAAC;;;;AAIvD,EAAA,EAAE,CAAC,EAAEH,4BAA4B,EAAE,GACjCA,+BACI;;;;;;;;;;;;;;;;;;;;AAoBN,EAAA,CAAC,GACKI,SAAU;AAClB,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Login.js","sources":["../../../../../../../admin/src/pages/Auth/components/Login.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport camelCase from 'lodash/camelCase';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation, useNavigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport {\n UnauthenticatedLayout,\n Column,\n LayoutContent,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nimport type { Login } from '../../../../../shared/contracts/authentication';\n\ninterface LoginProps {\n children?: React.ReactNode;\n}\n\nconst LOGIN_SCHEMA = yup.object().shape({\n email: yup\n .string()\n .nullable()\n .email({\n id: translatedErrors.email.id,\n defaultMessage: 'Not a valid email',\n })\n .required(translatedErrors.required),\n password: yup.string().required(translatedErrors.required).nullable(),\n rememberMe: yup.bool().nullable(),\n});\n\nconst Login = ({ children }: LoginProps) => {\n const [apiError, setApiError] = React.useState<string>();\n const { formatMessage } = useIntl();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const navigate = useNavigate();\n\n const { login } = useAuth('Login', (auth) => auth);\n\n const handleLogin = async (body: Parameters<typeof login>[0]) => {\n setApiError(undefined);\n\n const res = await login(body);\n\n if ('error' in res) {\n const message = res.error.message ?? 'Something went wrong';\n\n if (camelCase(message).toLowerCase() === 'usernotactive') {\n navigate('/auth/oops');\n return;\n }\n\n setApiError(message);\n } else {\n const redirectTo = query.get('redirectTo');\n const redirectUrl = redirectTo ? decodeURIComponent(redirectTo) : '/';\n\n navigate(redirectUrl);\n }\n };\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={1}>\n <Typography variant=\"alpha\" tag=\"h1\" textAlign=\"center\">\n {formatMessage({\n id: 'Auth.form.welcome.title',\n defaultMessage: 'Welcome!',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={7}>\n <Typography\n variant=\"epsilon\"\n textColor=\"neutral600\"\n textAlign=\"center\"\n display=\"block\"\n >\n {formatMessage({\n id: 'Auth.form.welcome.subtitle',\n defaultMessage: 'Log in to your Strapi account',\n })}\n </Typography>\n </Box>\n {apiError ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {apiError}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"PUT\"\n initialValues={{\n email: '',\n password: '',\n rememberMe: false,\n }}\n onSubmit={(values) => {\n handleLogin(values);\n }}\n validationSchema={LOGIN_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n label: formatMessage({ id: 'Auth.form.email.label', defaultMessage: 'Email' }),\n name: 'email',\n placeholder: formatMessage({\n id: 'Auth.form.email.placeholder',\n defaultMessage: 'kai@doe.com',\n }),\n required: true,\n type: 'string' as const,\n },\n {\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.rememberMe.label',\n defaultMessage: 'Remember me',\n }),\n name: 'rememberMe',\n type: 'checkbox' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({ id: 'Auth.form.button.login', defaultMessage: 'Login' })}\n </Button>\n </Flex>\n </Form>\n {children}\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link isExternal={false} tag={NavLink} to=\"/auth/forgot-password\">\n {formatMessage({\n id: 'Auth.link.forgot-password',\n defaultMessage: 'Forgot your password?',\n })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { Login };\nexport type { LoginProps };\n"],"names":["LOGIN_SCHEMA","yup","object","shape","email","string","nullable","id","translatedErrors","defaultMessage","required","password","rememberMe","bool","Login","children","apiError","setApiError","React","useState","formatMessage","useIntl","search","searchString","useLocation","query","useMemo","URLSearchParams","navigate","useNavigate","login","useAuth","auth","handleLogin","body","undefined","res","message","error","camelCase","toLowerCase","redirectTo","get","redirectUrl","decodeURIComponent","_jsx","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","variant","tag","textAlign","textColor","display","role","tabIndex","Form","method","initialValues","onSubmit","values","validationSchema","Flex","direction","alignItems","gap","label","name","placeholder","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","isExternal","NavLink","to"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Login.js","sources":["../../../../../../../admin/src/pages/Auth/components/Login.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport camelCase from 'lodash/camelCase';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation, useNavigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport {\n UnauthenticatedLayout,\n Column,\n LayoutContent,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nimport type { Login } from '../../../../../shared/contracts/authentication';\n\ninterface LoginProps {\n children?: React.ReactNode;\n}\n\nconst LOGIN_SCHEMA = yup.object().shape({\n email: yup\n .string()\n .nullable()\n .email({\n id: translatedErrors.email.id,\n defaultMessage: 'Not a valid email',\n })\n .required(translatedErrors.required),\n password: yup.string().required(translatedErrors.required).nullable(),\n rememberMe: yup.bool().nullable(),\n});\n\nconst Login = ({ children }: LoginProps) => {\n const [apiError, setApiError] = React.useState<string>();\n const { formatMessage } = useIntl();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const navigate = useNavigate();\n\n const { login } = useAuth('Login', (auth) => auth);\n\n const handleLogin = async (body: Parameters<typeof login>[0]) => {\n setApiError(undefined);\n\n const res = await login(body);\n\n if ('error' in res) {\n const message = res.error.message ?? 'Something went wrong';\n\n if (camelCase(message).toLowerCase() === 'usernotactive') {\n navigate('/auth/oops');\n return;\n }\n\n setApiError(message);\n } else {\n const redirectTo = query.get('redirectTo');\n const redirectUrl = redirectTo ? decodeURIComponent(redirectTo) : '/';\n\n navigate(redirectUrl);\n }\n };\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={1}>\n <Typography variant=\"alpha\" tag=\"h1\" textAlign=\"center\">\n {formatMessage({\n id: 'Auth.form.welcome.title',\n defaultMessage: 'Welcome!',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={7}>\n <Typography\n variant=\"epsilon\"\n textColor=\"neutral600\"\n textAlign=\"center\"\n display=\"block\"\n >\n {formatMessage({\n id: 'Auth.form.welcome.subtitle',\n defaultMessage: 'Log in to your Strapi account',\n })}\n </Typography>\n </Box>\n {apiError ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {apiError}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"PUT\"\n initialValues={{\n email: '',\n password: '',\n rememberMe: false,\n }}\n onSubmit={(values) => {\n handleLogin(values);\n }}\n validationSchema={LOGIN_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n label: formatMessage({ id: 'Auth.form.email.label', defaultMessage: 'Email' }),\n name: 'email',\n placeholder: formatMessage({\n id: 'Auth.form.email.placeholder',\n defaultMessage: 'kai@doe.com',\n }),\n required: true,\n type: 'email' as const,\n },\n {\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.rememberMe.label',\n defaultMessage: 'Remember me',\n }),\n name: 'rememberMe',\n type: 'checkbox' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({ id: 'Auth.form.button.login', defaultMessage: 'Login' })}\n </Button>\n </Flex>\n </Form>\n {children}\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link isExternal={false} tag={NavLink} to=\"/auth/forgot-password\">\n {formatMessage({\n id: 'Auth.link.forgot-password',\n defaultMessage: 'Forgot your password?',\n })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { Login };\nexport type { LoginProps };\n"],"names":["LOGIN_SCHEMA","yup","object","shape","email","string","nullable","id","translatedErrors","defaultMessage","required","password","rememberMe","bool","Login","children","apiError","setApiError","React","useState","formatMessage","useIntl","search","searchString","useLocation","query","useMemo","URLSearchParams","navigate","useNavigate","login","useAuth","auth","handleLogin","body","undefined","res","message","error","camelCase","toLowerCase","redirectTo","get","redirectUrl","decodeURIComponent","_jsx","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","variant","tag","textAlign","textColor","display","role","tabIndex","Form","method","initialValues","onSubmit","values","validationSchema","Flex","direction","alignItems","gap","label","name","placeholder","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","isExternal","NavLink","to"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Login.mjs","sources":["../../../../../../../admin/src/pages/Auth/components/Login.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport camelCase from 'lodash/camelCase';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation, useNavigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport {\n UnauthenticatedLayout,\n Column,\n LayoutContent,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nimport type { Login } from '../../../../../shared/contracts/authentication';\n\ninterface LoginProps {\n children?: React.ReactNode;\n}\n\nconst LOGIN_SCHEMA = yup.object().shape({\n email: yup\n .string()\n .nullable()\n .email({\n id: translatedErrors.email.id,\n defaultMessage: 'Not a valid email',\n })\n .required(translatedErrors.required),\n password: yup.string().required(translatedErrors.required).nullable(),\n rememberMe: yup.bool().nullable(),\n});\n\nconst Login = ({ children }: LoginProps) => {\n const [apiError, setApiError] = React.useState<string>();\n const { formatMessage } = useIntl();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const navigate = useNavigate();\n\n const { login } = useAuth('Login', (auth) => auth);\n\n const handleLogin = async (body: Parameters<typeof login>[0]) => {\n setApiError(undefined);\n\n const res = await login(body);\n\n if ('error' in res) {\n const message = res.error.message ?? 'Something went wrong';\n\n if (camelCase(message).toLowerCase() === 'usernotactive') {\n navigate('/auth/oops');\n return;\n }\n\n setApiError(message);\n } else {\n const redirectTo = query.get('redirectTo');\n const redirectUrl = redirectTo ? decodeURIComponent(redirectTo) : '/';\n\n navigate(redirectUrl);\n }\n };\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={1}>\n <Typography variant=\"alpha\" tag=\"h1\" textAlign=\"center\">\n {formatMessage({\n id: 'Auth.form.welcome.title',\n defaultMessage: 'Welcome!',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={7}>\n <Typography\n variant=\"epsilon\"\n textColor=\"neutral600\"\n textAlign=\"center\"\n display=\"block\"\n >\n {formatMessage({\n id: 'Auth.form.welcome.subtitle',\n defaultMessage: 'Log in to your Strapi account',\n })}\n </Typography>\n </Box>\n {apiError ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {apiError}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"PUT\"\n initialValues={{\n email: '',\n password: '',\n rememberMe: false,\n }}\n onSubmit={(values) => {\n handleLogin(values);\n }}\n validationSchema={LOGIN_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n label: formatMessage({ id: 'Auth.form.email.label', defaultMessage: 'Email' }),\n name: 'email',\n placeholder: formatMessage({\n id: 'Auth.form.email.placeholder',\n defaultMessage: 'kai@doe.com',\n }),\n required: true,\n type: 'string' as const,\n },\n {\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.rememberMe.label',\n defaultMessage: 'Remember me',\n }),\n name: 'rememberMe',\n type: 'checkbox' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({ id: 'Auth.form.button.login', defaultMessage: 'Login' })}\n </Button>\n </Flex>\n </Form>\n {children}\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link isExternal={false} tag={NavLink} to=\"/auth/forgot-password\">\n {formatMessage({\n id: 'Auth.link.forgot-password',\n defaultMessage: 'Forgot your password?',\n })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { Login };\nexport type { LoginProps };\n"],"names":["LOGIN_SCHEMA","yup","object","shape","email","string","nullable","id","translatedErrors","defaultMessage","required","password","rememberMe","bool","Login","children","apiError","setApiError","React","useState","formatMessage","useIntl","search","searchString","useLocation","query","useMemo","URLSearchParams","navigate","useNavigate","login","useAuth","auth","handleLogin","body","undefined","res","message","error","camelCase","toLowerCase","redirectTo","get","redirectUrl","decodeURIComponent","_jsx","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","variant","tag","textAlign","textColor","display","role","tabIndex","Form","method","initialValues","onSubmit","values","validationSchema","Flex","direction","alignItems","gap","label","name","placeholder","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","isExternal","NavLink","to"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Login.mjs","sources":["../../../../../../../admin/src/pages/Auth/components/Login.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport camelCase from 'lodash/camelCase';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation, useNavigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport {\n UnauthenticatedLayout,\n Column,\n LayoutContent,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nimport type { Login } from '../../../../../shared/contracts/authentication';\n\ninterface LoginProps {\n children?: React.ReactNode;\n}\n\nconst LOGIN_SCHEMA = yup.object().shape({\n email: yup\n .string()\n .nullable()\n .email({\n id: translatedErrors.email.id,\n defaultMessage: 'Not a valid email',\n })\n .required(translatedErrors.required),\n password: yup.string().required(translatedErrors.required).nullable(),\n rememberMe: yup.bool().nullable(),\n});\n\nconst Login = ({ children }: LoginProps) => {\n const [apiError, setApiError] = React.useState<string>();\n const { formatMessage } = useIntl();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const navigate = useNavigate();\n\n const { login } = useAuth('Login', (auth) => auth);\n\n const handleLogin = async (body: Parameters<typeof login>[0]) => {\n setApiError(undefined);\n\n const res = await login(body);\n\n if ('error' in res) {\n const message = res.error.message ?? 'Something went wrong';\n\n if (camelCase(message).toLowerCase() === 'usernotactive') {\n navigate('/auth/oops');\n return;\n }\n\n setApiError(message);\n } else {\n const redirectTo = query.get('redirectTo');\n const redirectUrl = redirectTo ? decodeURIComponent(redirectTo) : '/';\n\n navigate(redirectUrl);\n }\n };\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={1}>\n <Typography variant=\"alpha\" tag=\"h1\" textAlign=\"center\">\n {formatMessage({\n id: 'Auth.form.welcome.title',\n defaultMessage: 'Welcome!',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={7}>\n <Typography\n variant=\"epsilon\"\n textColor=\"neutral600\"\n textAlign=\"center\"\n display=\"block\"\n >\n {formatMessage({\n id: 'Auth.form.welcome.subtitle',\n defaultMessage: 'Log in to your Strapi account',\n })}\n </Typography>\n </Box>\n {apiError ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {apiError}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"PUT\"\n initialValues={{\n email: '',\n password: '',\n rememberMe: false,\n }}\n onSubmit={(values) => {\n handleLogin(values);\n }}\n validationSchema={LOGIN_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n label: formatMessage({ id: 'Auth.form.email.label', defaultMessage: 'Email' }),\n name: 'email',\n placeholder: formatMessage({\n id: 'Auth.form.email.placeholder',\n defaultMessage: 'kai@doe.com',\n }),\n required: true,\n type: 'email' as const,\n },\n {\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.rememberMe.label',\n defaultMessage: 'Remember me',\n }),\n name: 'rememberMe',\n type: 'checkbox' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({ id: 'Auth.form.button.login', defaultMessage: 'Login' })}\n </Button>\n </Flex>\n </Form>\n {children}\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link isExternal={false} tag={NavLink} to=\"/auth/forgot-password\">\n {formatMessage({\n id: 'Auth.link.forgot-password',\n defaultMessage: 'Forgot your password?',\n })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { Login };\nexport type { LoginProps };\n"],"names":["LOGIN_SCHEMA","yup","object","shape","email","string","nullable","id","translatedErrors","defaultMessage","required","password","rememberMe","bool","Login","children","apiError","setApiError","React","useState","formatMessage","useIntl","search","searchString","useLocation","query","useMemo","URLSearchParams","navigate","useNavigate","login","useAuth","auth","handleLogin","body","undefined","res","message","error","camelCase","toLowerCase","redirectTo","get","redirectUrl","decodeURIComponent","_jsx","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","variant","tag","textAlign","textColor","display","role","tabIndex","Form","method","initialValues","onSubmit","values","validationSchema","Flex","direction","alignItems","gap","label","name","placeholder","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","isExternal","NavLink","to"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.js","sources":["../../../../../../admin/src/pages/Home/HomePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, Main } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { DragLayer, isWidgetDragItem } from '../../components/DragLayer';\nimport { GapDropZoneManager } from '../../components/GapDropZone';\nimport { GuidedTourHomepageOverview } from '../../components/GuidedTour/Overview';\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { WidgetResizeHandle } from '../../components/ResizeIndicator';\nimport { Widget } from '../../components/WidgetHelpers';\nimport { WidgetRoot } from '../../components/WidgetRoot';\nimport { useEnterprise } from '../../ee';\nimport { useAuth } from '../../features/Auth';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useWidgets } from '../../features/Widgets';\nimport { useGetHomepageLayoutQuery } from '../../services/homepage';\nimport { getWidgetElement, WIDGET_DATA_ATTRIBUTES } from '../../utils/widgetLayout';\nimport {\n applyHomepageLayout,\n createDefaultWidgetWidths,\n isLastWidgetInRow,\n canResizeBetweenWidgets,\n getWidgetWidth,\n} from '../../utils/widgetLayout';\n\nimport { AddWidgetModal } from './components/AddWidgetModal';\nimport { FreeTrialEndedModal } from './components/FreeTrialEndedModal';\nimport { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal';\n\nimport type { WidgetWithUID } from '../../core/apis/Widgets';\n\n// Styled wrapper for the drag preview\nconst DragPreviewWrapper = styled.div<{ $maxWidth: string }>`\n max-width: ${(props) => props.$maxWidth};\n overflow: hidden;\n opacity: 0.9;\n border: 2px solid ${({ theme }) => theme.colors.primary500};\n border-radius: ${({ theme }) => theme.borderRadius};\n pointer-events: none;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * UnstableHomePageCe\n * -----------------------------------------------------------------------------------------------*/\n\nexport const WidgetComponent = ({\n component,\n columnWidth,\n}: {\n component: () => Promise<React.ComponentType>;\n columnWidth: number;\n}) => {\n const [loadedComponent, setLoadedComponent] = React.useState<React.ComponentType<{\n columnWidth?: number;\n }> | null>(null);\n\n React.useEffect(() => {\n const loadComponent = async () => {\n const resolvedComponent = await component();\n\n setLoadedComponent(() => resolvedComponent);\n };\n\n loadComponent();\n }, [component]);\n\n const Component = loadedComponent;\n\n if (!Component) {\n return <Widget.Loading />;\n }\n\n return <Component {...({ columnWidth } as Record<string, unknown>)} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePageCE\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePageCE = () => {\n const { formatMessage } = useIntl();\n const user = useAuth('HomePageCE', (state) => state.user);\n const displayName = user?.firstname ?? user?.username ?? user?.email;\n const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state) => state.widgets.getAll);\n const checkUserHasPermissions = useAuth('WidgetRoot', (state) => state.checkUserHasPermissions);\n const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();\n const [filteredWidgets, setFilteredWidgets] = React.useState<WidgetWithUID[]>([]);\n const [allAvailableWidgets, setAllAvailableWidgets] = React.useState<WidgetWithUID[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [isAddWidgetModalOpen, setIsAddWidgetModalOpen] = React.useState(false);\n\n // Use custom hook for widget management\n const {\n findWidget,\n deleteWidget,\n addWidget,\n moveWidget,\n columnWidths,\n setColumnWidths,\n handleWidgetResize,\n saveLayout,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n } = useWidgets({\n filteredWidgets,\n setFilteredWidgets,\n });\n\n React.useEffect(() => {\n const checkWidgetsPermissions = async () => {\n const allWidgets = getAllWidgets();\n const authorizedWidgets = await Promise.all(\n allWidgets.map(async (widget) => {\n if (!widget.permissions || widget.permissions.length === 0) return true;\n const matchingPermissions = await checkUserHasPermissions(widget.permissions);\n return matchingPermissions.length >= widget.permissions.length;\n })\n );\n const authorizedWidgetsList = allWidgets.filter((_, i) => authorizedWidgets[i]);\n\n setAllAvailableWidgets(authorizedWidgetsList);\n setLoading(false);\n };\n\n checkWidgetsPermissions();\n }, [checkUserHasPermissions, getAllWidgets]);\n\n React.useEffect(() => {\n if (allAvailableWidgets.length === 0) return;\n\n // If user has customized the homepage layout, apply it\n if (homepageLayout && homepageLayout.widgets) {\n const { filteredWidgets, widths: homepageWidths } = applyHomepageLayout(\n allAvailableWidgets,\n homepageLayout\n );\n\n setFilteredWidgets(filteredWidgets);\n setColumnWidths(homepageWidths);\n } else {\n // Set default layout when no custom layout exists\n setFilteredWidgets(allAvailableWidgets);\n setColumnWidths(createDefaultWidgetWidths(allAvailableWidgets));\n }\n }, [homepageLayout, allAvailableWidgets, setColumnWidths]);\n\n const widgetLayout = React.useMemo(() => {\n return filteredWidgets.map((widget, index) => {\n const rightWidgetId = filteredWidgets[index + 1]?.uid;\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n const rightWidgetWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n return {\n widget,\n index,\n isLastInRow: isLastWidgetInRow(index, filteredWidgets, columnWidths),\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize:\n rightWidgetId &&\n canResizeBetweenWidgets(widget.uid, rightWidgetId, columnWidths, filteredWidgets),\n };\n });\n }, [filteredWidgets, columnWidths]);\n\n return (\n <Layouts.Root>\n <Main>\n <Page.Title>\n {formatMessage({ id: 'HomePage.head.title', defaultMessage: 'Homepage' })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage(\n { id: 'HomePage.header.title', defaultMessage: 'Hello {name}' },\n { name: displayName }\n )}\n subtitle={formatMessage({\n id: 'HomePage.header.subtitle',\n defaultMessage: 'Welcome to your administration panel',\n })}\n primaryAction={\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={() => setIsAddWidgetModalOpen(true)}\n >\n {formatMessage({\n id: 'HomePage.addWidget.button',\n defaultMessage: 'Add Widget',\n })}\n </Button>\n }\n />\n <FreeTrialWelcomeModal />\n <FreeTrialEndedModal />\n <AddWidgetModal\n isOpen={isAddWidgetModalOpen}\n onClose={() => setIsAddWidgetModalOpen(false)}\n onAddWidget={addWidget}\n currentWidgets={filteredWidgets}\n availableWidgets={allAvailableWidgets}\n />\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={8} paddingBottom={10}>\n <GuidedTourHomepageOverview />\n {loading ? (\n <Box position=\"absolute\" top={0} left={0} right={0} bottom={0}>\n <Page.Loading />\n </Box>\n ) : (\n <Box position=\"relative\" {...{ [WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER]: true }}>\n <Grid.Root gap={5}>\n {widgetLayout.map(\n ({\n widget,\n isLastInRow,\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize,\n }) => (\n <React.Fragment key={widget.uid}>\n <Grid.Item col={widgetWidth} s={12}>\n <WidgetRoot\n uid={widget.uid}\n title={widget.title}\n icon={widget.icon}\n link={widget.link}\n findWidget={findWidget}\n deleteWidget={deleteWidget}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n component={widget.component}\n >\n <WidgetComponent\n component={widget.component}\n columnWidth={widgetWidth}\n />\n </WidgetRoot>\n </Grid.Item>\n\n {!isLastInRow && canResize && rightWidgetId && (\n <WidgetResizeHandle\n key={`resize-${widget.uid}`}\n leftWidgetId={widget.uid}\n rightWidgetId={rightWidgetId}\n leftWidgetWidth={widgetWidth}\n rightWidgetWidth={rightWidgetWidth}\n onResize={handleWidgetResize}\n saveLayout={saveLayout}\n filteredWidgets={filteredWidgets}\n />\n )}\n </React.Fragment>\n )\n )}\n </Grid.Root>\n\n {isDraggingWidget && (\n <GapDropZoneManager\n filteredWidgets={filteredWidgets}\n columnWidths={columnWidths}\n draggedWidgetId={draggedWidgetId}\n moveWidget={moveWidget}\n />\n )}\n </Box>\n )}\n </Flex>\n </Layouts.Content>\n\n {/* Add the DragLayer to handle custom drag previews */}\n <DragLayer\n renderItem={({ type, item }) => {\n if (!isWidgetDragItem(item)) {\n return null;\n }\n\n const widgetElement = getWidgetElement(item.id);\n const maxWidth = `${widgetElement?.clientWidth}px`;\n\n return (\n <DragPreviewWrapper $maxWidth={maxWidth}>\n <WidgetRoot\n uid={item.id as WidgetWithUID['uid']}\n title={item.title || { id: `${item.id}`, defaultMessage: item.id }}\n icon={item.icon}\n link={item.link}\n >\n <WidgetComponent component={item.component} columnWidth={4} />\n </WidgetRoot>\n </DragPreviewWrapper>\n );\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePage = () => {\n const Page = useEnterprise(\n HomePageCE,\n // eslint-disable-next-line import/no-cycle\n async () => (await import('../../../../ee/admin/src/pages/HomePage')).HomePageEE\n );\n\n // block rendering until the EE component is fully loaded\n if (!Page) {\n return null;\n }\n\n return <Page />;\n};\n\nexport { HomePage, HomePageCE };\n"],"names":["DragPreviewWrapper","styled","div","props","$maxWidth","theme","colors","primary500","borderRadius","WidgetComponent","component","columnWidth","loadedComponent","setLoadedComponent","React","useState","useEffect","loadComponent","resolvedComponent","Component","_jsx","Widget","Loading","HomePageCE","formatMessage","useIntl","user","useAuth","state","displayName","firstname","username","email","getAllWidgets","useStrapiApp","widgets","getAll","checkUserHasPermissions","data","homepageLayout","isLoading","_isLoadingLayout","useGetHomepageLayoutQuery","filteredWidgets","setFilteredWidgets","allAvailableWidgets","setAllAvailableWidgets","loading","setLoading","isAddWidgetModalOpen","setIsAddWidgetModalOpen","findWidget","deleteWidget","addWidget","moveWidget","columnWidths","setColumnWidths","handleWidgetResize","saveLayout","isDraggingWidget","draggedWidgetId","handleDragStart","handleDragEnd","useWidgets","checkWidgetsPermissions","allWidgets","authorizedWidgets","Promise","all","map","widget","permissions","length","matchingPermissions","authorizedWidgetsList","filter","_","i","widths","homepageWidths","applyHomepageLayout","createDefaultWidgetWidths","widgetLayout","useMemo","index","rightWidgetId","uid","widgetWidth","getWidgetWidth","rightWidgetWidth","isLastInRow","isLastWidgetInRow","canResize","canResizeBetweenWidgets","Layouts","Root","_jsxs","Main","Page","Title","id","defaultMessage","Header","title","name","subtitle","primaryAction","Button","variant","size","startIcon","Plus","onClick","FreeTrialWelcomeModal","FreeTrialEndedModal","AddWidgetModal","isOpen","onClose","onAddWidget","currentWidgets","availableWidgets","Content","Flex","direction","alignItems","gap","paddingBottom","GuidedTourHomepageOverview","Box","position","top","left","right","bottom","WIDGET_DATA_ATTRIBUTES","GRID_CONTAINER","Grid","Fragment","Item","col","s","WidgetRoot","icon","link","onDragStart","onDragEnd","WidgetResizeHandle","leftWidgetId","leftWidgetWidth","onResize","GapDropZoneManager","DragLayer","renderItem","type","item","isWidgetDragItem","widgetElement","getWidgetElement","maxWidth","clientWidth","HomePage","useEnterprise","HomePageEE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomePage.js","sources":["../../../../../../admin/src/pages/Home/HomePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, Main } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { DragLayer, isWidgetDragItem } from '../../components/DragLayer';\nimport { GapDropZoneManager } from '../../components/GapDropZone';\nimport { GuidedTourHomepageOverview } from '../../components/GuidedTour/Overview';\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { WidgetResizeHandle } from '../../components/ResizeIndicator';\nimport { Widget } from '../../components/WidgetHelpers';\nimport { WidgetRoot } from '../../components/WidgetRoot';\nimport { useEnterprise } from '../../ee';\nimport { useAuth } from '../../features/Auth';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useWidgets } from '../../features/Widgets';\nimport { useGetHomepageLayoutQuery } from '../../services/homepage';\nimport {\n getWidgetElement,\n WIDGET_DATA_ATTRIBUTES,\n applyHomepageLayout,\n createDefaultWidgetWidths,\n isLastWidgetInRow,\n canResizeBetweenWidgets,\n getWidgetWidth,\n} from '../../utils/widgetLayout';\n\nimport { AddWidgetModal } from './components/AddWidgetModal';\nimport { FreeTrialEndedModal } from './components/FreeTrialEndedModal';\nimport { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal';\n\nimport type { WidgetWithUID } from '../../core/apis/Widgets';\n\n// Styled wrapper for the drag preview\nconst DragPreviewWrapper = styled.div<{ $maxWidth: string }>`\n max-width: ${(props) => props.$maxWidth};\n overflow: hidden;\n opacity: 0.9;\n border: 2px solid ${({ theme }) => theme.colors.primary500};\n border-radius: ${({ theme }) => theme.borderRadius};\n pointer-events: none;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * UnstableHomePageCe\n * -----------------------------------------------------------------------------------------------*/\n\nexport const WidgetComponent = ({\n component,\n columnWidth,\n}: {\n component: () => Promise<React.ComponentType>;\n columnWidth: number;\n}) => {\n const [loadedComponent, setLoadedComponent] = React.useState<React.ComponentType<{\n columnWidth?: number;\n }> | null>(null);\n\n React.useEffect(() => {\n const loadComponent = async () => {\n const resolvedComponent = await component();\n\n setLoadedComponent(() => resolvedComponent);\n };\n\n loadComponent();\n }, [component]);\n\n const Component = loadedComponent;\n\n if (!Component) {\n return <Widget.Loading />;\n }\n\n return <Component {...({ columnWidth } as Record<string, unknown>)} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePageCE\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePageCE = () => {\n const { formatMessage } = useIntl();\n const user = useAuth('HomePageCE', (state) => state.user);\n const displayName = user?.firstname ?? user?.username ?? user?.email;\n const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state) => state.widgets.getAll);\n const checkUserHasPermissions = useAuth('WidgetRoot', (state) => state.checkUserHasPermissions);\n const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();\n const [filteredWidgets, setFilteredWidgets] = React.useState<WidgetWithUID[]>([]);\n const [allAvailableWidgets, setAllAvailableWidgets] = React.useState<WidgetWithUID[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [isAddWidgetModalOpen, setIsAddWidgetModalOpen] = React.useState(false);\n\n // Use custom hook for widget management\n const {\n findWidget,\n deleteWidget,\n addWidget,\n moveWidget,\n columnWidths,\n setColumnWidths,\n handleWidgetResize,\n saveLayout,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n } = useWidgets({\n filteredWidgets,\n setFilteredWidgets,\n });\n\n React.useEffect(() => {\n const checkWidgetsPermissions = async () => {\n const allWidgets = getAllWidgets();\n const authorizedWidgets = await Promise.all(\n allWidgets.map(async (widget) => {\n if (!widget.permissions || widget.permissions.length === 0) return true;\n const matchingPermissions = await checkUserHasPermissions(widget.permissions);\n return matchingPermissions.length >= widget.permissions.length;\n })\n );\n const authorizedWidgetsList = allWidgets.filter((_, i) => authorizedWidgets[i]);\n\n setAllAvailableWidgets(authorizedWidgetsList);\n setLoading(false);\n };\n\n checkWidgetsPermissions();\n }, [checkUserHasPermissions, getAllWidgets]);\n\n React.useEffect(() => {\n if (allAvailableWidgets.length === 0) return;\n\n // If user has customized the homepage layout, apply it\n if (homepageLayout && homepageLayout.widgets) {\n const { filteredWidgets, widths: homepageWidths } = applyHomepageLayout(\n allAvailableWidgets,\n homepageLayout\n );\n\n setFilteredWidgets(filteredWidgets);\n setColumnWidths(homepageWidths);\n } else {\n // Set default layout when no custom layout exists\n setFilteredWidgets(allAvailableWidgets);\n setColumnWidths(createDefaultWidgetWidths(allAvailableWidgets));\n }\n }, [homepageLayout, allAvailableWidgets, setColumnWidths]);\n\n const widgetLayout = React.useMemo(() => {\n return filteredWidgets.map((widget, index) => {\n const rightWidgetId = filteredWidgets[index + 1]?.uid;\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n const rightWidgetWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n return {\n widget,\n index,\n isLastInRow: isLastWidgetInRow(index, filteredWidgets, columnWidths),\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize:\n rightWidgetId &&\n canResizeBetweenWidgets(widget.uid, rightWidgetId, columnWidths, filteredWidgets),\n };\n });\n }, [filteredWidgets, columnWidths]);\n\n return (\n <Layouts.Root>\n <Main>\n <Page.Title>\n {formatMessage({ id: 'HomePage.head.title', defaultMessage: 'Homepage' })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage(\n { id: 'HomePage.header.title', defaultMessage: 'Hello {name}' },\n { name: displayName }\n )}\n subtitle={formatMessage({\n id: 'HomePage.header.subtitle',\n defaultMessage: 'Welcome to your administration panel',\n })}\n primaryAction={\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={() => setIsAddWidgetModalOpen(true)}\n >\n {formatMessage({\n id: 'HomePage.addWidget.button',\n defaultMessage: 'Add Widget',\n })}\n </Button>\n }\n />\n <FreeTrialWelcomeModal />\n <FreeTrialEndedModal />\n <AddWidgetModal\n isOpen={isAddWidgetModalOpen}\n onClose={() => setIsAddWidgetModalOpen(false)}\n onAddWidget={addWidget}\n currentWidgets={filteredWidgets}\n availableWidgets={allAvailableWidgets}\n />\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={8} paddingBottom={10}>\n <GuidedTourHomepageOverview />\n {loading ? (\n <Box position=\"absolute\" top={0} left={0} right={0} bottom={0}>\n <Page.Loading />\n </Box>\n ) : (\n <Box position=\"relative\" {...{ [WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER]: true }}>\n <Grid.Root gap={5}>\n {widgetLayout.map(\n ({\n widget,\n isLastInRow,\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize,\n }) => (\n <React.Fragment key={widget.uid}>\n <Grid.Item col={widgetWidth} s={12}>\n <WidgetRoot\n uid={widget.uid}\n title={widget.title}\n icon={widget.icon}\n link={widget.link}\n findWidget={findWidget}\n deleteWidget={deleteWidget}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n component={widget.component}\n >\n <WidgetComponent\n component={widget.component}\n columnWidth={widgetWidth}\n />\n </WidgetRoot>\n </Grid.Item>\n\n {!isLastInRow && canResize && rightWidgetId && (\n <WidgetResizeHandle\n key={`resize-${widget.uid}`}\n leftWidgetId={widget.uid}\n rightWidgetId={rightWidgetId}\n leftWidgetWidth={widgetWidth}\n rightWidgetWidth={rightWidgetWidth}\n onResize={handleWidgetResize}\n saveLayout={saveLayout}\n filteredWidgets={filteredWidgets}\n />\n )}\n </React.Fragment>\n )\n )}\n </Grid.Root>\n\n {isDraggingWidget && (\n <GapDropZoneManager\n filteredWidgets={filteredWidgets}\n columnWidths={columnWidths}\n draggedWidgetId={draggedWidgetId}\n moveWidget={moveWidget}\n />\n )}\n </Box>\n )}\n </Flex>\n </Layouts.Content>\n\n {/* Add the DragLayer to handle custom drag previews */}\n <DragLayer\n renderItem={({ type, item }) => {\n if (!isWidgetDragItem(item)) {\n return null;\n }\n\n const widgetElement = getWidgetElement(item.id);\n const maxWidth = `${widgetElement?.clientWidth}px`;\n\n return (\n <DragPreviewWrapper $maxWidth={maxWidth}>\n <WidgetRoot\n uid={item.id as WidgetWithUID['uid']}\n title={item.title || { id: `${item.id}`, defaultMessage: item.id }}\n icon={item.icon}\n link={item.link}\n >\n <WidgetComponent component={item.component} columnWidth={4} />\n </WidgetRoot>\n </DragPreviewWrapper>\n );\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePage = () => {\n const Page = useEnterprise(\n HomePageCE,\n // eslint-disable-next-line import/no-cycle\n async () => (await import('../../../../ee/admin/src/pages/HomePage')).HomePageEE\n );\n\n // block rendering until the EE component is fully loaded\n if (!Page) {\n return null;\n }\n\n return <Page />;\n};\n\nexport { HomePage, HomePageCE };\n"],"names":["DragPreviewWrapper","styled","div","props","$maxWidth","theme","colors","primary500","borderRadius","WidgetComponent","component","columnWidth","loadedComponent","setLoadedComponent","React","useState","useEffect","loadComponent","resolvedComponent","Component","_jsx","Widget","Loading","HomePageCE","formatMessage","useIntl","user","useAuth","state","displayName","firstname","username","email","getAllWidgets","useStrapiApp","widgets","getAll","checkUserHasPermissions","data","homepageLayout","isLoading","_isLoadingLayout","useGetHomepageLayoutQuery","filteredWidgets","setFilteredWidgets","allAvailableWidgets","setAllAvailableWidgets","loading","setLoading","isAddWidgetModalOpen","setIsAddWidgetModalOpen","findWidget","deleteWidget","addWidget","moveWidget","columnWidths","setColumnWidths","handleWidgetResize","saveLayout","isDraggingWidget","draggedWidgetId","handleDragStart","handleDragEnd","useWidgets","checkWidgetsPermissions","allWidgets","authorizedWidgets","Promise","all","map","widget","permissions","length","matchingPermissions","authorizedWidgetsList","filter","_","i","widths","homepageWidths","applyHomepageLayout","createDefaultWidgetWidths","widgetLayout","useMemo","index","rightWidgetId","uid","widgetWidth","getWidgetWidth","rightWidgetWidth","isLastInRow","isLastWidgetInRow","canResize","canResizeBetweenWidgets","Layouts","Root","_jsxs","Main","Page","Title","id","defaultMessage","Header","title","name","subtitle","primaryAction","Button","variant","size","startIcon","Plus","onClick","FreeTrialWelcomeModal","FreeTrialEndedModal","AddWidgetModal","isOpen","onClose","onAddWidget","currentWidgets","availableWidgets","Content","Flex","direction","alignItems","gap","paddingBottom","GuidedTourHomepageOverview","Box","position","top","left","right","bottom","WIDGET_DATA_ATTRIBUTES","GRID_CONTAINER","Grid","Fragment","Item","col","s","WidgetRoot","icon","link","onDragStart","onDragEnd","WidgetResizeHandle","leftWidgetId","leftWidgetWidth","onResize","GapDropZoneManager","DragLayer","renderItem","type","item","isWidgetDragItem","widgetElement","getWidgetElement","maxWidth","clientWidth","HomePage","useEnterprise","HomePageEE"],"mappings":"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"}
|