diff --git a/.github/release.yaml b/.github/release.yaml new file mode 100644 index 0000000..a78097b --- /dev/null +++ b/.github/release.yaml @@ -0,0 +1,26 @@ +changelog: + exclude: + labels: + - skip-changelog + - duplicate + authors: + - dependabot + categories: + - title: ๐Ÿš€ New Features + labels: + - feat + - enh + - title: ๐Ÿ› Bug Fixes + labels: + - bug + - fix + - title: ๐Ÿ“– Documentation + labels: + - docs + - title: ๐Ÿงน Maintenance + labels: + - perf + - deps + - title: Other Changes + labels: + - "*" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 90ba594..5872ada 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -79,15 +79,42 @@ jobs: git push origin $NEW_TAG git push --delete origin $TAG_NAME + + create-release: + runs-on: ubuntu-latest + needs: deploy-dart + if: success() + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Get previous tag + id: previousTag + run: | + name=$(git --no-pager tag --sort=creatordate --merged ${{ github.ref_name }} | tail -2 | head -1) + echo "previousTag=$name" >> $GITHUB_OUTPUT + + - name: Generate Changelog + id: changelog + uses: requarks/changelog-action@v1 + with: + token: ${{ github.token }} + fromTag: ${{ github.ref_name }} + toTag: ${{ steps.previousTag.outputs.previousTag }} + writeToFile: false + excludeTypes: chore,style + - name: Create GitHub Release - if: success() uses: softprops/action-gh-release@v1 with: tag_name: ${{ github.ref_name }} name: Release ${{ github.ref_name }} + body: ${{ steps.changelog.outputs.changes }} draft: false prerelease: false - generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/example/lib/router.dart b/example/lib/router.dart index 9d41308..49018e6 100644 --- a/example/lib/router.dart +++ b/example/lib/router.dart @@ -145,7 +145,7 @@ final goRoutes = [ ]; final router = GoRouter( - initialLocation: kDebugMode ? '/inputs/text' : '/', + initialLocation: kDebugMode ? '/map/layer' : '/', errorPageBuilder: (context, state) => customTransitionBuilder(context, state, const NotFoundView()), routes: goRoutes, ); diff --git a/example/lib/views/map/src/layer.dart b/example/lib/views/map/src/layer.dart index c4dfc60..db61181 100644 --- a/example/lib/views/map/src/layer.dart +++ b/example/lib/views/map/src/layer.dart @@ -111,6 +111,7 @@ class _MapLayerViewState extends State with TickerProviderStateMix layer: selectedLayer, controller: _controller, ), + // MarkerLayer( // markers: [ // Marker( diff --git a/lib/src/inputs/src/general/password_input.dart b/lib/src/inputs/src/general/password_input.dart index c031a5d..eca2ce5 100644 --- a/lib/src/inputs/src/general/password_input.dart +++ b/lib/src/inputs/src/general/password_input.dart @@ -49,6 +49,14 @@ class ThemedPasswordInput extends StatefulWidget { /// The progress indicator will fill up to 25% for each requirement met and for each level reached. final bool showLevels; + /// [autofillHints] is the list of autofill hints for the input. + /// + /// By default uses [AutofillHints.newPassword] and [AutofillHints.password] to allow the browser + /// to suggest strong passwords and to recognize the field as a password input + /// for autofill purposes. However, ideally you should use [AutofillHints.newPassword] for password + /// creation fields and [AutofillHints.password] for password update fields + final List autofillHints; + /// [ThemedPasswordInput] is the constructor of the input. /// Simplifies (I hope so) the creation of an input using the standard format of Layrz. const ThemedPasswordInput({ @@ -68,6 +76,7 @@ class ThemedPasswordInput extends StatefulWidget { this.focusNode, this.controller, this.showLevels = true, + this.autofillHints = const [AutofillHints.newPassword, AutofillHints.password], }) : assert( (label == null && labelText != null) || (label != null && labelText == null), 'You must provide either a labelText or a label, but not both.', @@ -167,6 +176,7 @@ class _ThemedPasswordInputState extends State { padding: widget.padding, isRequired: widget.isRequired, obscureText: !_showPassword, + autofillHints: widget.autofillHints, suffixWidget: Row( mainAxisAlignment: .center, crossAxisAlignment: .center,