diff --git a/.github/workflows/actions/test-angular-e2e/action.yml b/.github/workflows/actions/test-angular-e2e/action.yml index 50c5907af0..91d6bbcf19 100644 --- a/.github/workflows/actions/test-angular-e2e/action.yml +++ b/.github/workflows/actions/test-angular-e2e/action.yml @@ -29,7 +29,7 @@ runs: shell: bash working-directory: ./packages/angular/test - name: Install Dependencies - run: npm install + run: npm install --legacy-peer-deps # TODO(FW-6227): Remove legacy-peer-deps flag shell: bash working-directory: ./packages/angular/test/build/${{ inputs.app }} - name: Sync Built Changes diff --git a/.github/workflows/assign-issues.yml b/.github/workflows/assign-issues.yml index e40aca1228..f1210e4e9a 100644 --- a/.github/workflows/assign-issues.yml +++ b/.github/workflows/assign-issues.yml @@ -13,6 +13,6 @@ jobs: - name: 'Auto-assign issue' uses: pozil/auto-assign-issue@65947009a243e6b3993edeef4e64df3ca85d760c # v1.14.0 with: - assignees: sean-perkins, brandyscarney, thetaPC + assignees: brandyscarney, thetaPC numOfAssignee: 1 allowSelfAssign: false diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93030502aa..5bbc649387 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -140,7 +140,7 @@ jobs: strategy: fail-fast: false matrix: - apps: [ng16, ng17] + apps: [ng16, ng17, ng18] needs: [build-angular, build-angular-server] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/conventional-commit.yml b/.github/workflows/conventional-commit.yml index b1ed2422bf..fe310a565a 100644 --- a/.github/workflows/conventional-commit.yml +++ b/.github/workflows/conventional-commit.yml @@ -24,3 +24,9 @@ jobs: # within the message. subjectPatternError: | The subject "{subject}" found in the pull request title "{title}" didn't match the configured pattern. Please ensure that the subject doesn't start with an uppercase character. + # If the PR contains one of these newline-delimited labels, the + # validation is skipped. If you want to rerun the validation when + # labels change, you might want to use the `labeled` and `unlabeled` + # event triggers in your workflow. + ignoreLabels: | + release diff --git a/.github/workflows/stencil-nightly.yml b/.github/workflows/stencil-nightly.yml index 56d3a56a71..3277171139 100644 --- a/.github/workflows/stencil-nightly.yml +++ b/.github/workflows/stencil-nightly.yml @@ -150,7 +150,7 @@ jobs: strategy: fail-fast: false matrix: - apps: [ng16, ng17] + apps: [ng16, ng17, ng18] needs: [build-angular, build-angular-server] runs-on: ubuntu-latest steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index c74a29e771..c004b4dece 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.1.1](https://github.com/ionic-team/ionic-framework/compare/v8.1.0...v8.1.1) (2024-05-08) + + +### Bug Fixes + +* **angular:** add formatOptions property to standalone datetime ([#29468](https://github.com/ionic-team/ionic-framework/issues/29468)) ([bb1db52](https://github.com/ionic-team/ionic-framework/commit/bb1db52567e0884a896f9ccd76c27540b52f5e48)), closes [#29464](https://github.com/ionic-team/ionic-framework/issues/29464) +* **angular:** persist select disabled state in item ([#29448](https://github.com/ionic-team/ionic-framework/issues/29448)) ([dfb72d7](https://github.com/ionic-team/ionic-framework/commit/dfb72d7ea06e28d76069b23eb90c3426181b7c4c)), closes [#29234](https://github.com/ionic-team/ionic-framework/issues/29234) +* **angular:** set active segment button when dynamically changing items ([#29418](https://github.com/ionic-team/ionic-framework/issues/29418)) ([ee83388](https://github.com/ionic-team/ionic-framework/commit/ee833881da3ecaa0a9153397f0c7e62c1923f19c)), closes [#29414](https://github.com/ionic-team/ionic-framework/issues/29414) +* **radio:** persist checked state when items are updated in radio-group ([#29457](https://github.com/ionic-team/ionic-framework/issues/29457)) ([7ea14ae](https://github.com/ionic-team/ionic-framework/commit/7ea14ae41eb27f2a58952bd27d91ef4c77bb6a0c)), closes [#29442](https://github.com/ionic-team/ionic-framework/issues/29442) + + + + + # [8.1.0](https://github.com/ionic-team/ionic-framework/compare/v8.0.2...v8.1.0) (2024-05-01) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 5f680b5aa3..cd7310d422 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.1.1](https://github.com/ionic-team/ionic-framework/compare/v8.1.0...v8.1.1) (2024-05-08) + + +### Bug Fixes + +* **angular:** persist select disabled state in item ([#29448](https://github.com/ionic-team/ionic-framework/issues/29448)) ([dfb72d7](https://github.com/ionic-team/ionic-framework/commit/dfb72d7ea06e28d76069b23eb90c3426181b7c4c)), closes [#29234](https://github.com/ionic-team/ionic-framework/issues/29234) +* **angular:** set active segment button when dynamically changing items ([#29418](https://github.com/ionic-team/ionic-framework/issues/29418)) ([ee83388](https://github.com/ionic-team/ionic-framework/commit/ee833881da3ecaa0a9153397f0c7e62c1923f19c)), closes [#29414](https://github.com/ionic-team/ionic-framework/issues/29414) +* **radio:** persist checked state when items are updated in radio-group ([#29457](https://github.com/ionic-team/ionic-framework/issues/29457)) ([7ea14ae](https://github.com/ionic-team/ionic-framework/commit/7ea14ae41eb27f2a58952bd27d91ef4c77bb6a0c)), closes [#29442](https://github.com/ionic-team/ionic-framework/issues/29442) + + + + + # [8.1.0](https://github.com/ionic-team/ionic-framework/compare/v8.0.2...v8.1.0) (2024-05-01) diff --git a/core/api.txt b/core/api.txt index de600584a7..a258394af6 100644 --- a/core/api.txt +++ b/core/api.txt @@ -4,7 +4,7 @@ ion-accordion,prop,disabled,boolean,false,false,false ion-accordion,prop,mode,"ios" | "md",undefined,false,false ion-accordion,prop,readonly,boolean,false,false,false ion-accordion,prop,theme,"ios" | "md" | "ionic",undefined,false,false -ion-accordion,prop,toggleIcon,string,chevronDown,false,false +ion-accordion,prop,toggleIcon,string | undefined,undefined,false,false ion-accordion,prop,toggleIconSlot,"end" | "start",'end',false,false ion-accordion,prop,value,string,`ion-accordion-${accordionIds++}`,false,false ion-accordion,part,content @@ -496,7 +496,7 @@ ion-fab,method,close,close() => Promise ion-fab-button,shadow ion-fab-button,prop,activated,boolean,false,false,false -ion-fab-button,prop,closeIcon,string,close,false,false +ion-fab-button,prop,closeIcon,string | undefined,undefined,false,false ion-fab-button,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record | undefined,undefined,false,true ion-fab-button,prop,disabled,boolean,false,false,false ion-fab-button,prop,download,string | undefined,undefined,false,false @@ -671,7 +671,7 @@ ion-item,shadow ion-item,prop,button,boolean,false,false,false ion-item,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record | undefined,undefined,false,true ion-item,prop,detail,boolean | undefined,undefined,false,false -ion-item,prop,detailIcon,string,chevronForward,false,false +ion-item,prop,detailIcon,string | undefined,undefined,false,false ion-item,prop,disabled,boolean,false,false,false ion-item,prop,download,string | undefined,undefined,false,false ion-item,prop,href,string | undefined,undefined,false,false @@ -1284,7 +1284,7 @@ ion-searchbar,prop,animated,boolean,false,false,false ion-searchbar,prop,autocapitalize,string,'off',false,false ion-searchbar,prop,autocomplete,"name" | "email" | "tel" | "url" | "on" | "off" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "language" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo",'off',false,false ion-searchbar,prop,autocorrect,"off" | "on",'off',false,false -ion-searchbar,prop,cancelButtonIcon,string,config.get('backButtonIcon', arrowBackSharp) as string,false,false +ion-searchbar,prop,cancelButtonIcon,string | undefined,undefined,false,false ion-searchbar,prop,cancelButtonText,string,'Cancel',false,false ion-searchbar,prop,clearIcon,string | undefined,undefined,false,false ion-searchbar,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record | undefined,undefined,false,true diff --git a/core/package-lock.json b/core/package-lock.json index a0877375ce..bcae4b18d3 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.1.0", + "version": "8.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.1.0", + "version": "8.1.1", "license": "MIT", "dependencies": { "@stencil/core": "^4.17.2", diff --git a/core/package.json b/core/package.json index 05c22d3bda..357fe0fb2d 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.1.0", + "version": "8.1.1", "description": "Base components for Ionic", "keywords": [ "ionic", diff --git a/core/scripts/docker.mjs b/core/scripts/docker.mjs index f723305459..5c23812d2e 100644 --- a/core/scripts/docker.mjs +++ b/core/scripts/docker.mjs @@ -53,4 +53,7 @@ if (requestHeaded && !hasHeadedConfigFiles) { console.warn(chalk.yellow.bold('\n⚠️ You are running tests in headed mode, but one or more of your headed config files was not found.\nPlease ensure that both docker-display.txt and docker-display-volume.txt have been created in the correct location.\n')); } -execa('docker', args, { shell: true, stdio: 'inherit' }); +const res = await execa('docker', args, { shell: true, stdio: 'inherit' }); + +// If underlying scripts failed this whole process should fail too +process.exit(res.exitCode); diff --git a/core/src/components.d.ts b/core/src/components.d.ts index fd7f283279..71dd452d1b 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -96,7 +96,7 @@ export namespace Components { /** * The toggle icon to use. This icon will be rotated when the accordion is expanded or collapsed. */ - "toggleIcon": string; + "toggleIcon"?: string; /** * The slot inside of `ion-item` to place the toggle icon. Defaults to `"end"`. */ @@ -1153,7 +1153,7 @@ export namespace Components { /** * The icon name to use for the close icon. This will appear when the fab button is pressed. Only applies if it is the main button inside of a fab containing a fab list. */ - "closeIcon": string; + "closeIcon"?: string; /** * The color to use from your application's color palette. Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`. For more information on colors, see [theming](/docs/theming/basics). */ @@ -1530,7 +1530,7 @@ export namespace Components { /** * The icon to use when `detail` is set to `true`. */ - "detailIcon": string; + "detailIcon"?: string; /** * If `true`, the user cannot interact with the item. */ @@ -2989,7 +2989,7 @@ export namespace Components { /** * Set the cancel button icon. Only available when the theme is `"md"`. Defaults to `"arrow-back-sharp"`. */ - "cancelButtonIcon": string; + "cancelButtonIcon"?: string; /** * Set the the cancel button text. Only available when the theme is `"ios"`. */ diff --git a/core/src/components/accordion/accordion.tsx b/core/src/components/accordion/accordion.tsx index a74aaa9592..891c7aafd4 100644 --- a/core/src/components/accordion/accordion.tsx +++ b/core/src/components/accordion/accordion.tsx @@ -79,7 +79,7 @@ export class Accordion implements ComponentInterface { * rotated when the accordion is expanded * or collapsed. */ - @Prop() toggleIcon = chevronDown; + @Prop() toggleIcon?: string; /** * The slot inside of `ion-item` to @@ -193,7 +193,8 @@ export class Accordion implements ComponentInterface { return; } - const { toggleIconSlot, toggleIcon } = this; + const { toggleIconSlot } = this; + const accordionToggleIcon = this.toggleIcon ?? config.get('accordionToggleIcon', chevronDown); /** * Check if there already is a toggle icon. @@ -208,7 +209,7 @@ export class Accordion implements ComponentInterface { iconEl.slot = toggleIconSlot; iconEl.lazy = false; iconEl.classList.add('ion-accordion-toggle-icon'); - iconEl.icon = toggleIcon; + iconEl.icon = accordionToggleIcon; iconEl.setAttribute('aria-hidden', 'true'); ionItem.appendChild(iconEl); diff --git a/core/src/components/accordion/test/a11y/accordion.e2e.ts b/core/src/components/accordion/test/a11y/accordion.e2e.ts index fce2bcc6c8..4abd5a7bf2 100644 --- a/core/src/components/accordion/test/a11y/accordion.e2e.ts +++ b/core/src/components/accordion/test/a11y/accordion.e2e.ts @@ -3,10 +3,11 @@ import { configs, test } from '@utils/test/playwright'; configs().forEach(({ config, title }) => { test.describe(title('accordion: a11y'), () => { - test('accordions should be keyboard navigable', async ({ page, skip, browserName }) => { - // TODO(FW-1764): remove skip once issue is resolved + // TODO(ROU-8157): remove skip once the keyboard navigation is working again + test.skip('accordions should be keyboard navigable', async ({ page, skip, browserName }) => { + // TODO(ROU-5358): remove skip once issue is resolved skip.browser('firefox', 'https://github.com/ionic-team/ionic-framework/issues/25070'); - // TODO (FW-2979) + // TODO (ROU-5437) skip.browser('webkit', 'Safari 16 only allows text fields and pop-up menus to be focused.'); await page.goto(`/src/components/accordion/test/a11y`, config); diff --git a/core/src/components/accordion/test/standalone/index.html b/core/src/components/accordion/test/standalone/index.html index 50cf965424..2cf504b7ec 100644 --- a/core/src/components/accordion/test/standalone/index.html +++ b/core/src/components/accordion/test/standalone/index.html @@ -2,7 +2,7 @@ - Accordion - Basic + Accordion - Standalone @@ -119,6 +119,7 @@ outline: none; text-align: left; padding: 20px 16px; + color: black; } .custom-accordion-content { diff --git a/core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-scale-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-scale-ios-ltr-Mobile-Chrome-linux.png index d838af9af8..06ac65c3f3 100644 Binary files a/core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-scale-ios-ltr-Mobile-Chrome-linux.png and b/core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-scale-ios-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/back-button/back-button.tsx b/core/src/components/back-button/back-button.tsx index f9824603fd..f2e1c0731f 100644 --- a/core/src/components/back-button/back-button.tsx +++ b/core/src/components/back-button/back-button.tsx @@ -82,7 +82,7 @@ export class BackButton implements ComponentInterface, ButtonInterface { get backButtonIcon() { const icon = this.icon; if (icon != null) { - // icon is set on the component or by the config + // Icon is set on the component or by the config. return icon; } diff --git a/core/src/components/breadcrumb/breadcrumb.tsx b/core/src/components/breadcrumb/breadcrumb.tsx index 0833a0dd02..1f396314c0 100644 --- a/core/src/components/breadcrumb/breadcrumb.tsx +++ b/core/src/components/breadcrumb/breadcrumb.tsx @@ -5,6 +5,7 @@ import { inheritAriaAttributes } from '@utils/helpers'; import { createColorClasses, hostContext, openURL } from '@utils/theme'; import { chevronForwardOutline, ellipsisHorizontal } from 'ionicons/icons'; +import { config } from '../../global/config'; import { getIonTheme } from '../../global/ionic-global'; import type { AnimationBuilder, Color } from '../../interface'; import type { RouterDirection } from '../router/utils/interface'; @@ -167,6 +168,9 @@ export class Breadcrumb implements ComponentInterface { const clickable = this.isClickable(); const TagType = this.href === undefined ? 'span' : ('a' as any); + const breadcrumbSeparatorIcon = config.get('breadcrumbSeparatorIcon', chevronForwardOutline); + const breadcrumbCollapsedIcon = config.get('breadcrumbCollapsedIcon', ellipsisHorizontal); + // Links can still be tabbed to when set to disabled if they have an href // in order to truly disable them we can keep it as an anchor but remove the href const href = disabled ? undefined : this.href; @@ -224,7 +228,7 @@ export class Breadcrumb implements ComponentInterface { 'breadcrumbs-collapsed-indicator': true, }} > - + )} {showSeparator && ( @@ -236,7 +240,7 @@ export class Breadcrumb implements ComponentInterface {