Compare commits

...

6 Commits

Author SHA1 Message Date
s0up4200
41a7b492d6 feat(ui): set data-form-type to JellyfinLogin 2025-02-28 17:50:28 +01:00
s0up4200
12b428a662 feat(ui): add data attribs for dashlane 2025-02-27 23:58:29 +01:00
s0up4200
8b54dace38 feat(ui): set data-form-type attribute
For Dashlane password manager
2025-02-27 23:40:26 +01:00
s0up4200
01c3cb8b47 fix: rebase mess 2025-02-27 23:19:26 +01:00
s0up4200
e995dc4a26 feat(ui): prevent password manager autofill on Jellyfin setup form 2025-02-27 21:11:40 +01:00
soup
96fb5c4988 feat(ui): prevent password manager interference & improve service links (#3989)
(cherry picked from commit ef18b5d1de)
2025-02-27 20:49:31 +01:00
11 changed files with 45 additions and 2 deletions

View File

@@ -26,6 +26,7 @@ const SensitiveInput = ({ as = 'input', ...props }: SensitiveInputProps) => {
<> <>
<Component <Component
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -124,7 +124,7 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
{({ errors, touched, isSubmitting, isValid }) => { {({ errors, touched, isSubmitting, isValid }) => {
return ( return (
<> <>
<Form> <Form data-form-type="login">
<div> <div>
<h2 className="mb-6 -mt-1 text-center text-lg font-bold text-neutral-200"> <h2 className="mb-6 -mt-1 text-center text-lg font-bold text-neutral-200">
{intl.formatMessage(messages.loginwithapp, { {intl.formatMessage(messages.loginwithapp, {
@@ -140,6 +140,7 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
type="text" type="text"
placeholder={intl.formatMessage(messages.username)} placeholder={intl.formatMessage(messages.username)}
className="!bg-gray-700/80 placeholder:text-gray-400" className="!bg-gray-700/80 placeholder:text-gray-400"
data-form-type="username"
/> />
</div> </div>
{errors.username && touched.username && ( {errors.username && touched.username && (
@@ -157,6 +158,10 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
autoComplete="current-password" autoComplete="current-password"
placeholder={intl.formatMessage(messages.password)} placeholder={intl.formatMessage(messages.password)}
className="!bg-gray-700/80 placeholder:text-gray-400" className="!bg-gray-700/80 placeholder:text-gray-400"
data-form-type="password"
data-1pignore="false"
data-lpignore="false"
data-bwignore="false"
/> />
</div> </div>
<div className="flex"> <div className="flex">

View File

@@ -75,7 +75,7 @@ const LocalLogin = ({ revalidate }: LocalLoginProps) => {
{({ errors, touched, isSubmitting, isValid }) => { {({ errors, touched, isSubmitting, isValid }) => {
return ( return (
<> <>
<Form> <Form data-form-type="login">
<div> <div>
<h2 className="mb-6 -mt-1 text-center text-lg font-bold text-neutral-200"> <h2 className="mb-6 -mt-1 text-center text-lg font-bold text-neutral-200">
{intl.formatMessage(messages.loginwithapp, { {intl.formatMessage(messages.loginwithapp, {
@@ -94,6 +94,7 @@ const LocalLogin = ({ revalidate }: LocalLoginProps) => {
type="text" type="text"
inputMode="email" inputMode="email"
data-testid="email" data-testid="email"
data-form-type="username,email"
className="!bg-gray-700/80 placeholder:text-gray-400" className="!bg-gray-700/80 placeholder:text-gray-400"
/> />
</div> </div>
@@ -113,6 +114,7 @@ const LocalLogin = ({ revalidate }: LocalLoginProps) => {
placeholder={intl.formatMessage(messages.password)} placeholder={intl.formatMessage(messages.password)}
autoComplete="current-password" autoComplete="current-password"
data-testid="password" data-testid="password"
data-form-type="password"
className="!bg-gray-700/80 placeholder:text-gray-400" className="!bg-gray-700/80 placeholder:text-gray-400"
data-1pignore="false" data-1pignore="false"
data-lpignore="false" data-lpignore="false"

View File

@@ -239,6 +239,7 @@ const NotificationsDiscord = () => {
type="text" type="text"
placeholder={settings.currentSettings.applicationTitle} placeholder={settings.currentSettings.applicationTitle}
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -296,6 +296,7 @@ const NotificationsEmail = () => {
type="text" type="text"
inputMode="email" inputMode="email"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -321,6 +322,7 @@ const NotificationsEmail = () => {
type="text" type="text"
inputMode="url" inputMode="url"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -346,6 +348,7 @@ const NotificationsEmail = () => {
inputMode="numeric" inputMode="numeric"
className="short" className="short"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -407,6 +410,7 @@ const NotificationsEmail = () => {
name="authUser" name="authUser"
type="text" type="text"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -446,6 +450,7 @@ const NotificationsEmail = () => {
rows="10" rows="10"
className="font-mono text-xs" className="font-mono text-xs"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -477,6 +482,7 @@ const NotificationsEmail = () => {
id="pgpPassword" id="pgpPassword"
name="pgpPassword" name="pgpPassword"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -269,6 +269,7 @@ const NotificationsTelegram = () => {
name="botUsername" name="botUsername"
type="text" type="text"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -307,6 +308,7 @@ const NotificationsTelegram = () => {
name="chatId" name="chatId"
type="text" type="text"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -383,6 +383,7 @@ const RadarrModal = ({ onClose, radarr, onSave }: RadarrModalProps) => {
name="name" name="name"
type="text" type="text"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -873,6 +873,7 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
name="tautulliPort" name="tautulliPort"
className="short" className="short"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -914,6 +915,7 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
id="tautulliUrlBase" id="tautulliUrlBase"
name="tautulliUrlBase" name="tautulliUrlBase"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"
@@ -958,6 +960,7 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
id="tautulliExternalUrl" id="tautulliExternalUrl"
name="tautulliExternalUrl" name="tautulliExternalUrl"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -416,6 +416,7 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
name="name" name="name"
type="text" type="text"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"

View File

@@ -198,6 +198,11 @@ function JellyfinSetup({
messages.hostname, messages.hostname,
mediaServerFormatValues mediaServerFormatValues
)} )}
autoComplete="off"
data-form-type="other"
data-1pignore="true"
data-lpignore="true"
data-bwignore="true"
/> />
</div> </div>
{errors.hostname && touched.hostname && ( {errors.hostname && touched.hostname && (
@@ -282,6 +287,11 @@ function JellyfinSetup({
name="email" name="email"
type="text" type="text"
placeholder={intl.formatMessage(messages.email)} placeholder={intl.formatMessage(messages.email)}
autoComplete="off"
data-form-type="other"
data-1pignore="true"
data-lpignore="true"
data-bwignore="true"
/> />
</div> </div>
{errors.email && touched.email && ( {errors.email && touched.email && (
@@ -298,6 +308,11 @@ function JellyfinSetup({
name="username" name="username"
type="text" type="text"
placeholder={intl.formatMessage(messages.username)} placeholder={intl.formatMessage(messages.username)}
autoComplete="off"
data-form-type="other"
data-1pignore="true"
data-lpignore="true"
data-bwignore="true"
/> />
</div> </div>
{errors.username && touched.username && ( {errors.username && touched.username && (
@@ -314,6 +329,11 @@ function JellyfinSetup({
name="password" name="password"
type="password" type="password"
placeholder={intl.formatMessage(messages.password)} placeholder={intl.formatMessage(messages.password)}
autoComplete="off"
data-form-type="other"
data-1pignore="true"
data-lpignore="true"
data-bwignore="true"
/> />
</div> </div>
{errors.password && touched.password && ( {errors.password && touched.password && (

View File

@@ -400,6 +400,7 @@ const UserList = () => {
type="text" type="text"
inputMode="email" inputMode="email"
autoComplete="off" autoComplete="off"
data-form-type="other"
data-1pignore="true" data-1pignore="true"
data-lpignore="true" data-lpignore="true"
data-bwignore="true" data-bwignore="true"