mirror of
https://github.com/XFox111/PasswordGeneratorExtension.git
synced 2026-04-22 08:08:01 +03:00
8126886fb5
* Advanced generator, UI overhaul (#449) * Major overhaul: - Added advanced generator - Removed "Insert and copy" feature - Moved settings to extension options - General refactoring * Updated custom character options for default generator (#447) * Added state save for advanced generator mode * Fixed state save for advanced password generator * Updated extension description * Minor UI fixes: - Fixed Options UI not displaying in Google Chrome - Fixed Quick Options menus overflowing on some locales - Fixed Advanced generator configuration UI clipping when window height is too small - Fixed divider in Options UI taking up all available space * Minor UI/UX changes and fixes: - Fixed locale in Advanced generator toast notifications - Added toast notification for copying a single password in Advanced generator - Moved custom characters input lables to placeholders - Fixed minor type issues - Removed duplicate "About" text - Fixed input fields alignment in Options - Added "disabled" state for "Include Custom" option in Quick settings * Bump @typescript-eslint/parser from 8.16.0 to 8.19.1 (#468) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.16.0 to 8.19.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.19.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @eslint/js from 9.16.0 to 9.18.0 (#467) Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.16.0 to 9.18.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.18.0/packages/js) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @fluentui/react-components from 9.56.3 to 9.57.0 (#466) Bumps [@fluentui/react-components](https://github.com/microsoft/fluentui) from 9.56.3 to 9.57.0. - [Release notes](https://github.com/microsoft/fluentui/releases) - [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.56.3...@fluentui/react-components_v9.57.0) --- updated-dependencies: - dependency-name: "@fluentui/react-components" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump wxt from 0.19.17 to 0.19.24 (#465) Bumps [wxt](https://github.com/wxt-dev/wxt) from 0.19.17 to 0.19.24. - [Release notes](https://github.com/wxt-dev/wxt/releases) - [Commits](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.17...wxt-v0.19.24) --- updated-dependencies: - dependency-name: wxt dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump eslint from 9.16.0 to 9.18.0 (#464) Bumps [eslint](https://github.com/eslint/eslint) from 9.16.0 to 9.18.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.16.0...v9.18.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump eslint-plugin-react from 7.37.2 to 7.37.4 (#463) Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.37.2 to 7.37.4. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.37.2...v7.37.4) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eugene Fox <eugene.xfox@outlook.com> * Bump typescript from 5.7.2 to 5.7.3 (#462) Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.7.2 to 5.7.3. - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.7.2...v5.7.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eugene Fox <eugene.xfox@outlook.com> * Bump @typescript-eslint/eslint-plugin from 8.16.0 to 8.19.1 (#461) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.16.0 to 8.19.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.19.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump wdzeng/chrome-extension from 1.2.4 to 1.3.0 (#450) * Bump wdzeng/chrome-extension from 1.2.4 to 1.3.0 Bumps [wdzeng/chrome-extension](https://github.com/wdzeng/chrome-extension) from 1.2.4 to 1.3.0. - [Release notes](https://github.com/wdzeng/chrome-extension/releases) - [Commits](https://github.com/wdzeng/chrome-extension/compare/v1.2.4...v1.3.0) --- updated-dependencies: - dependency-name: wdzeng/chrome-extension dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Optimized CD workflow --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eugene Fox <eugene@xfox111.net> * Bump @fluentui/react-icons from 2.0.266 to 2.0.270 (#458) Bumps [@fluentui/react-icons](https://github.com/microsoft/fluentui-system-icons) from 2.0.266 to 2.0.270. - [Changelog](https://github.com/microsoft/fluentui-system-icons/blob/main/fluentui-android-system-icons-release.yml) - [Commits](https://github.com/microsoft/fluentui-system-icons/commits) --- updated-dependencies: - dependency-name: "@fluentui/react-icons" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @wxt-dev/module-react from 1.1.2 to 1.1.3 (#455) Bumps [@wxt-dev/module-react](https://github.com/wxt-dev/wxt/tree/HEAD/packages/module-react) from 1.1.2 to 1.1.3. - [Release notes](https://github.com/wxt-dev/wxt/releases) - [Changelog](https://github.com/wxt-dev/wxt/blob/main/packages/module-react/CHANGELOG.md) - [Commits](https://github.com/wxt-dev/wxt/commits/module-react-v1.1.3/packages/module-react) --- updated-dependencies: - dependency-name: "@wxt-dev/module-react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump globals from 15.12.0 to 15.14.0 (#452) Bumps [globals](https://github.com/sindresorhus/globals) from 15.12.0 to 15.14.0. - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v15.12.0...v15.14.0) --- updated-dependencies: - dependency-name: globals dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
134 lines
5.0 KiB
TypeScript
134 lines
5.0 KiB
TypeScript
import { GeneratorOptions, useStorage } from "@/utils/storage";
|
|
import * as fui from "@fluentui/react-components";
|
|
import * as ic from "@fluentui/react-icons";
|
|
import { ReactElement } from "react";
|
|
import { useStyles } from "./QuickOptions.styles";
|
|
|
|
export default function QuickOptions({ onChange }: QuickOptionsProps): ReactElement
|
|
{
|
|
const { extOptions, generatorOptions } = useStorage();
|
|
const [quickOpts, setOptions] = useState<GeneratorOptions>(generatorOptions);
|
|
const checkedOptions = useMemo(
|
|
() => Object.keys(quickOpts).filter(k => quickOpts[k as keyof GeneratorOptions] as boolean),
|
|
[quickOpts]
|
|
);
|
|
|
|
const onCheckedValueChange = useCallback((_: unknown, e: fui.MenuCheckedValueChangeData): void =>
|
|
{
|
|
const opts: Partial<Omit<GeneratorOptions, "Length" | "IncludeCustomSet" | "ExcludeCustomSet">> = {};
|
|
|
|
const keys = Object.keys(quickOpts)
|
|
.filter(i =>
|
|
i !== "Length" && i !== "IncludeCustomSet" && i !== "ExcludeCustomSet" &&
|
|
i.startsWith("Exclude") === (e.name === "exclude")
|
|
) as (keyof Omit<GeneratorOptions, "Length" | "IncludeCustomSet" | "ExcludeCustomSet">)[];
|
|
|
|
for (const key of keys)
|
|
opts[key] = e.checkedItems.includes(key);
|
|
|
|
setOptions({ ...generatorOptions, ...quickOpts, ...opts });
|
|
}, [quickOpts]);
|
|
|
|
useEffect(() => onChange(quickOpts), [onChange, quickOpts]);
|
|
|
|
const IncludeIcon: ic.FluentIcon = ic.bundleIcon(ic.AddCircleFilled, ic.AddCircleRegular);
|
|
const ExcludeIcon: ic.FluentIcon = ic.bundleIcon(ic.SubtractCircleFilled, ic.SubtractCircleRegular);
|
|
const cls = useStyles();
|
|
|
|
return (
|
|
<div className={ cls.options }>
|
|
|
|
<div className={ cls.lengthContainer }>
|
|
<fui.Slider
|
|
min={ extOptions.MinLength } max={ Math.max(extOptions.MaxLength, generatorOptions.Length) }
|
|
value={ quickOpts.Length } onChange={ (_, e) => setOptions({ ...quickOpts, Length: e.value }) } />
|
|
<fui.Text>{ quickOpts.Length }</fui.Text>
|
|
</div>
|
|
|
|
<div className={ cls.characterOptionsContainer }>
|
|
<fui.Menu
|
|
positioning={ { position: "after", align: "center", offset: -48 } }
|
|
checkedValues={ { include: checkedOptions } }
|
|
onCheckedValueChange={ onCheckedValueChange }>
|
|
|
|
<fui.MenuTrigger disableButtonEnhancement>
|
|
<fui.MenuButton appearance="subtle" icon={ <IncludeIcon /> }>
|
|
{ i18n.t("popup.include") }
|
|
</fui.MenuButton>
|
|
</fui.MenuTrigger>
|
|
|
|
<fui.MenuPopover>
|
|
<fui.MenuList>
|
|
<fui.MenuItemCheckbox name="include" value="Uppercase">
|
|
{ i18n.t("common.characters.uppercase") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItemCheckbox name="include" value="Lowercase">
|
|
{ i18n.t("common.characters.lowercase") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItemCheckbox name="include" value="Numeric">
|
|
{ i18n.t("common.characters.numeric") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItemCheckbox name="include" value="Special">
|
|
{ i18n.t("common.characters.special") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuSplitGroup>
|
|
<fui.MenuItemCheckbox name="include" value="Custom"
|
|
disabled={ generatorOptions.IncludeCustomSet.length < 1 }>
|
|
|
|
{ i18n.t("common.characters.custom") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItem icon={ <ic.EditRegular /> }
|
|
onClick={ () => browser.runtime.openOptionsPage() } />
|
|
</fui.MenuSplitGroup>
|
|
</fui.MenuList>
|
|
</fui.MenuPopover>
|
|
</fui.Menu>
|
|
|
|
<fui.Menu
|
|
positioning={ { position: "after", align: "center", offset: -64 } }
|
|
checkedValues={ { exclude: checkedOptions } }
|
|
onCheckedValueChange={ onCheckedValueChange }>
|
|
|
|
<fui.MenuTrigger disableButtonEnhancement>
|
|
<fui.MenuButton appearance="subtle" icon={ <ExcludeIcon /> }>
|
|
{ i18n.t("popup.exclude") }
|
|
</fui.MenuButton>
|
|
</fui.MenuTrigger>
|
|
|
|
<fui.MenuPopover>
|
|
<fui.MenuList>
|
|
<fui.MenuItemCheckbox name="exclude" value="ExcludeSimilar">
|
|
{ i18n.t("common.characters.similar") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItemCheckbox name="exclude" value="ExcludeAmbiguous" disabled={ !quickOpts.Special }>
|
|
{ i18n.t("common.characters.ambiguous") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItemCheckbox name="exclude" value="ExcludeRepeating">
|
|
{ i18n.t("common.characters.repeating.label") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuSplitGroup>
|
|
<fui.MenuItemCheckbox name="exclude" value="ExcludeCustom"
|
|
disabled={ generatorOptions.ExcludeCustomSet.length < 1 }>
|
|
|
|
{ i18n.t("common.characters.custom") }
|
|
</fui.MenuItemCheckbox>
|
|
<fui.MenuItem icon={ <ic.EditRegular /> }
|
|
onClick={ () => browser.runtime.openOptionsPage() } />
|
|
</fui.MenuSplitGroup>
|
|
</fui.MenuList>
|
|
</fui.MenuPopover>
|
|
</fui.Menu>
|
|
|
|
<fui.Tooltip content={ i18n.t("common.actions.reset") } relationship="label">
|
|
<fui.Button appearance="subtle" icon={ <ic.ArrowUndoRegular /> } onClick={ () => setOptions(generatorOptions) } />
|
|
</fui.Tooltip>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export type QuickOptionsProps =
|
|
{
|
|
onChange: (value: GeneratorOptions) => void;
|
|
};
|