From 1b055fcbd121d1327f15a03e956480922a1ea7e8 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Mon, 4 May 2020 17:43:46 +0300 Subject: [PATCH 01/22] wip(ui5-li-notification): introduce new component The component covers the main functionaly of the sap.m.NotificationListItem. It is meant to display a notification and has a rich set of properties and slots to do it. Missing parts - no tests - no rtl support - not tested on all browser device matrix --- packages/fiori/bundle.esm.js | 2 + packages/fiori/src/NotificationListItem.hbs | 77 +++ packages/fiori/src/NotificationListItem.js | 492 ++++++++++++++++++ .../fiori/src/NotificationListItemPopover.hbs | 18 + .../fiori/src/NotificationOverflowAction.js | 60 +++ .../fiori/src/i18n/messagebundle.properties | 3 + .../src/themes/NotifactionListItemPopover.css | 12 + .../fiori/src/themes/NotificationListItem.css | 176 +++++++ packages/fiori/src/types/Priority.js | 55 ++ .../fiori/test/pages/NotificationList.html | 185 +++++++ .../fiori/test/pages/img/man_avatar_1.png | Bin 0 -> 118473 bytes packages/main/src/List.js | 22 + packages/main/src/themes/List.css | 1 + 13 files changed, 1103 insertions(+) create mode 100644 packages/fiori/src/NotificationListItem.hbs create mode 100644 packages/fiori/src/NotificationListItem.js create mode 100644 packages/fiori/src/NotificationListItemPopover.hbs create mode 100644 packages/fiori/src/NotificationOverflowAction.js create mode 100644 packages/fiori/src/themes/NotifactionListItemPopover.css create mode 100644 packages/fiori/src/themes/NotificationListItem.css create mode 100644 packages/fiori/src/types/Priority.js create mode 100644 packages/fiori/test/pages/NotificationList.html create mode 100644 packages/fiori/test/pages/img/man_avatar_1.png diff --git a/packages/fiori/bundle.esm.js b/packages/fiori/bundle.esm.js index c9d0e50219ca..ee25e43394b5 100644 --- a/packages/fiori/bundle.esm.js +++ b/packages/fiori/bundle.esm.js @@ -13,3 +13,5 @@ import ShellBar from "./dist/ShellBar.js"; import ShellBarItem from "./dist/ShellBarItem.js"; import UploadCollection from "./dist/UploadCollection.js"; import UploadCollectionItem from "./dist/UploadCollectionItem.js"; +import NotificationListItem from "./dist/NotificationListItem.js"; +import NotificationOverflowAction from "./dist/NotificationOverflowAction.js"; \ No newline at end of file diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs new file mode 100644 index 000000000000..8251b039eba7 --- /dev/null +++ b/packages/fiori/src/NotificationListItem.hbs @@ -0,0 +1,77 @@ +<li + class="ui5-nli-root" + @focusin="{{_onfocusin}}" + @focusout="{{_onfocusout}}" + @keydown="{{_onkeydown}}" + @keyup="{{_onkeyup}}" + @click="{{_onclick}}" + role="option" + tabindex="{{_tabIndex}}" +> + + <div class="ui5-nli-avatar"> + <slot name="avatar"></slot> + </div> + + <div class="ui5-nli-content {{classes.content}}"> + <div class="ui5-nli-heading"> + {{#if hasPriority}} + <ui5-icon + class="ui5-nli-prio-icon ui5-nli-prio-icon--{{priorityIcon}}" + name="{{priorityIcon}}"> + </ui5-icon> + {{/if}} + + <div class="ui5-nli-title" part="heading"> + {{heading}} + </div> + </div> + + {{#if hasDesc}} + <div class="ui5-nli-description"> + <slot></slot> + </div> + {{/if}} + + <div class="ui5-nli-footer"> + {{#each footerItems}} + <slot name="{{slotName}}"></slot> + {{#if showDivider}} + <div class="ui5-nli-footer-divider"></div> + {{/if}} + {{/each}} + + <ui5-link + class="ui5-nli-footer-showMore" + ?hidden="{{hideShowMore}}" + @click="{{_onShowMoreClick}}">{{showMoreText}}</ui5-link> + </div> + </div> + + <div class="ui5-nli-actions"> + {{#unless showOverflow}} + {{#each standardActions}} + <ui5-button + icon="{{this.icon}}" + class="ui5-nli-action" + @click="{{this.press}}" + data-ui5-external-action-item-id="{{this.refItemid}}" + >{{this.text}} + </ui5-button> + {{/each}} + {{/unless}} + + {{#if showOverflow}} + <ui5-button + icon="overflow" + design="Transparent" + @click="{{_onBtnOverflowClick}}" + class="ui5-nli-overflow-btn"> + </ui5-button> + {{/if}} + + {{#if showClose}} + <ui5-button icon="decline" design="Transparent" @click="{{_onBtnCloseClick}}"></ui5-button> + {{/if}} + </div> +</li> \ No newline at end of file diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js new file mode 100644 index 000000000000..e34cc75bb49a --- /dev/null +++ b/packages/fiori/src/NotificationListItem.js @@ -0,0 +1,492 @@ +import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; +import { isSpace, isEnter } from "@ui5/webcomponents-base/dist/Keys.js"; +import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; +import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js"; +import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; + +import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; +import Button from "@ui5/webcomponents/dist/Button.js"; +import Icon from "@ui5/webcomponents/dist/Icon.js"; +import Priority from "./types/Priority.js"; + +// icons +import "@ui5/webcomponents-icons/dist/icons/decline.js"; +import "@ui5/webcomponents-icons/dist/icons/message-success.js"; +import "@ui5/webcomponents-icons/dist/icons/message-error.js"; +import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; + +// text +import { NOTIFICATIONLISTITEM_SHOW_MORE } from "./generated/i18n/i18n-defaults.js"; + +// Template +import NotificationListItemTemplate from "./generated/templates/NotificationListItemTemplate.lit.js"; +import NotificationListItemPopoverTemplate from "./generated/templates/NotificationListItemPopoverTemplate.lit.js"; + +// Styles +import NotificationListItemCss from "./generated/themes/NotificationListItem.css.js"; +import NotifactionListItemPopoverCss from "./generated/themes/NotifactionListItemPopover.css.js"; + +const PRIORITY_ICONS_MAP = { + "High": "message-error", + "Medium": "message-warning", + "Low": "message-success", +}; + +const MAX_WRAP_HEIGHT = 32; // px. + +/** + * @public + */ +const metadata = { + tag: "ui5-li-notification", + managedSlots: true, + properties: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { + /** + * Defines the heading. + * @type {string} + * @defaultvalue: "" + * @public + */ + heading: { + type: String, + }, + + /** + * Defines the priority of the notification. + * @type {Priority} + * @defaultvalue: "None" + * @public + */ + priority: { + type: Priority, + defaultValue: Priority.None, + }, + + /** + * Defines if a <code>close</code> button should be displayed. + * @type {boolean} + * @defaultvalue false + * @public + */ + showClose: { + type: Boolean, + }, + + /** + * Defines if the <code>heading</code> and <code>decription</code> should truncate, + * they would wrap by default. + * @type {boolean} + * @defaultvalue false + * @public + */ + truncate: { + type: Boolean, + }, + + /** + * Defines the truncation of the <code>heading</code> and <code>decription</code>. + * @private + */ + noTruncation: { + type: Boolean, + }, + + /** + * Defines the visibility of the <code>showMore</code> button. + * @private + */ + showMore: { + type: Boolean, + }, + }, + slots: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { + + /** + * Defines the actions, displayed in the <code>ui5-li-notification</code>. + * + * <b>Note:</b> Consider using the <code>ui5-notification-action</code>. + * + * @type {HTMLElement} + * @slot + * @public + */ + actions: { + type: HTMLElement, + propertyName: "actions", + }, + + /** + * Defines the avatar, displayed in the <code>ui5-li-notification</code>. + * + * <br><br> + * <b>Note:</b> Consider using the <code>ui5-avatar</code> to dipslay icons, initials or images. + * + * @type {HTMLElement} + * @slot + * @public + */ + avatar: { + type: HTMLElement, + }, + + /** + * Defines the elements dipalyed in the footer of the of the <code>ui5-li-notification</code>. + * + * + * @type {HTMLElement[]} + * @slot + * @public + */ + footnotes: { + type: HTMLElement, + propertyName: "footnotes", + individualSlots: true, + }, + + /** + * Defines the description of the <code>ui5-li-notification</code>. + * + * <br><br> + * <b>Note:</b> Аlthough this slot accepts HTML Elements, it is strongly recommended that you only use text in order to preserve the intended design. + * + * @type {Node[]} + * @slot + * @public + */ + "default": { + propertyName: "description", + type: Node, + }, + }, + events: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { + _close: {}, + _press: {}, + }, +}; + +/** + * @class + * + * <h3 class="comment-api-title">Overview</h3> + * The <code>ui5-li-notification</code> is a type of list item, meant to dispaly notifcatations. + * The component has a rich set of various properties that allows the user to set an <code>avatar, <code>heading, descriptive <code>content</code> + * and <code>footnotes</code> that appear at the bottom of the notifcation. + * + * The user can optionally display a <code>close</code> button. + * The user can control whether the <code>heading</code> and <code>description</code> should wrap or truncate + * and display a <code>ShomeMore</code> button to switch between less and more information. + * + * The user can also add custom actions by using the <code>ui5-notification-overflow-action</code>. + * When it is a single action, it would appear nex to the heading and + * but there are multiple actions, they would be displayed within a popover, that can be opened by an <code>overflow</code> button. + * + * <h3>Usage</h3> + * The component can be used in a standard <code>ui5-list</code>. + * + * For the <code>ui5-li-notification</code> + * <h3>ES6 Module Import</h3> + * + * <code>import @ui5/webcomponents/dist/NotificationListItem.js";</code> + * <code>import @ui5/webcomponents/dist/NotificationOverflowAction.js";</code> (optional) + * @constructor + * @author SAP SE + * @alias sap.ui.webcomponents.fiori.NotificationListItem + * @extends UI5Element + * @tagname ui5-li-notification + * @appenddocs NotificationOverflowAction + * @public + */ +class NotificationListItem extends ListItemBase { + constructor() { + super(); + + // indicates if the showMore has been pressed + this._showMorePressed = false; + + // the heading overflow height + this._headingOverflowHeight = 0; + + // the description overflow height + this._descOverflowHeight = 0; + + this.onResizeBind = this.onResize.bind(this); + this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); + } + + static get metadata() { + return metadata; + } + + static get render() { + return litRender; + } + + static get styles() { + return NotificationListItemCss; + } + + static get template() { + return NotificationListItemTemplate; + } + + static get staticAreaTemplate() { + return NotificationListItemPopoverTemplate; + } + + static get staticAreaStyles() { + return NotifactionListItemPopoverCss; + } + + static async onDefine() { + await Promise.all([ + Button.define(), + Icon.define(), + fetchI18nBundle("@ui5/webcomponents-fiori"), + ]); + } + + onEnterDOM() { + ResizeHandler.register(this, this.onResizeBind); + } + + onExitDOM() { + ResizeHandler.deregister(this, this.onResizeBind); + } + + get footerItems() { + return this.footnotes.map((el, idx, arr) => { + return { + slotName: el._individualSlot, + showDivider: idx !== arr.length - 1, + }; + }); + } + + get hasHeading() { + return !!this.heading.length; + } + + get hasDesc() { + return !!this.description.length; + } + + get hasFootNotes() { + return !!this.footnotes.length; + } + + get hasPriority() { + return this.priority !== Priority.None; + } + + get priorityIcon() { + return PRIORITY_ICONS_MAP[this.priority]; + } + + get showMoreText() { + return this.i18nBundle.getText(NOTIFICATIONLISTITEM_SHOW_MORE); + } + + get hideShowMore() { + if (this.truncate && this.showMore) { + return undefined; + } + + return true; + } + + get descriptionDOM() { + return this.shadowRoot.querySelector(".ui5-nli-description"); + } + + get headingDOM() { + return this.shadowRoot.querySelector(".ui5-nli-title"); + } + + get headingHeight() { + return this.headingDOM.offsetHeight; + } + + get descriptionHeight() { + return this.descriptionDOM.offsetHeight; + } + + get headingOverflows() { + const heading = this.headingDOM; + + if (!heading) { + return false; + } + + if (isIE()) { + return heading.scrollHeight > MAX_WRAP_HEIGHT; + } + + return heading.offsetHeight < heading.scrollHeight; + } + + get descriptionOverflows() { + const description = this.descriptionDOM; + + if (!description) { + return false; + } + + if (isIE()) { + return description.scrollHeight > MAX_WRAP_HEIGHT; + } + + return description.offsetHeight < description.scrollHeight; + } + + get overflowButtonDOM() { + return this.shadowRoot.querySelector(".ui5-nli-overflow-btn"); + } + + get showOverflow() { + return !!this.overflowActions.length; + } + + get overflowActions() { + if (this.actions.length <= 1) { + return []; + } + + return this.clonedActions; + } + + get standardActions() { + if (this.actions.length > 1) { + return []; + } + + return this.clonedActions; + } + + get clonedActions() { + return this.actions.map(action => { + return { + icon: action.icon, + text: action.text, + press: this._onCustomActionPress.bind(this), + refItemid: action._id, + }; + }); + } + + get classes() { + return { + content: { + "ui5-nli-content--ie": isIE(), + }, + }; + } + + /** + * Event handlers + * + */ + + _onclick(event) { + if (event.isMarked === "button") { + return; + } + this.fireItemPress(event); + } + + _onShowMoreClick() { + this._showMorePressed = !this._showMorePressed; + this.noTruncation = !this.noTruncation; + } + + _onBtnCloseClick() { + this.fireEvent("_close", { item: this }); + } + + _onBtnOverflowClick() { + this.openOverflow(); + } + + _onkeydown(event) { + super._onkeydown(event); + + if (isSpace(event)) { + event.preventDefault(); + } + + if (isEnter(event)) { + this.fireItemPress(event); + } + } + + _onkeyup(event) { + if (isSpace(event)) { + this.fireItemPress(event); + } + } + + /** + * Private + */ + fireItemPress() { + this.fireEvent("_press", { item: this }); + } + + onResize() { + if (!this.truncate) { + this.showMore = false; + return; + } + + if (this._showMorePressed + && (this.headingHeight > this._headingOverflowHeight + || this.descriptionHeight > this._descOverflowHeight)) { + this.showMore = true; + return; + } + + if (this.headingOverflows || this.descriptionOverflows) { + this._headingOverflowHeight = this.headingHeight; + this._descOverflowHeight = this.descriptionHeight; + this.showMore = true; + return; + } + + this.showMore = false; + } + + _onCustomActionPress(event) { + const refItemId = event.target.getAttribute("data-ui5-external-action-item-id"); + + if (refItemId) { + this.getActionByID(refItemId).fireEvent("click", { + targetRef: event.target, + }, true); + + this.closeOverflow(); + } + } + + + getActionByID(id) { + return this.actions.find(action => action._id === id); + } + + async openOverflow() { + const overflowPopover = await this.overflowPopover(); + overflowPopover.openBy(this.overflowButtonDOM); + } + + async closeOverflow() { + const overflowPopover = await this.overflowPopover(); + overflowPopover.close(); + } + + async overflowPopover() { + const staticAreaItem = await this.getStaticAreaItemDomRef(); + return staticAreaItem.querySelector(".ui5-nli-overflow-popover"); + } +} + +NotificationListItem.define(); + +export default NotificationListItem; diff --git a/packages/fiori/src/NotificationListItemPopover.hbs b/packages/fiori/src/NotificationListItemPopover.hbs new file mode 100644 index 000000000000..545ad4a7bc8b --- /dev/null +++ b/packages/fiori/src/NotificationListItemPopover.hbs @@ -0,0 +1,18 @@ +<ui5-popover + class="ui5-nli-overflow-popover" + placement-type="Bottom" + horizontal-align="Right" + no-arrow +> + <div class="ui5-nli-overflow-list"> + {{#each overflowActions}} + <ui5-button + icon="{{this.icon}}" + design="Transparent" + @click="{{this.press}}" + data-ui5-external-action-item-id="{{this.refItemid}}" + >{{this.text}} + </ui5-button> + {{/each}} + </div> +</ui5-popover> \ No newline at end of file diff --git a/packages/fiori/src/NotificationOverflowAction.js b/packages/fiori/src/NotificationOverflowAction.js new file mode 100644 index 000000000000..4515f4cdd1ae --- /dev/null +++ b/packages/fiori/src/NotificationOverflowAction.js @@ -0,0 +1,60 @@ +import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js"; + +/** + * @public + */ +const metadata = { + tag: "ui5-notification-overflow-action", + properties: /** @lends sap.ui.webcomponents.fiori.NotificationOverflowAction.prototype */ { + /** + * Defines the text of the <code>ui5-notification-overflow-action</code>. + * + * @type {string} + * @defaultvalue "" + * @public + */ + text: { + type: String, + }, + + /** + * Defines the <code>icon</code> source URI. + * <br><br> + * <b>Note:</b> + * SAP-icons font provides numerous buil-in icons. To find all the available icons, see the + * <ui5-link target="_blank" href="https://openui5.hana.ondemand.com/test-resources/sap/m/demokit/iconExplorer/webapp/index.html" class="api-table-content-cell-link">Icon Explorer</ui5-link>. + * + * @type {string} + * @public + */ + icon: { + type: String, + }, + }, + slots: { + }, + events: { + click: {}, + }, +}; + +/** + * @class + * The <code>ui5-notification-overflow-action</code> represents an astract action, + * used in the <code>ui5-li-notication</code>. + * + * @constructor + * @author SAP SE + * @alias sap.ui.webcomponents.fiori.NotificationOverflowAction + * @extends UI5Element + * @public + */ +class NotificationOverflowAction extends UI5Element { + static get metadata() { + return metadata; + } +} + +NotificationOverflowAction.define(); + +export default NotificationOverflowAction; diff --git a/packages/fiori/src/i18n/messagebundle.properties b/packages/fiori/src/i18n/messagebundle.properties index 742bfd79f9f4..97f1074ea203 100644 --- a/packages/fiori/src/i18n/messagebundle.properties +++ b/packages/fiori/src/i18n/messagebundle.properties @@ -1,6 +1,9 @@ #This is the resource bundle for the UI5 Web Components #__ldi.translation.uuid=95d47730-48a4-4d6d-92f6-61f8c9d8f274 +#XTXT: Text for the 'ShowMore' link of the NotificationListItem +NOTIFICATIONLISTITEM_SHOW_MORE=Show More + #XBUT: Button text for cancel button in the UploadCollectionItem UPLOADCOLLECTIONITEM_CANCELBUTTON_TEXT=Cancel diff --git a/packages/fiori/src/themes/NotifactionListItemPopover.css b/packages/fiori/src/themes/NotifactionListItemPopover.css new file mode 100644 index 000000000000..18d90838602c --- /dev/null +++ b/packages/fiori/src/themes/NotifactionListItemPopover.css @@ -0,0 +1,12 @@ +.ui5-nli-overflow-list { + display: flex; + flex-direction: column; + padding: 0 0.5rem; +} + +.ui5-nli-overflow-content { + display: flex; + align-items: center; + height: var(--_ui5_tc_item_text); + pointer-events: none; +} \ No newline at end of file diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css new file mode 100644 index 000000000000..6ab221d278b4 --- /dev/null +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -0,0 +1,176 @@ +:host(:not([hidden])) { + display: block; + width: 100%; + min-height: var(--_ui5_list_item_base_height); + background: var(--ui5-listitem-background-color); +} + +:host([has-border]) { + border-bottom: var(--ui5-listitem-border-bottom); +} + +:host([focused]) .ui5-nli-root { + outline: none; +} + +:host([focused]) .ui5-nli-root:after { + content: ""; + border: var(--_ui5_listitembase_focus_width) dotted var(--sapContent_FocusColor); + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} + +:host([truncate]) .ui5-nli-title { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +:host([truncate]) .ui5-nli-description { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +:host([no-truncation]) .ui5-nli-title { + -webkit-line-clamp: unset; +} + +:host([no-truncation]) .ui5-nli-description { + -webkit-line-clamp: unset; +} + + +/* IE */ +:host([truncate]) .ui5-nli-content--ie .ui5-nli-description { + max-height: 32px; +} + +:host([truncate]) .ui5-nli-content--ie .ui5-nli-title { + max-height: 32px; +} + +:host([no-truncation]) .ui5-nli-content--ie .ui5-nli-title { + max-height: inherit; +} + +:host([no-truncation]) .ui5-nli-content--ie .ui5-nli-description { + max-height: inherit; +} +/* End */ + +.ui5-nli-root { + display: flex; + position: relative; + width: 100%; + padding: 1rem 0.5rem 1rem 1rem; + box-sizing: border-box; + cursor: pointer; +} + +.ui5-nli-content { + display: flex; + flex-direction: column; + width: 100%; + padding: 0 1rem 0 0.75rem; + font-family: var(--sapFontFamily); + box-sizing: border-box; +} + +.ui5-nli-heading { + display: flex; + margin-bottom: 0.25rem; + color: var(--sapGroup_TitleTextColor); + font-weight: bold; + font-size: var(--sapFontHeader6Size); + box-sizing: border-box; +} + +.ui5-nli-description { + display: flex; + margin-top: 0.5rem; + color: var(--sapTextColor); + font-size: var(--sapFontSize); + box-sizing: border-box; + box-sizing: border-box; +} + +/* Footer */ +.ui5-nli-footer { + display: flex; + color: var(--sapContent_LabelColor); + font-size: var(--sapFontSize); + padding-top: 0.5rem; + box-sizing: border-box; + flex-wrap: wrap; +} + +.ui5-nli-footer-divider { + position: relative; + align-items: center; + + /* implement rtl */ + margin-left: 0.5rem; + margin-right: 0.625rem; +} + +.ui5-nli-footer-divider::after { + position: absolute; + content: "."; + top: -20%; +} + +.ui5-nli-footer-showMore { + /* implement rtl */ + margin-left: 1rem; +} + +::slotted([slot^="footnotes"]) { + color: var(--sapContent_LabelColor); + font-size: var(--sapFontSize); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* Priority icon */ +.ui5-nli-prio-icon { + min-width: 1rem; + min-height: 1rem; + + /* implement rtl */ + padding-right: 0.5rem; +} + +.ui5-nli-prio-icon--message-error { + color: var(--sapNegativeElementColor); +} + +.ui5-nli-prio-icon--message-warning { + color: var(--sapCriticalElementColor); +} + +.ui5-nli-prio-icon--message-success { + color: var(--sapPositiveElementColor); +} + +/* Actions */ +.ui5-nli-actions { + display: flex; +} + +.ui5-nli-action { + /* implement rtl */ + margin-right: 0.5rem; +} + +.ui5-nli-overflow-btn { + /* implement rtl */ + margin-right: 0.5rem; +} \ No newline at end of file diff --git a/packages/fiori/src/types/Priority.js b/packages/fiori/src/types/Priority.js new file mode 100644 index 000000000000..2eed4c377e62 --- /dev/null +++ b/packages/fiori/src/types/Priority.js @@ -0,0 +1,55 @@ +import DataType from "@ui5/webcomponents-base/dist/types/DataType.js"; + +/** + * Different types of Priority. + * @lends sap.ui.webcomponents.main.types.Priority.prototype + * @public + */ +const Priorities = { + /** + * High priority. + * @public + * @type {High} + */ + High: "High", + + /** + * Medium priority. + * @public + * @type {Medium} + */ + Medium: "Medium", + + /** + * Low priority. + * @public + * @type {Low} + */ + Low: "Low", + + /** + * Default, none priority. + * @public + * @type {None} + */ + None: "None", +}; + +/** + * @class + * Different types of Priority. + * @constructor + * @author SAP SE + * @alias sap.ui.webcomponents.main.types.Priority + * @public + * @enum {string} + */ +class Priority extends DataType { + static isValid(value) { + return !!Priorities[value]; + } +} + +Priority.generataTypeAcessors(Priorities); + +export default Priority; diff --git a/packages/fiori/test/pages/NotificationList.html b/packages/fiori/test/pages/NotificationList.html new file mode 100644 index 000000000000..452fbb569558 --- /dev/null +++ b/packages/fiori/test/pages/NotificationList.html @@ -0,0 +1,185 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>NotificationList</title> + + <script src="../../webcomponentsjs/webcomponents-loader.js"></script> + <script src="../../resources/bundle.esm.js" type="module"></script> + <script nomodule src="../../resources/bundle.es5.js"></script> + + <script>delete Document.prototype.adoptedStyleSheets;</script> +</head> + +<body style="background-color: var(--sapBackgroundColor);"> + + <button>dsadas</button> + <div style="display: flex; flex-direction: column;"> + <ui5-label>click event:</ui5-label> + + <ui5-input id="clickInput"> + </ui5-input> + </div> + + <br/> + + <div style="display: flex; flex-direction: column;"> + <ui5-label>close event:</ui5-label> + + <ui5-input id="closeInput"> + </ui5-input> + </div> + + <ui5-list id="notificationList" header-text="Notifications heading and content 'truncates'"> + + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="./img/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + <span slot="footnotes">Other stuff</span> + + <ui5-notification-overflow-action id="acceptBtn" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action id="rejectBtn" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action id="acceptBtn2" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + truncate> + Short description + <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Patricia Clarck</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification heading="New order (#2523)" truncate> + <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> + + <span slot="footnotes">John SMith</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-list> + + <br><br> + + + <ui5-list id="notificationList2" header-text="Notifications heading and content 'wraps'"> + + <ui5-li-notification + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="./img/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + <span slot="footnotes">Other stuff</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-li-notification + heading="New order (#2522)" + priority="Low" + > + And short description + <ui5-avatar initials="PS" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">John Doe</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-li-notification heading="New order (#2523)"> + <div>With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> + + <span slot="footnotes">John SMith</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + </ui5-list> + + + <ui5-toast id="wcToastBS" duration="2000"></ui5-toast> + + <script> + notificationList.addEventListener("itemClick", function(event) { + clickInput.value = event.detail.item.heading; + }); + + notificationList.addEventListener("itemClose", function(event) { + closeInput.value = event.detail.item.heading; + + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + + notificationList2.addEventListener("itemClick", function(event) { + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + + notificationList2.addEventListener("itemClose", function(event) { + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + + acceptBtn.addEventListener("click", function(event) { + wcToastBS.textContent = "Accept btn clicked"; + wcToastBS.show(); + + console.log("Accept btn clicked"); + }); + + acceptBtn2.addEventListener("click", function(event) { + wcToastBS.textContent = "Accept2 btn clicked"; + wcToastBS.show(); + + console.log("Accept2 btn clicked"); + }); + + rejectBtn.addEventListener("click", function(event) { + wcToastBS.textContent = "Reject btn clicked"; + wcToastBS.show(); + + console.log("Reject btn clicked"); + }); + </script> +</body> +</html> diff --git a/packages/fiori/test/pages/img/man_avatar_1.png b/packages/fiori/test/pages/img/man_avatar_1.png new file mode 100644 index 0000000000000000000000000000000000000000..55b581163771c43b6aba08df1b5ca4c7ae6ca40f GIT binary patch literal 118473 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 KMNUMnLSTZSsD0D` literal 0 HcmV?d00001 diff --git a/packages/main/src/List.js b/packages/main/src/List.js index 0c1af807b236..47c640db3f7c 100644 --- a/packages/main/src/List.js +++ b/packages/main/src/List.js @@ -179,6 +179,22 @@ const metadata = { }, }, + /** + * Fired when the Close button of any item is clicked + * <br><br> + * <b>Note:</b> This event is applicable to NotificationListItem only, + * to not be confused with <code>itemDelete</code>. + * @event + * @param {HTMLElement} item the item about to be closed. + * @public + * @since 1.0.0-rc.8 + */ + itemClose: { + detail: { + item: { type: HTMLElement }, + }, + }, + /** * Fired when the Delete button of any item is pressed. * <br><br> @@ -293,6 +309,7 @@ class List extends UI5Element { this._previouslySelectedItem = null; this.addEventListener("ui5-_press", this.onItemPress.bind(this)); + this.addEventListener("ui5-_close", this.onItemClose.bind(this)); this.addEventListener("ui5-_focused", this.onItemFocused.bind(this)); this.addEventListener("ui5-_forwardAfter", this.onForwardAfter.bind(this)); this.addEventListener("ui5-_forwardBefore", this.onForwardBefore.bind(this)); @@ -538,6 +555,11 @@ class List extends UI5Element { this._selectionRequested = false; } + // This is applicable to NoficationListItem + onItemClose(event) { + this.fireEvent("itemClose", { item: event.detail.item }); + } + onForwardBefore(event) { this.setPreviouslyFocusedItem(event.target); this.focusBeforeElement(); diff --git a/packages/main/src/themes/List.css b/packages/main/src/themes/List.css index 3bd63689881a..7e6e8b3e4dea 100644 --- a/packages/main/src/themes/List.css +++ b/packages/main/src/themes/List.css @@ -1,6 +1,7 @@ :host(:not([hidden])) { display: block; max-width: 100%; + width: 100%; } :host([inset]) .ui5-list-root { From d9acfeed0d52e036b2bb5dc9cc2ed7718232a78e Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 15:27:40 +0300 Subject: [PATCH 02/22] add more samples and JS docs --- packages/fiori/src/NotificationListItem.js | 44 +-- .../fiori/src/NotificationOverflowAction.js | 2 +- .../fiori/test/pages/NotificationList.html | 106 +++++- .../samples/NotificationListItem.sample.html | 308 ++++++++++++++++++ packages/playground/Gemfile.lock | 2 +- 5 files changed, 437 insertions(+), 25 deletions(-) create mode 100644 packages/fiori/test/samples/NotificationListItem.sample.html diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index e34cc75bb49a..286876163487 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -42,9 +42,9 @@ const metadata = { managedSlots: true, properties: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { /** - * Defines the heading. + * Defines the <code>heading</code>. * @type {string} - * @defaultvalue: "" + * @defaultvalue "" * @public */ heading: { @@ -52,9 +52,9 @@ const metadata = { }, /** - * Defines the priority of the notification. + * Defines the <code>priority</code> of the notification. * @type {Priority} - * @defaultvalue: "None" + * @defaultvalue "None" * @public */ priority: { @@ -74,7 +74,7 @@ const metadata = { /** * Defines if the <code>heading</code> and <code>decription</code> should truncate, - * they would wrap by default. + * otherwise they would wrap by default. * @type {boolean} * @defaultvalue false * @public @@ -103,8 +103,8 @@ const metadata = { /** * Defines the actions, displayed in the <code>ui5-li-notification</code>. - * - * <b>Note:</b> Consider using the <code>ui5-notification-action</code>. + * <br><br> + * <b>Note:</b> Consider using the <code>ui5-notification-overflow-action</code>. * * @type {HTMLElement} * @slot @@ -119,7 +119,7 @@ const metadata = { * Defines the avatar, displayed in the <code>ui5-li-notification</code>. * * <br><br> - * <b>Note:</b> Consider using the <code>ui5-avatar</code> to dipslay icons, initials or images. + * <b>Note:</b> Consider using the <code>ui5-avatar</code> to display icons, initials or images. * * @type {HTMLElement} * @slot @@ -130,9 +130,7 @@ const metadata = { }, /** - * Defines the elements dipalyed in the footer of the of the <code>ui5-li-notification</code>. - * - * + * Defines the elements, dipalyed in the footer of the of the <code>ui5-li-notification</code>. * @type {HTMLElement[]} * @slot * @public @@ -144,7 +142,8 @@ const metadata = { }, /** - * Defines the description of the <code>ui5-li-notification</code>. + * Defines the content of the <code>ui5-li-notification</code>, + * usually a description of the notification. * * <br><br> * <b>Note:</b> Аlthough this slot accepts HTML Elements, it is strongly recommended that you only use text in order to preserve the intended design. @@ -169,21 +168,23 @@ const metadata = { * * <h3 class="comment-api-title">Overview</h3> * The <code>ui5-li-notification</code> is a type of list item, meant to dispaly notifcatations. - * The component has a rich set of various properties that allows the user to set an <code>avatar, <code>heading, descriptive <code>content</code> - * and <code>footnotes</code> that appear at the bottom of the notifcation. + * <br> * - * The user can optionally display a <code>close</code> button. - * The user can control whether the <code>heading</code> and <code>description</code> should wrap or truncate - * and display a <code>ShomeMore</code> button to switch between less and more information. + * The component has a rich set of various properties that allows the user to set <code>avatar</code>, <code>heading</code>, descriptive <code>content</code> + * and <code>footnotes</code> to fully describe a notifcation. + * <br> * - * The user can also add custom actions by using the <code>ui5-notification-overflow-action</code>. - * When it is a single action, it would appear nex to the heading and - * but there are multiple actions, they would be displayed within a popover, that can be opened by an <code>overflow</code> button. + * The user can: + * <ul> + * <li>display a <code>Close</code> button</code></li> + * <li>can control whether the <code>heading</code> and <code>description</code> should wrap or truncate + * and display a <code>ShomeMore</code> button to switch between less and more information</code></li> + * <li>add custom actions by using the <code>ui5-notification-overflow-action</code></code> component</li> + * </ul> * * <h3>Usage</h3> * The component can be used in a standard <code>ui5-list</code>. * - * For the <code>ui5-li-notification</code> * <h3>ES6 Module Import</h3> * * <code>import @ui5/webcomponents/dist/NotificationListItem.js";</code> @@ -194,6 +195,7 @@ const metadata = { * @extends UI5Element * @tagname ui5-li-notification * @appenddocs NotificationOverflowAction + * @since 1.0.0-rc.8 * @public */ class NotificationListItem extends ListItemBase { diff --git a/packages/fiori/src/NotificationOverflowAction.js b/packages/fiori/src/NotificationOverflowAction.js index 4515f4cdd1ae..397573547d9b 100644 --- a/packages/fiori/src/NotificationOverflowAction.js +++ b/packages/fiori/src/NotificationOverflowAction.js @@ -41,7 +41,7 @@ const metadata = { /** * @class * The <code>ui5-notification-overflow-action</code> represents an astract action, - * used in the <code>ui5-li-notication</code>. + * used in the <code>ui5-li-notification</code>. * * @constructor * @author SAP SE diff --git a/packages/fiori/test/pages/NotificationList.html b/packages/fiori/test/pages/NotificationList.html index 452fbb569558..f0490b022c95 100644 --- a/packages/fiori/test/pages/NotificationList.html +++ b/packages/fiori/test/pages/NotificationList.html @@ -4,7 +4,7 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> - <title>NotificationList</title> + <title>NotificationListItem</title> <script src="../../webcomponentsjs/webcomponents-loader.js"></script> <script src="../../resources/bundle.esm.js" type="module"></script> @@ -15,7 +15,13 @@ <body style="background-color: var(--sapBackgroundColor);"> - <button>dsadas</button> + <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> + </ui5-shellbar> + + <div style="display: flex; justify-content: flex-end; padding: 0.25rem; border-bottom: 1px solid grey"> + <ui5-button id="openNotifications" design="Transparent" icon="bell"></ui5-button> + </div> + <div style="display: flex; flex-direction: column;"> <ui5-label>click event:</ui5-label> @@ -138,6 +144,67 @@ <ui5-toast id="wcToastBS" duration="2000"></ui5-toast> + <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> + <ui5-list id="notificationListTop" header-text="Notifications heading and content 'truncates'"> + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="./img/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + <span slot="footnotes">Other stuff</span> + + <ui5-notification-overflow-action id="acceptBtnInPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action id="rejectBtnInPopover" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action id="acceptBtn2InPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + truncate> + Short description + <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Patricia Clarck</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification heading="New order (#2523)" truncate> + <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> + + <span slot="footnotes">John SMith</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-list> + </ui5-popover> + + <div style="display: flex; justify-content: flex-end; padding: 0.25rem; border-bottom: 1px solid grey;"> + <ui5-button id="openNotifications2" design="Transparent" icon="bell"></ui5-button> + </div> + <script> notificationList.addEventListener("itemClick", function(event) { clickInput.value = event.detail.item.heading; @@ -160,6 +227,16 @@ wcToastBS.show(); }); + notificationListTop.addEventListener("itemClick", function(event) { + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + + notificationListTop.addEventListener("itemClose", function(event) { + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + acceptBtn.addEventListener("click", function(event) { wcToastBS.textContent = "Accept btn clicked"; wcToastBS.show(); @@ -174,12 +251,37 @@ console.log("Accept2 btn clicked"); }); + acceptBtnInPopover.addEventListener("click", function(event) { + wcToastBS.textContent = "Accept btn In popover btn clicked"; + wcToastBS.show(); + + console.log("acceptBtnInPopover btn clicked"); + }); + rejectBtn.addEventListener("click", function(event) { wcToastBS.textContent = "Reject btn clicked"; wcToastBS.show(); console.log("Reject btn clicked"); }); + + rejectBtnInPopover.addEventListener("click", function(event) { + wcToastBS.textContent = "Reject btn In popover btn clicked"; + wcToastBS.show(); + + console.log("rejectBtnInPopover btn clicked"); + }); + + openNotifications.addEventListener("click", function(event) { + notificationsPopover.openBy(openNotifications); + }); + openNotifications2.addEventListener("click", function(event) { + notificationsPopover.openBy(openNotifications2); + }); + + shellbar.addEventListener("ui5-notificationsClick", function(event) { + notificationsPopover.openBy(event.detail.targetRef); + }); </script> </body> </html> diff --git a/packages/fiori/test/samples/NotificationListItem.sample.html b/packages/fiori/test/samples/NotificationListItem.sample.html new file mode 100644 index 000000000000..ce88f77bd3ae --- /dev/null +++ b/packages/fiori/test/samples/NotificationListItem.sample.html @@ -0,0 +1,308 @@ +<header class="component-heading"> + <h2 class="control-header">NotificationListItem</h2> + <div class="component-heading-since"> + <span><!--since_tag_marker--></span> + </div> +</header> + +<div class="component-package">@ui5/webcomponents-fiori</div> + +<div class="control-tag"><ui5-list></div> + +<!--Basic --> +<section> + <h3>NotificationListItem</h3> + <div class="snippet"> + <ui5-list id="myList" class="full-width" header-text="Notifications"> + <ui5-li-notification + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/woman_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Monique Legrand</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Alain Chevalier</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2525) With a short title" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/man_avatar_2.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + </ui5-list> + + <script> + myList.addEventListener("itemClose", function(e) { + e.detail.item.hidden = true; + }); + </script> + </div> + <pre class="prettyprint lang-html"><xmp> +<ui5-list header-text="Notifications"> + <ui5-li-notification + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/woman_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Monique Legrand</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Alain Chevalier</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + ... +</ui5-list> + +<script> + myList.addEventListener("itemClose", e => { + e.detail.item.hidden = true; + }); +</script> + </xmp></pre> +</section> + +<section> + <h3>NotificationListItem - Show "more/less"</h3> + <div class="snippet"> + <ui5-list id="myList2" class="full-width" header-text="Notifications"> + <ui5-li-notification + truncate + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + <ui5-avatar initials="ML" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Monique Legrand</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + <ui5-li-notification + truncate + show-close + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + <ui5-avatar initials="AC" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Alain Chevalier</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + <ui5-avatar initials="JD" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + </ui5-list> + </div> + <pre class="prettyprint lang-html"><xmp> +<ui5-list header-text="Notifications"> + <ui5-li-notification + truncate + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + <ui5-avatar initials="ML" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Monique Legrand</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + ... +</ui5-list> + </xmp></pre> +</section> + +<section> + <h3>NotificationListItem - Custom Actions</h3> + <div class="snippet"> + <ui5-list id="myList3" class="full-width" header-text="Notifications"> + <ui5-li-notification + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/woman_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Monique Legrand</span> + <span slot="footnotes">2 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Alain Chevalier</span> + <span slot="footnotes">2 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2525) With a short title" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/man_avatar_2.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-list> + </div> + <pre class="prettyprint lang-html"><xmp> +<ui5-list header-text="Notifications"> + <ui5-li-notification + show-close + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="../../../assets/images/avatars/woman_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">Monique Legrand</span> + <span slot="footnotes">2 Days</span> + </ui5-li-notification> + + ... +</ui5-list> + </xmp></pre> +</section> + +<section> + <h3>NotificationListItem In ShellBar</h3> + <div class="snippet"> + <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> + </ui5-shellbar> + + <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> + <ui5-list id="notificationListTop" header-text="Notifications"> + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar initials="JD" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + + <ui5-notification-overflow-action id="acceptBtnInPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action id="rejectBtnInPopover" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action id="acceptBtn2InPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + truncate> + Short description + <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Patricia Clarck</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification heading="New order (#2523)" truncate> + <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> + + <span slot="footnotes">John SMith</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-list> + </ui5-popover> + + <script> + shellbar.addEventListener("ui5-notificationsClick", function(event) { + notificationsPopover.openBy(event.detail.targetRef); + }); + </script> + </div> + <pre class="prettyprint lang-html"><xmp> +<ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> +</ui5-shellbar> + +<ui5-popover + id="notificationsPopover" + style="max-width: 400px" + placement-type="Bottom" + horizontal-align="Right" +> + <ui5-list header-text="Notifications"> + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="./img/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + + <ui5-notification-overflow-action id="acceptBtnInPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action id="rejectBtnInPopover" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + ... + </ui5-list> +</ui5-popover> + +<script> + shellbar.addEventListener("ui5-notificationsClick", function(event) { + notificationsPopover.openBy(event.detail.targetRef); + }); +</script> + + </xmp></pre> +</section> + + +<!-- JSDoc marker --> diff --git a/packages/playground/Gemfile.lock b/packages/playground/Gemfile.lock index 1b17ecf7bc25..573e96a73604 100644 --- a/packages/playground/Gemfile.lock +++ b/packages/playground/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - UI5-Web-Components-Playground (1.0.0.pre.rc.6) + UI5-Web-Components-Playground (1.0.0.pre.rc.7) jekyll (~> 3.8.5) jekyll-seo-tag (~> 2.0) rake (~> 12.3.1) From 522f57f4451d9f9d65f6c315656b7cd842e7e4d4 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 15:31:05 +0300 Subject: [PATCH 03/22] address some of the comments --- packages/fiori/src/NotificationListItem.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 286876163487..b68ee58db04b 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -14,6 +14,7 @@ import "@ui5/webcomponents-icons/dist/icons/decline.js"; import "@ui5/webcomponents-icons/dist/icons/message-success.js"; import "@ui5/webcomponents-icons/dist/icons/message-error.js"; import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; +import "@ui5/webcomponents-icons/dist/icons/overflow.js"; // text import { NOTIFICATIONLISTITEM_SHOW_MORE } from "./generated/i18n/i18n-defaults.js"; @@ -112,7 +113,6 @@ const metadata = { */ actions: { type: HTMLElement, - propertyName: "actions", }, /** @@ -353,7 +353,7 @@ class NotificationListItem extends ListItemBase { return []; } - return this.clonedActions; + return this.actionsInfo; } get standardActions() { @@ -361,10 +361,10 @@ class NotificationListItem extends ListItemBase { return []; } - return this.clonedActions; + return this.actionsInfo; } - get clonedActions() { + get actionsInfo() { return this.actions.map(action => { return { icon: action.icon, From eb41507190fa066793b27f9f8b0ee7fa28733a05 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 17:11:23 +0300 Subject: [PATCH 04/22] address more comments --- packages/fiori/src/NotificationListItem.js | 10 ++++---- .../fiori/test/pages/NotificationList.html | 23 +++++++++++++------ .../{fiori => main}/src/types/Priority.js | 0 3 files changed, 22 insertions(+), 11 deletions(-) rename packages/{fiori => main}/src/types/Priority.js (100%) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index b68ee58db04b..7bca23169dd1 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -7,7 +7,7 @@ import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; -import Priority from "./types/Priority.js"; +import Priority from "@ui5/webcomponents/dist/types/Priority.js"; // icons import "@ui5/webcomponents-icons/dist/icons/decline.js"; @@ -439,9 +439,11 @@ class NotificationListItem extends ListItemBase { return; } - if (this._showMorePressed - && (this.headingHeight > this._headingOverflowHeight - || this.descriptionHeight > this._descOverflowHeight)) { + const headingWouldOverflow = this.headingHeight > this._headingOverflowHeight; + const descWouldOverflow = this.descriptionHeight > this._descOverflowHeight; + const overflows = headingWouldOverflow || descWouldOverflow; + + if (this._showMorePressed && overflows) { this.showMore = true; return; } diff --git a/packages/fiori/test/pages/NotificationList.html b/packages/fiori/test/pages/NotificationList.html index f0490b022c95..c1dbfae2d710 100644 --- a/packages/fiori/test/pages/NotificationList.html +++ b/packages/fiori/test/pages/NotificationList.html @@ -18,9 +18,7 @@ <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> </ui5-shellbar> - <div style="display: flex; justify-content: flex-end; padding: 0.25rem; border-bottom: 1px solid grey"> - <ui5-button id="openNotifications" design="Transparent" icon="bell"></ui5-button> - </div> + <br/><br/> <div style="display: flex; flex-direction: column;"> <ui5-label>click event:</ui5-label> @@ -38,6 +36,20 @@ </ui5-input> </div> + <h3>Properties</h3> + <ul> + <li>heading</li> + <li>truncate</li> + <li>show-close</li> + </ul> + + <h3>Slots</h3> + <ul> + <li>avatar</li> + <li>actions</li> + <li>footnotes</li> + </ul> + <ui5-list id="notificationList" header-text="Notifications heading and content 'truncates'"> <ui5-li-notification @@ -202,7 +214,7 @@ </ui5-popover> <div style="display: flex; justify-content: flex-end; padding: 0.25rem; border-bottom: 1px solid grey;"> - <ui5-button id="openNotifications2" design="Transparent" icon="bell"></ui5-button> + <ui5-button id="openNotifications" design="Transparent" icon="bell"></ui5-button> </div> <script> @@ -275,9 +287,6 @@ openNotifications.addEventListener("click", function(event) { notificationsPopover.openBy(openNotifications); }); - openNotifications2.addEventListener("click", function(event) { - notificationsPopover.openBy(openNotifications2); - }); shellbar.addEventListener("ui5-notificationsClick", function(event) { notificationsPopover.openBy(event.detail.targetRef); diff --git a/packages/fiori/src/types/Priority.js b/packages/main/src/types/Priority.js similarity index 100% rename from packages/fiori/src/types/Priority.js rename to packages/main/src/types/Priority.js From 28d1c050f6f1106b426c6e2482305423ef7352d3 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 17:52:56 +0300 Subject: [PATCH 05/22] make public/private props less confusing --- packages/fiori/src/NotificationListItem.js | 23 +++++++++---------- .../fiori/src/themes/NotificationListItem.css | 8 +++---- .../fiori/test/pages/NotificationList.html | 11 +-------- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 7bca23169dd1..221fcfdfc72a 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -85,10 +85,11 @@ const metadata = { }, /** - * Defines the truncation of the <code>heading</code> and <code>decription</code>. + * Defines the state of the <code>heading</code> and <code>decription</code>, + * if less or more information is displayed. * @private */ - noTruncation: { + _showMorePressed: { type: Boolean, }, @@ -96,7 +97,7 @@ const metadata = { * Defines the visibility of the <code>showMore</code> button. * @private */ - showMore: { + _showMore: { type: Boolean, }, }, @@ -202,16 +203,15 @@ class NotificationListItem extends ListItemBase { constructor() { super(); - // indicates if the showMore has been pressed - this._showMorePressed = false; - // the heading overflow height this._headingOverflowHeight = 0; // the description overflow height this._descOverflowHeight = 0; + // the resize handler this.onResizeBind = this.onResize.bind(this); + this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); } @@ -289,7 +289,7 @@ class NotificationListItem extends ListItemBase { } get hideShowMore() { - if (this.truncate && this.showMore) { + if (this.truncate && this._showMore) { return undefined; } @@ -397,7 +397,6 @@ class NotificationListItem extends ListItemBase { _onShowMoreClick() { this._showMorePressed = !this._showMorePressed; - this.noTruncation = !this.noTruncation; } _onBtnCloseClick() { @@ -435,7 +434,7 @@ class NotificationListItem extends ListItemBase { onResize() { if (!this.truncate) { - this.showMore = false; + this._showMore = false; return; } @@ -444,18 +443,18 @@ class NotificationListItem extends ListItemBase { const overflows = headingWouldOverflow || descWouldOverflow; if (this._showMorePressed && overflows) { - this.showMore = true; + this._showMore = true; return; } if (this.headingOverflows || this.descriptionOverflows) { this._headingOverflowHeight = this.headingHeight; this._descOverflowHeight = this.descriptionHeight; - this.showMore = true; + this._showMore = true; return; } - this.showMore = false; + this._showMore = false; } _onCustomActionPress(event) { diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index 6ab221d278b4..bd051a89cc93 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -38,11 +38,11 @@ overflow: hidden; } -:host([no-truncation]) .ui5-nli-title { +:host([_show-more-pressed]) .ui5-nli-title { -webkit-line-clamp: unset; } -:host([no-truncation]) .ui5-nli-description { +:host([_show-more-pressed]) .ui5-nli-description { -webkit-line-clamp: unset; } @@ -56,11 +56,11 @@ max-height: 32px; } -:host([no-truncation]) .ui5-nli-content--ie .ui5-nli-title { +:host([_show-more-pressed]) .ui5-nli-content--ie .ui5-nli-title { max-height: inherit; } -:host([no-truncation]) .ui5-nli-content--ie .ui5-nli-description { +:host([_show-more-pressed]) .ui5-nli-content--ie .ui5-nli-description { max-height: inherit; } /* End */ diff --git a/packages/fiori/test/pages/NotificationList.html b/packages/fiori/test/pages/NotificationList.html index c1dbfae2d710..c313779f4a6b 100644 --- a/packages/fiori/test/pages/NotificationList.html +++ b/packages/fiori/test/pages/NotificationList.html @@ -40,6 +40,7 @@ <h3>Properties</h3> <ul> <li>heading</li> <li>truncate</li> + <li>priority</li> <li>show-close</li> </ul> @@ -239,16 +240,6 @@ <h3>Slots</h3> wcToastBS.show(); }); - notificationListTop.addEventListener("itemClick", function(event) { - wcToastBS.textContent = event.detail.item.heading; - wcToastBS.show(); - }); - - notificationListTop.addEventListener("itemClose", function(event) { - wcToastBS.textContent = event.detail.item.heading; - wcToastBS.show(); - }); - acceptBtn.addEventListener("click", function(event) { wcToastBS.textContent = "Accept btn clicked"; wcToastBS.show(); From 5afb3d90b870cec218ad6593991c43f48df7669c Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 17:59:20 +0300 Subject: [PATCH 06/22] add RTL support --- packages/fiori/src/NotificationListItem.hbs | 1 + packages/fiori/src/NotificationListItem.js | 5 ++++ .../fiori/src/themes/NotificationListItem.css | 30 ++++++++++++++----- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index 8251b039eba7..edc288de3531 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -7,6 +7,7 @@ @click="{{_onclick}}" role="option" tabindex="{{_tabIndex}}" + dir="{{rtl}}" > <div class="ui5-nli-avatar"> diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 221fcfdfc72a..ae27ae40ea47 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -3,6 +3,7 @@ import { isSpace, isEnter } from "@ui5/webcomponents-base/dist/Keys.js"; import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js"; import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; +import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; import Button from "@ui5/webcomponents/dist/Button.js"; @@ -375,6 +376,10 @@ class NotificationListItem extends ListItemBase { }); } + get rtl() { + return getRTL() ? "rtl" : undefined; + } + get classes() { return { content: { diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index bd051a89cc93..03ca103bf15d 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -114,8 +114,6 @@ .ui5-nli-footer-divider { position: relative; align-items: center; - - /* implement rtl */ margin-left: 0.5rem; margin-right: 0.625rem; } @@ -127,7 +125,6 @@ } .ui5-nli-footer-showMore { - /* implement rtl */ margin-left: 1rem; } @@ -143,8 +140,6 @@ .ui5-nli-prio-icon { min-width: 1rem; min-height: 1rem; - - /* implement rtl */ padding-right: 0.5rem; } @@ -166,11 +161,32 @@ } .ui5-nli-action { - /* implement rtl */ margin-right: 0.5rem; } .ui5-nli-overflow-btn { - /* implement rtl */ margin-right: 0.5rem; +} + +/* RTL */ + +[dir="rtl"] .ui5-nli-footer-divider { + margin-right: 0.5rem; + margin-left: 0.625rem; +} + +[dir="rtl"] .ui5-nli-footer-showMore { + margin-right: 1rem; +} + +[dir="rtl"] .ui5-nli-prio-icon { + padding-right: 0.5rem; +} + +[dir="rtl"] .ui5-nli-action { + margin-left: 0.5rem; +} + +[dir="rtl"] .ui5-nli-overflow-btn { + margin-left: 0.5rem; } \ No newline at end of file From 1b1692409bf3f178e8e37446e2f0b244917d344f Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 22:38:42 +0300 Subject: [PATCH 07/22] fix IE bugs with Avatar initials and cut off actions --- packages/fiori/src/themes/NotificationListItem.css | 1 + packages/fiori/test/pages/NotificationList.html | 2 +- packages/main/src/themes/Avatar.css | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index 03ca103bf15d..7807d485ee10 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -77,6 +77,7 @@ .ui5-nli-content { display: flex; flex-direction: column; + flex: 1; width: 100%; padding: 0 1rem 0 0.75rem; font-family: var(--sapFontFamily); diff --git a/packages/fiori/test/pages/NotificationList.html b/packages/fiori/test/pages/NotificationList.html index c313779f4a6b..92c3c5c4dbc1 100644 --- a/packages/fiori/test/pages/NotificationList.html +++ b/packages/fiori/test/pages/NotificationList.html @@ -98,7 +98,7 @@ <h3>Slots</h3> </ui5-li-notification> <ui5-li-notification heading="New order (#2523)" truncate> - <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> + <div>And with a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> <span slot="footnotes">John SMith</span> <span slot="footnotes">3 Days</span> diff --git a/packages/main/src/themes/Avatar.css b/packages/main/src/themes/Avatar.css index 242b8ce666f5..fd8b9d72d988 100644 --- a/packages/main/src/themes/Avatar.css +++ b/packages/main/src/themes/Avatar.css @@ -167,6 +167,5 @@ } .ui5-avatar-initials { - position: absolute; color: inherit; } \ No newline at end of file From a981576eb1f2e9060f43ceb9faed75fc6614bb28 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 5 May 2020 23:20:29 +0300 Subject: [PATCH 08/22] add ACC support --- packages/fiori/src/NotificationListItem.hbs | 76 +++++++++++-------- packages/fiori/src/NotificationListItem.js | 20 ++++- .../fiori/src/i18n/messagebundle.properties | 8 +- .../src/themes/NotifactionListItemPopover.css | 7 -- .../fiori/src/themes/NotificationListItem.css | 2 + packages/main/src/Button.js | 3 +- packages/main/src/ListItemBase.js | 4 + packages/main/test/pages/List.html | 2 +- 8 files changed, 76 insertions(+), 46 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index edc288de3531..58db8764b19a 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -8,10 +8,41 @@ role="option" tabindex="{{_tabIndex}}" dir="{{rtl}}" + aria-labelledby="{{_id}}-heading {{_id}}-description {{_id}}-footer" > + {{!-- render the actions first in order to be first in the tab chain as well--}} + <div class="ui5-nli-actions"> + {{#unless showOverflow}} + {{#each standardActions}} + <ui5-button + icon="{{this.icon}}" + class="ui5-nli-action" + @click="{{this.press}}" + data-ui5-external-action-item-id="{{this.refItemid}}" + > + {{this.text}} + </ui5-button> + {{/each}} + {{/unless}} - <div class="ui5-nli-avatar"> - <slot name="avatar"></slot> + {{#if showOverflow}} + <ui5-button + icon="overflow" + design="Transparent" + @click="{{_onBtnOverflowClick}}" + class="ui5-nli-overflow-btn" + title="{{overflowBtnTitle}}" + ></ui5-button> + {{/if}} + + {{#if showClose}} + <ui5-button + icon="decline" + design="Transparent" + @click="{{_onBtnCloseClick}}" + title="{{closeBtnTitle}}" + ></ui5-button> + {{/if}} </div> <div class="ui5-nli-content {{classes.content}}"> @@ -23,18 +54,18 @@ </ui5-icon> {{/if}} - <div class="ui5-nli-title" part="heading"> + <div id="{{_id}}-heading" class="ui5-nli-title" part="heading"> {{heading}} </div> </div> {{#if hasDesc}} - <div class="ui5-nli-description"> + <div id="{{_id}}-description" class="ui5-nli-description"> <slot></slot> </div> {{/if}} - <div class="ui5-nli-footer"> + <div id="{{_id}}-footer" class="ui5-nli-footer"> {{#each footerItems}} <slot name="{{slotName}}"></slot> {{#if showDivider}} @@ -45,34 +76,15 @@ <ui5-link class="ui5-nli-footer-showMore" ?hidden="{{hideShowMore}}" - @click="{{_onShowMoreClick}}">{{showMoreText}}</ui5-link> + @click="{{_onShowMoreClick}}" + aria-hidden="true" + > + {{showMoreText}} + </ui5-link> </div> </div> - <div class="ui5-nli-actions"> - {{#unless showOverflow}} - {{#each standardActions}} - <ui5-button - icon="{{this.icon}}" - class="ui5-nli-action" - @click="{{this.press}}" - data-ui5-external-action-item-id="{{this.refItemid}}" - >{{this.text}} - </ui5-button> - {{/each}} - {{/unless}} - - {{#if showOverflow}} - <ui5-button - icon="overflow" - design="Transparent" - @click="{{_onBtnOverflowClick}}" - class="ui5-nli-overflow-btn"> - </ui5-button> - {{/if}} - - {{#if showClose}} - <ui5-button icon="decline" design="Transparent" @click="{{_onBtnCloseClick}}"></ui5-button> - {{/if}} + <div class="ui5-nli-avatar"> + <slot name="avatar"></slot> </div> -</li> \ No newline at end of file +</li> \ No newline at end of file diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index ae27ae40ea47..9a73dbc77fc8 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -10,17 +10,21 @@ import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; import Priority from "@ui5/webcomponents/dist/types/Priority.js"; -// icons +// Icons import "@ui5/webcomponents-icons/dist/icons/decline.js"; import "@ui5/webcomponents-icons/dist/icons/message-success.js"; import "@ui5/webcomponents-icons/dist/icons/message-error.js"; import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; import "@ui5/webcomponents-icons/dist/icons/overflow.js"; -// text -import { NOTIFICATIONLISTITEM_SHOW_MORE } from "./generated/i18n/i18n-defaults.js"; +// Texts +import { + NOTIFICATIONLISTITEM_SHOW_MORE, + NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE, + NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE, +} from "./generated/i18n/i18n-defaults.js"; -// Template +// Templates import NotificationListItemTemplate from "./generated/templates/NotificationListItemTemplate.lit.js"; import NotificationListItemPopoverTemplate from "./generated/templates/NotificationListItemPopoverTemplate.lit.js"; @@ -289,6 +293,14 @@ class NotificationListItem extends ListItemBase { return this.i18nBundle.getText(NOTIFICATIONLISTITEM_SHOW_MORE); } + get overflowBtnTitle() { + return this.i18nBundle.getText(NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE); + } + + get closeBtnTitle() { + return this.i18nBundle.getText(NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE); + } + get hideShowMore() { if (this.truncate && this._showMore) { return undefined; diff --git a/packages/fiori/src/i18n/messagebundle.properties b/packages/fiori/src/i18n/messagebundle.properties index 97f1074ea203..1dcf65093564 100644 --- a/packages/fiori/src/i18n/messagebundle.properties +++ b/packages/fiori/src/i18n/messagebundle.properties @@ -1,9 +1,15 @@ #This is the resource bundle for the UI5 Web Components #__ldi.translation.uuid=95d47730-48a4-4d6d-92f6-61f8c9d8f274 -#XTXT: Text for the 'ShowMore' link of the NotificationListItem +#XTXT: Text for the 'ShowMore' link in the NotificationListItem NOTIFICATIONLISTITEM_SHOW_MORE=Show More +#XBUT: Tooltip text for 'Overflow' button in the NotificationListItem +NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE=More + +#XBUT: Tooltip text for 'Close' button in the NotificationListItem +NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE=Close + #XBUT: Button text for cancel button in the UploadCollectionItem UPLOADCOLLECTIONITEM_CANCELBUTTON_TEXT=Cancel diff --git a/packages/fiori/src/themes/NotifactionListItemPopover.css b/packages/fiori/src/themes/NotifactionListItemPopover.css index 18d90838602c..6c1cbb347ef8 100644 --- a/packages/fiori/src/themes/NotifactionListItemPopover.css +++ b/packages/fiori/src/themes/NotifactionListItemPopover.css @@ -2,11 +2,4 @@ display: flex; flex-direction: column; padding: 0 0.5rem; -} - -.ui5-nli-overflow-content { - display: flex; - align-items: center; - height: var(--_ui5_tc_item_text); - pointer-events: none; } \ No newline at end of file diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index 7807d485ee10..7615510016c9 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -3,6 +3,7 @@ width: 100%; min-height: var(--_ui5_list_item_base_height); background: var(--ui5-listitem-background-color); + cursor: pointer; } :host([has-border]) { @@ -67,6 +68,7 @@ .ui5-nli-root { display: flex; + flex-direction: row-reverse; position: relative; width: 100%; padding: 1rem 0.5rem 1rem 1rem; diff --git a/packages/main/src/Button.js b/packages/main/src/Button.js index bf76a35219dd..a675f28c4f4b 100644 --- a/packages/main/src/Button.js +++ b/packages/main/src/Button.js @@ -320,7 +320,8 @@ class Button extends UI5Element { this.focused = false; } - _onfocusin() { + _onfocusin(event) { + event.isMarked = "button"; this.focused = true; } diff --git a/packages/main/src/ListItemBase.js b/packages/main/src/ListItemBase.js index 6901c1107aa2..62b7597393c6 100644 --- a/packages/main/src/ListItemBase.js +++ b/packages/main/src/ListItemBase.js @@ -71,6 +71,10 @@ class ListItemBase extends UI5Element { } _onfocusin(event) { + if (event.isMarked === "button") { + return; + } + this.focused = true; this.fireEvent("_focused", event); } diff --git a/packages/main/test/pages/List.html b/packages/main/test/pages/List.html index 6455ffdfeece..2cd05626ad8f 100644 --- a/packages/main/test/pages/List.html +++ b/packages/main/test/pages/List.html @@ -245,7 +245,7 @@ <h3 id="infoLbl">Items 3/3</h3> var getItems = function getItems(items) { return items.map(function (item) { return '<ui5-li id="' + item.id + '">' + item.textContent + '</ui5-li>'; - }).join(); + }).join(""); }; var cleanList = function cleanList() { From 54d6783ee99cf247eb6cbdd9ab00a794570234b8 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Wed, 6 May 2020 17:34:22 +0300 Subject: [PATCH 09/22] add NotificationListGroupItem --- packages/fiori/bundle.esm.js | 3 +- .../fiori/src/NotificationListGroupItem.hbs | 74 ++++ .../fiori/src/NotificationListGroupItem.js | 347 +++++++++++++++++ packages/fiori/src/NotificationListItem.hbs | 27 +- packages/fiori/src/NotificationListItem.js | 43 ++- .../fiori/src/NotificationListItemPopover.hbs | 2 +- .../fiori/src/NotificationOverflowAction.js | 4 +- .../fiori/src/i18n/messagebundle.properties | 9 + .../fiori/src/themes/InvisibleTextStyles.css | 7 + .../src/themes/NotificationListGroupItem.css | 81 ++++ .../fiori/src/themes/NotificationListItem.css | 60 +-- .../src/themes/NotificationListItemBase.css | 26 ++ .../fiori/src/themes/NotificationPrioIcon.css | 21 ++ .../test/pages/NotificationListGroupItem.html | 326 ++++++++++++++++ ...ionList.html => NotificationListItem.html} | 7 + .../NotificationListGroupItem.sample.html | 355 ++++++++++++++++++ .../samples/NotificationListItem.sample.html | 2 +- .../test/specs/NotificationListItem.spec.js | 0 packages/main/src/List.js | 26 +- .../build-scripts/samples-prepare.js | 4 +- 20 files changed, 1345 insertions(+), 79 deletions(-) create mode 100644 packages/fiori/src/NotificationListGroupItem.hbs create mode 100644 packages/fiori/src/NotificationListGroupItem.js create mode 100644 packages/fiori/src/themes/InvisibleTextStyles.css create mode 100644 packages/fiori/src/themes/NotificationListGroupItem.css create mode 100644 packages/fiori/src/themes/NotificationListItemBase.css create mode 100644 packages/fiori/src/themes/NotificationPrioIcon.css create mode 100644 packages/fiori/test/pages/NotificationListGroupItem.html rename packages/fiori/test/pages/{NotificationList.html => NotificationListItem.html} (99%) create mode 100644 packages/fiori/test/samples/NotificationListGroupItem.sample.html create mode 100644 packages/fiori/test/specs/NotificationListItem.spec.js diff --git a/packages/fiori/bundle.esm.js b/packages/fiori/bundle.esm.js index ee25e43394b5..3c1c7f9df6ff 100644 --- a/packages/fiori/bundle.esm.js +++ b/packages/fiori/bundle.esm.js @@ -13,5 +13,6 @@ import ShellBar from "./dist/ShellBar.js"; import ShellBarItem from "./dist/ShellBarItem.js"; import UploadCollection from "./dist/UploadCollection.js"; import UploadCollectionItem from "./dist/UploadCollectionItem.js"; -import NotificationListItem from "./dist/NotificationListItem.js"; +import NotificationListItem from "./dist/NotificationListItem.js" +import NotificationListGroupItem from "./dist/NotificationListGroupItem.js"; import NotificationOverflowAction from "./dist/NotificationOverflowAction.js"; \ No newline at end of file diff --git a/packages/fiori/src/NotificationListGroupItem.hbs b/packages/fiori/src/NotificationListGroupItem.hbs new file mode 100644 index 000000000000..a79e1154b235 --- /dev/null +++ b/packages/fiori/src/NotificationListGroupItem.hbs @@ -0,0 +1,74 @@ +<li + class="ui5-ng-root ui5-nli-focusable" + @focusin="{{_onfocusin}}" + @focusout="{{_onfocusout}}" + @keydown="{{_onkeydown}}" + role="option" + tabindex="{{_tabIndex}}" + dir="{{rtl}}" + aria-labelledby="{{_id}}-heading {{_id}}-invisibleText" +> + <div class="ui5-ng-header"> + <ui5-button + icon="navigation-right-arrow" + design="Transparent" + @click="{{_onBtnToggleClick}}" + class="ui5-ng-toggle-btn" + ></ui5-button> + + {{#if hasPriority}} + <ui5-icon + class="ui5-prio-icon ui5-prio-icon--{{priorityIcon}}" + name="{{priorityIcon}}"> + </ui5-icon> + {{/if}} + + <div id="{{_id}}-heading" class="ui5-ng-heading" part="heading"> + {{heading}} + </div> + + {{#if showCounter}} + <span class="ui5-ng-counter">{{counter}}</span> + {{/if}} + + <div class="ui5-ng-divider"></div> + + {{#unless collapsed}} + {{#if showOverflow}} + <ui5-button + icon="overflow" + design="Transparent" + @click="{{_onBtnOverflowClick}}" + class="ui5-ng-overflow-btn" + title="{{overflowBtnTitle}}" + ></ui5-button> + {{else}} + {{#each standardActions}} + <ui5-button + icon="{{this.icon}}" + class="ui5-ng-action" + @click="{{this.press}}" + data-ui5-external-action-item-id="{{this.refItemid}}" + > + {{this.text}} + </ui5-button> + {{/each}} + {{/if}} + {{/unless}} + + {{#if showClose}} + <ui5-button + icon="decline" + design="Transparent" + @click="{{_onBtnCloseClick}}" + title="{{closeBtnTitle}}" + ></ui5-button> + {{/if}} + + <span id="{{_id}}-invisibleText" class="ui5-hidden-text">{{accInvisibleText}}</span> + </div> + + <ui5-list class="ui5-ng-items"> + <slot></slot> + </ui5-list> +</li> \ No newline at end of file diff --git a/packages/fiori/src/NotificationListGroupItem.js b/packages/fiori/src/NotificationListGroupItem.js new file mode 100644 index 000000000000..908ef228b391 --- /dev/null +++ b/packages/fiori/src/NotificationListGroupItem.js @@ -0,0 +1,347 @@ +import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; +import { isSpace } from "@ui5/webcomponents-base/dist/Keys.js"; +import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; +import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; + +import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; +import Button from "@ui5/webcomponents/dist/Button.js"; +import Icon from "@ui5/webcomponents/dist/Icon.js"; +import Priority from "@ui5/webcomponents/dist/types/Priority.js"; + +// Icons +import "@ui5/webcomponents-icons/dist/icons/decline.js"; +import "@ui5/webcomponents-icons/dist/icons/message-success.js"; +import "@ui5/webcomponents-icons/dist/icons/message-error.js"; +import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; +import "@ui5/webcomponents-icons/dist/icons/overflow.js"; + +// Texts +import { + NOTIFICATIONGROUPITEM_TXT, + NOTIFICATIONGROUPITEM_PRIORITY_TXT, + NOTIFICATIONGROUPITEM_COUNTER_TXT, + NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE, + NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE, +} from "./generated/i18n/i18n-defaults.js"; + +// Templates +import NotificationListGroupItemTemplate from "./generated/templates/NotificationListGroupItemTemplate.lit.js"; +import NotificationListItemPopoverTemplate from "./generated/templates/NotificationListItemPopoverTemplate.lit.js"; + +// Styles +import NotificationListGroupItemCss from "./generated/themes/NotificationListGroupItem.css.js"; +import NotifactionListItemPopoverCss from "./generated/themes/NotifactionListItemPopover.css.js"; + +const PRIORITY_ICONS_MAP = { + "High": "message-error", + "Medium": "message-warning", + "Low": "message-success", +}; + +/** + * @public + */ +const metadata = { + tag: "ui5-li-notification-group", + managedSlots: true, + properties: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { + /** + * Defines the <code>heading</code> of the group. + * @type {string} + * @defaultvalue "" + * @public + */ + heading: { + type: String, + }, + + /** + * Defines the <code>priority</code> of the group. + * @type {Priority} + * @defaultvalue "None" + * @public + */ + priority: { + type: Priority, + defaultValue: Priority.None, + }, + + /** + * Defines if the group is collapsed or expanded. + * @type {boolean} + * @defaultvalue false + * @public + */ + collapsed: { + type: Boolean, + }, + + /** + * Defines if the <code>close</code> button would be displayed. + * @type {boolean} + * @defaultvalue false + * @public + */ + showClose: { + type: Boolean, + }, + + /** + * Defines if the items <code>counter</code> would be displayed. + * @type {boolean} + * @defaultvalue false + * @public + */ + showCounter: { + type: Boolean, + }, + }, + slots: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { + + /** + * Defines the actions, displayed in the <code>ui5-li-notification-group</code>. + * <br><br> + * <b>Note:</b> use the <code>ui5-notification-overflow-action</code> component. + * + * @type {HTMLElement} + * @slot + * @public + */ + actions: { + type: HTMLElement, + }, + + /** + * Defines the items of the <code>ui5-li-notification-group</code>, + * usually <code>ui5-li-notification</code> items. + * + * @type {HTMLElement[]} + * @slot + * @public + */ + "default": { + propertyName: "items", + type: HTMLElement, + }, + }, + events: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { + _close: {}, + + /** + * Fired when the <code>ui5-li-notification-group</code> is expanded/collapsed by user interaction. + * + * @event + * @public + */ + toggle: {}, + }, +}; + +/** + * @class + * + * <h3 class="comment-api-title">Overview</h3> + * The <code>ui5-li-notification-group</code> is a special type of list item, + * that unlike others can group items within self, usually <code>ui5-li-notification</code> items. + * <br> + * + * The component consists of: + * <ul> + * <li><code>Toggle</code> button to expand and collapse the group</li> + * <li><code>Priority</code> icon to display the priority of the group</li> + * <li><code>Heading</code> to entitle the group</li> + * <li>Custom actions</li> + * <li>Items of the group</li> + * </ul> + * + * <h3>Usage</h3> + * The component can be used in a standard <code>ui5-list</code>. + * + * <h3>ES6 Module Import</h3> + * + * <code>import @ui5/webcomponents/dist/NotificationListGroupItem.js";</code> + * <br> + * <code>import @ui5/webcomponents/dist/NotificationOverflowAction.js";</code> (optional) + * @constructor + * @author SAP SE + * @alias sap.ui.webcomponents.fiori.NotificationListGroupItem + * @extends ListItemBase + * @tagname ui5-li-notification-group + * @since 1.0.0-rc.8 + * @appenddocs NotificationOverflowAction + * @public + */ +class NotificationListGroupItem extends ListItemBase { + constructor() { + super(); + this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); + } + + static get metadata() { + return metadata; + } + + static get render() { + return litRender; + } + + static get styles() { + return NotificationListGroupItemCss; + } + + static get template() { + return NotificationListGroupItemTemplate; + } + + static get staticAreaTemplate() { + return NotificationListItemPopoverTemplate; + } + + static get staticAreaStyles() { + return NotifactionListItemPopoverCss; + } + + static async onDefine() { + await Promise.all([ + Button.define(), + Icon.define(), + fetchI18nBundle("@ui5/webcomponents-fiori"), + ]); + } + + get hasPriority() { + return this.priority !== Priority.None; + } + + get priorityIcon() { + return PRIORITY_ICONS_MAP[this.priority]; + } + + get overflowBtnTitle() { + return this.i18nBundle.getText(NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE); + } + + get closeBtnTitle() { + return this.i18nBundle.getText(NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE); + } + + get overflowButtonDOM() { + return this.shadowRoot.querySelector(".ui5-ng-overflow-btn"); + } + + get showOverflow() { + return !!this.overflowActions.length; + } + + get overflowActions() { + if (this.actions.length <= 1) { + return []; + } + + return this.actionsInfo; + } + + get standardActions() { + if (this.actions.length > 1) { + return []; + } + + return this.actionsInfo; + } + + get actionsInfo() { + return this.actions.map(action => { + return { + icon: action.icon, + text: action.text, + press: this._onCustomActionClick.bind(this), + refItemid: action._id, + }; + }); + } + + get rtl() { + return getRTL() ? "rtl" : undefined; + } + + get itemsCount() { + return this.items.length; + } + + get counter() { + return `(${this.itemsCount})`; + } + + get accInvisibleText() { + const groupTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_TXT); + const prioTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_PRIORITY_TXT); + const counterTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_COUNTER_TXT); + const counter = this.showCounter ? `${counterTxt} ${this.itemsCount}` : ""; + + return `${groupTxt}. ${this.priority} ${prioTxt}. ${counter}`; + } + + /** + * Event handlers + * + */ + + _onBtnCloseClick() { + this.fireEvent("_close", { item: this }); + } + + _onBtnOverflowClick() { + this.openOverflow(); + } + + _onBtnToggleClick() { + this.collapsed = !this.collapsed; + this.fireEvent("toggle", { item: this }); + } + + _onCustomActionClick(event) { + const refItemId = event.target.getAttribute("data-ui5-external-action-item-id"); + + if (refItemId) { + this.getActionByID(refItemId).fireEvent("click", { + targetRef: event.target, + }, true); + + this.closeOverflow(); + } + } + + _onkeydown(event) { + super._onkeydown(event); + + if (isSpace(event)) { + event.preventDefault(); + } + } + + /** + * Private + */ + getActionByID(id) { + return this.actions.find(action => action._id === id); + } + + async openOverflow() { + const overflowPopover = await this.getOverflowPopover(); + overflowPopover.openBy(this.overflowButtonDOM); + } + + async closeOverflow() { + const overflowPopover = await this.getOverflowPopover(); + overflowPopover.close(); + } + + async getOverflowPopover() { + const staticAreaItem = await this.getStaticAreaItemDomRef(); + return staticAreaItem.querySelector(".ui5-notification-overflow-popover"); + } +} + +NotificationListGroupItem.define(); + +export default NotificationListGroupItem; diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index 58db8764b19a..0bc48fa97eca 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -1,5 +1,5 @@ <li - class="ui5-nli-root" + class="ui5-nli-root ui5-nli-focusable" @focusin="{{_onfocusin}}" @focusout="{{_onfocusout}}" @keydown="{{_onkeydown}}" @@ -8,11 +8,18 @@ role="option" tabindex="{{_tabIndex}}" dir="{{rtl}}" - aria-labelledby="{{_id}}-heading {{_id}}-description {{_id}}-footer" + aria-labelledby="{{ariaLabelledBy}}" > - {{!-- render the actions first in order to be first in the tab chain as well--}} <div class="ui5-nli-actions"> - {{#unless showOverflow}} + {{#if showOverflow}} + <ui5-button + icon="overflow" + design="Transparent" + @click="{{_onBtnOverflowClick}}" + class="ui5-nli-overflow-btn" + title="{{overflowBtnTitle}}" + ></ui5-button> + {{else}} {{#each standardActions}} <ui5-button icon="{{this.icon}}" @@ -23,16 +30,6 @@ {{this.text}} </ui5-button> {{/each}} - {{/unless}} - - {{#if showOverflow}} - <ui5-button - icon="overflow" - design="Transparent" - @click="{{_onBtnOverflowClick}}" - class="ui5-nli-overflow-btn" - title="{{overflowBtnTitle}}" - ></ui5-button> {{/if}} {{#if showClose}} @@ -49,7 +46,7 @@ <div class="ui5-nli-heading"> {{#if hasPriority}} <ui5-icon - class="ui5-nli-prio-icon ui5-nli-prio-icon--{{priorityIcon}}" + class="ui5-prio-icon ui5-prio-icon--{{priorityIcon}}" name="{{priorityIcon}}"> </ui5-icon> {{/if}} diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 9a73dbc77fc8..f82918efa3e7 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -89,6 +89,20 @@ const metadata = { type: Boolean, }, + + /** + * Defines if the <code>notification</code> is new or has been already read. + * <br><br> + * <b>Note:</b> when set to <code>false</code> the <code>heading</code> has bold font + * and if set to true - it has a normal font. + * @type {boolean} + * @defaultvalue false + * @public + */ + read: { + type: Boolean, + }, + /** * Defines the state of the <code>heading</code> and <code>decription</code>, * if less or more information is displayed. @@ -194,11 +208,12 @@ const metadata = { * <h3>ES6 Module Import</h3> * * <code>import @ui5/webcomponents/dist/NotificationListItem.js";</code> + * <br> * <code>import @ui5/webcomponents/dist/NotificationOverflowAction.js";</code> (optional) * @constructor * @author SAP SE * @alias sap.ui.webcomponents.fiori.NotificationListItem - * @extends UI5Element + * @extends ListItemBase * @tagname ui5-li-notification * @appenddocs NotificationOverflowAction * @since 1.0.0-rc.8 @@ -388,6 +403,24 @@ class NotificationListItem extends ListItemBase { }); } + get ariaLabelledBy() { + const ids = []; + + if (this.hasHeading) { + ids.push(`${this._id}-heading`); + } + if (this.hasDesc) { + ids.push(`${this._id}-description`); + } + + if (this.hasFootNotes) { + ids.push(`${this._id}-footer`); + } + + return ids.join(" "); + } + + get rtl() { return getRTL() ? "rtl" : undefined; } @@ -492,18 +525,18 @@ class NotificationListItem extends ListItemBase { } async openOverflow() { - const overflowPopover = await this.overflowPopover(); + const overflowPopover = await this.getOverflowPopover(); overflowPopover.openBy(this.overflowButtonDOM); } async closeOverflow() { - const overflowPopover = await this.overflowPopover(); + const overflowPopover = await this.getOverflowPopover(); overflowPopover.close(); } - async overflowPopover() { + async getOverflowPopover() { const staticAreaItem = await this.getStaticAreaItemDomRef(); - return staticAreaItem.querySelector(".ui5-nli-overflow-popover"); + return staticAreaItem.querySelector(".ui5-notification-overflow-popover"); } } diff --git a/packages/fiori/src/NotificationListItemPopover.hbs b/packages/fiori/src/NotificationListItemPopover.hbs index 545ad4a7bc8b..e1b92fb862f4 100644 --- a/packages/fiori/src/NotificationListItemPopover.hbs +++ b/packages/fiori/src/NotificationListItemPopover.hbs @@ -1,5 +1,5 @@ <ui5-popover - class="ui5-nli-overflow-popover" + class="ui5-notification-overflow-popover" placement-type="Bottom" horizontal-align="Right" no-arrow diff --git a/packages/fiori/src/NotificationOverflowAction.js b/packages/fiori/src/NotificationOverflowAction.js index 397573547d9b..3c5efb682adc 100644 --- a/packages/fiori/src/NotificationOverflowAction.js +++ b/packages/fiori/src/NotificationOverflowAction.js @@ -40,8 +40,8 @@ const metadata = { /** * @class - * The <code>ui5-notification-overflow-action</code> represents an astract action, - * used in the <code>ui5-li-notification</code>. + * The <code>ui5-notification-overflow-action</code> represents an abstract action, + * used in the <code>ui5-li-notification</code> and the <code>ui5-li-notification-group</code> items. * * @constructor * @author SAP SE diff --git a/packages/fiori/src/i18n/messagebundle.properties b/packages/fiori/src/i18n/messagebundle.properties index 1dcf65093564..add1934f2376 100644 --- a/packages/fiori/src/i18n/messagebundle.properties +++ b/packages/fiori/src/i18n/messagebundle.properties @@ -10,6 +10,15 @@ NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE=More #XBUT: Tooltip text for 'Close' button in the NotificationListItem NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE=Close +#XTXT: Text for the NotificationListGroupItem +NOTIFICATIONGROUPITEM_TXT=Notification group + +#XTXT: Text for the NotificationListGroupItem priority +NOTIFICATIONGROUPITEM_PRIORITY_TXT=Priority + +#XTXT: Text for the NotificationListGroupItem counter +NOTIFICATIONGROUPITEM_COUNTER_TXT=Counter + #XBUT: Button text for cancel button in the UploadCollectionItem UPLOADCOLLECTIONITEM_CANCELBUTTON_TEXT=Cancel diff --git a/packages/fiori/src/themes/InvisibleTextStyles.css b/packages/fiori/src/themes/InvisibleTextStyles.css new file mode 100644 index 000000000000..4d2cca713f01 --- /dev/null +++ b/packages/fiori/src/themes/InvisibleTextStyles.css @@ -0,0 +1,7 @@ +.ui5-hidden-text { + position: absolute; + clip: rect(1px,1px,1px,1px); + user-select: none; + left: 0; + top: 0; +} \ No newline at end of file diff --git a/packages/fiori/src/themes/NotificationListGroupItem.css b/packages/fiori/src/themes/NotificationListGroupItem.css new file mode 100644 index 000000000000..2face279664b --- /dev/null +++ b/packages/fiori/src/themes/NotificationListGroupItem.css @@ -0,0 +1,81 @@ +@import "./InvisibleTextStyles.css"; +@import "./NotificationListItemBase.css"; +@import "./NotificationPrioIcon.css"; + +:host(:not([collapsed])) .ui5-ng-toggle-btn { + transform: rotate(90deg); +} + +:host([collapsed]) .ui5-ng-items { + display: none; +} + +.ui5-ng-root { + display: flex; + flex-direction: column; + position: relative; + width: 100%; + box-sizing: border-box; +} + +.ui5-ng-header { + display: flex; + align-items: center; + padding: 0.75rem 0.5rem 0.25rem 0.75rem; + width: 100%; + border-bottom: 0.0625rem solid var(--sapList_GroupHeaderBorderColor); + box-sizing: border-box; + cursor: default; +} + +.ui5-ng-toggle-btn { + margin-right: 1rem; + cursor: pointer; +} + +.ui5-ng-heading { + color: var(--sapGroup_TitleTextColor); + font-family: var(--sapFontFamily); + font-size: var(--sapFontHeader6Size); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.ui5-ng-divider { + flex: 1; +} + +.ui5-ng-counter { + margin-left: 0.25rem; + margin-right: 1rem; + color: var(--sapList_TableGroupHeaderTextColor); + font-size: var(--sapFontHeader6Size); + font-family: var(--sapFontHeaderFamily); +} + +.ui5-ng-action { + flex-shrink: 0; + margin-right: 0.5rem; +} + +.ui5-ng-overflow-btn { + margin-right: 0.5rem; +} + +[dir="rtl"] .ui5-ng-action { + margin-left: 0.5rem; +} + +[dir="rtl"] .ui5-ng-overflow-btn { + margin-left: 0.5rem; +} + +[dir="rtl"] .ui5-ng-toggle-btn { + margin-left: 1rem; +} + +[dir="rtl"] .ui5-ng-counter { + margin-right: 0.25rem; + margin-left: 1rem; +} \ No newline at end of file diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index 7615510016c9..c6ce94baeccd 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -1,29 +1,5 @@ -:host(:not([hidden])) { - display: block; - width: 100%; - min-height: var(--_ui5_list_item_base_height); - background: var(--ui5-listitem-background-color); - cursor: pointer; -} - -:host([has-border]) { - border-bottom: var(--ui5-listitem-border-bottom); -} - -:host([focused]) .ui5-nli-root { - outline: none; -} - -:host([focused]) .ui5-nli-root:after { - content: ""; - border: var(--_ui5_listitembase_focus_width) dotted var(--sapContent_FocusColor); - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - pointer-events: none; -} +@import "./NotificationListItemBase.css"; +@import "./NotificationPrioIcon.css"; :host([truncate]) .ui5-nli-title { display: -webkit-box; @@ -47,6 +23,9 @@ -webkit-line-clamp: unset; } +:host([read]) .ui5-nli-title { + font-weight: normal; +} /* IE */ :host([truncate]) .ui5-nli-content--ie .ui5-nli-description { @@ -89,10 +68,13 @@ .ui5-nli-heading { display: flex; margin-bottom: 0.25rem; + box-sizing: border-box; +} + +.ui5-nli-title { color: var(--sapGroup_TitleTextColor); font-weight: bold; font-size: var(--sapFontHeader6Size); - box-sizing: border-box; } .ui5-nli-description { @@ -139,28 +121,10 @@ overflow: hidden; } -/* Priority icon */ -.ui5-nli-prio-icon { - min-width: 1rem; - min-height: 1rem; - padding-right: 0.5rem; -} - -.ui5-nli-prio-icon--message-error { - color: var(--sapNegativeElementColor); -} - -.ui5-nli-prio-icon--message-warning { - color: var(--sapCriticalElementColor); -} - -.ui5-nli-prio-icon--message-success { - color: var(--sapPositiveElementColor); -} - /* Actions */ .ui5-nli-actions { display: flex; + box-sizing: border-box; } .ui5-nli-action { @@ -182,10 +146,6 @@ margin-right: 1rem; } -[dir="rtl"] .ui5-nli-prio-icon { - padding-right: 0.5rem; -} - [dir="rtl"] .ui5-nli-action { margin-left: 0.5rem; } diff --git a/packages/fiori/src/themes/NotificationListItemBase.css b/packages/fiori/src/themes/NotificationListItemBase.css new file mode 100644 index 000000000000..19710cdfb069 --- /dev/null +++ b/packages/fiori/src/themes/NotificationListItemBase.css @@ -0,0 +1,26 @@ +:host(:not([hidden])) { + display: block; + width: 100%; + min-height: var(--_ui5_list_item_base_height); + background: var(--ui5-listitem-background-color); + cursor: pointer; +} + +:host([has-border]) { + border-bottom: var(--ui5-listitem-border-bottom); +} + +:host([focused]) .ui5-nli-focusable { + outline: none; +} + +:host([focused]) .ui5-nli-focusable:after { + content: ""; + border: var(--_ui5_listitembase_focus_width) dotted var(--sapContent_FocusColor); + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} diff --git a/packages/fiori/src/themes/NotificationPrioIcon.css b/packages/fiori/src/themes/NotificationPrioIcon.css new file mode 100644 index 000000000000..ee53f81fa8a2 --- /dev/null +++ b/packages/fiori/src/themes/NotificationPrioIcon.css @@ -0,0 +1,21 @@ +.ui5-prio-icon { + min-width: 1rem; + min-height: 1rem; + padding-right: 0.5rem; +} + +.ui5-prio-icon--message-error { + color: var(--sapNegativeElementColor); +} + +.ui5-prio-icon--message-warning { + color: var(--sapCriticalElementColor); +} + +.ui5-prio-icon--message-success { + color: var(--sapPositiveElementColor); +} + +[dir="rtl"] .ui5-prio-icon { + padding-right: 0.5rem; +} \ No newline at end of file diff --git a/packages/fiori/test/pages/NotificationListGroupItem.html b/packages/fiori/test/pages/NotificationListGroupItem.html new file mode 100644 index 000000000000..8c1d8882d2cf --- /dev/null +++ b/packages/fiori/test/pages/NotificationListGroupItem.html @@ -0,0 +1,326 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>NotificationGroup</title> + + <script src="../../webcomponentsjs/webcomponents-loader.js"></script> + <script src="../../resources/bundle.esm.js" type="module"></script> + <script nomodule src="../../resources/bundle.es5.js"></script> + + <script>delete Document.prototype.adoptedStyleSheets;</script> +</head> + +<body style="background-color: var(--sapBackgroundColor);"> + + <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> + </ui5-shellbar> + + <br/><br/> + + <h3>Properties</h3> + <ul> + <li>heading</li> + <li>priority</li> + <li>collapsed</li> + <li>show-close</li> + <li>show-counter</li> + </ul> + + <h3>Slots</h3> + <ul> + <li>items (default)</li> + <li>actions</li> + </ul> + + <h3>Events on ui5-list level</h3> + <ul> + <li>itemToggle</li> + </ul> + + <ui5-list id="notificationList" header-text="Notifications grouped"> + <ui5-li-notification-group + show-close + show-counter + heading="Orders" + priority="High" + > + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="reject" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#252) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + heading="Payments" + priority="High" + > + <ui5-li-notification + show-close + truncate + heading="New order (#2900) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#29001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#29003) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + priority="High" + heading="Meetings With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + <ui5-li-notification + show-close + truncate + heading="New order (#35001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#35002) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#35003) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + </ui5-list> + + <br><br> + + <ui5-toast id="wcToastBS" duration="2000"></ui5-toast> + + <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> + <ui5-list id="notificationListTop" header-text="Notifications heading and content 'truncates'"> + <ui5-li-notification-group + show-close + show-counter + heading="Orders" + priority="Medium" + > + <ui5-li-notification + show-close + truncate + priority="Medium" + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="./img/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + <span slot="footnotes">Other stuff</span> + + <ui5-notification-overflow-action id="acceptBtnInPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action id="rejectBtnInPopover" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + show-counter + heading="Orders" + priority="Medium" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action id="acceptBtn2InPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + heading="Calls" + priority="Low" + > + <ui5-li-notification + heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Low" + truncate + > + Short description + <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Patricia Clarck</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification heading="New order (#2523)" truncate priority="Low"> + <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> + + <span slot="footnotes">John SMith</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-li-notification-group> + </ui5-list> + </ui5-popover> + + <div style="display: flex; justify-content: flex-end; padding: 0.25rem; border-bottom: 1px solid grey;"> + <ui5-button id="openNotifications" design="Transparent" icon="bell"></ui5-button> + </div> + + <script> + notificationList.addEventListener("itemClick", function(event) { + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + + notificationList.addEventListener("itemClose", function(event) { + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); + }); + + notificationList.addEventListener("itemToggle", function(event) { + var item = event.detail.item; + wcToastBS.textContent = item.heading + " has been " + (item.collapsed ? "collapsed" : "expanded"); + wcToastBS.show(); + }); + + acceptBtnInPopover.addEventListener("click", function(event) { + wcToastBS.textContent = "Accept btn In popover btn clicked"; + wcToastBS.show(); + + console.log("acceptBtnInPopover btn clicked"); + }); + + rejectBtnInPopover.addEventListener("click", function(event) { + wcToastBS.textContent = "Reject btn In popover btn clicked"; + wcToastBS.show(); + + console.log("rejectBtnInPopover btn clicked"); + }); + + openNotifications.addEventListener("click", function(event) { + notificationsPopover.openBy(openNotifications); + }); + + shellbar.addEventListener("ui5-notificationsClick", function(event) { + notificationsPopover.openBy(event.detail.targetRef); + }); + </script> +</body> +</html> diff --git a/packages/fiori/test/pages/NotificationList.html b/packages/fiori/test/pages/NotificationListItem.html similarity index 99% rename from packages/fiori/test/pages/NotificationList.html rename to packages/fiori/test/pages/NotificationListItem.html index 92c3c5c4dbc1..898ca4c7dea4 100644 --- a/packages/fiori/test/pages/NotificationList.html +++ b/packages/fiori/test/pages/NotificationListItem.html @@ -41,6 +41,7 @@ <h3>Properties</h3> <li>heading</li> <li>truncate</li> <li>priority</li> + <li>read</li> <li>show-close</li> </ul> @@ -51,6 +52,12 @@ <h3>Slots</h3> <li>footnotes</li> </ul> + <h3>Events on ui5-list level</h3> + <ul> + <li>itemClick</li> + <li>itemClose</li> + </ul> + <ui5-list id="notificationList" header-text="Notifications heading and content 'truncates'"> <ui5-li-notification diff --git a/packages/fiori/test/samples/NotificationListGroupItem.sample.html b/packages/fiori/test/samples/NotificationListGroupItem.sample.html new file mode 100644 index 000000000000..f9a0a9b8dafe --- /dev/null +++ b/packages/fiori/test/samples/NotificationListGroupItem.sample.html @@ -0,0 +1,355 @@ +<header class="component-heading"> + <h2 class="control-header">NotificationListGroupItem</h2> + <div class="component-heading-since"> + <span><!--since_tag_marker--></span> + </div> +</header> + +<div class="component-package">@ui5/webcomponents-fiori</div> + +<div class="control-tag"><ui5-li-notification-group></div> + +<!--Basic --> +<section> + <h3>NotificationListGroupItem</h3> + <div class="snippet"> + <ui5-list id="myList" header-text="Notifications grouped"> + <ui5-li-notification-group + show-close + show-counter + heading="Orders" + priority="High" + > + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + heading="Deliveries" + priority="Medium" + > + <ui5-li-notification + show-close + truncate + heading="New Delivery (#2900) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New Delivery (#29001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + priority="High" + heading="Meetings With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + <ui5-li-notification + show-close + truncate + heading="New meeting at Building (#35001)" + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New meeting at Building (#35001)" + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + </ui5-li-notification-group> + </ui5-list> + + <script> + myList.addEventListener("itemClose", function(e) { + e.detail.item.hidden = true; + }); + </script> + </div> + <pre class="prettyprint lang-html"><xmp> +<ui5-list id="myList" header-text="Notifications grouped"> + <ui5-li-notification-group + show-close + show-counter + heading="Orders" + priority="High" + > + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + ... + </ui5-li-notification> + + <ui5-li-notification + show-close + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + ... + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + ... +</ui5-list> + </xmp></pre> +</section> + +<section> + <h3>NotificationListGroupItem In ShellBar</h3> + <div class="snippet"> + <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> + </ui5-shellbar> + + <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> + <ui5-list id="notificationListTop" header-text="Notifications grouped"> + <ui5-li-notification-group + show-close + show-counter + heading="Orders" + priority="High" + > + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + heading="Deliveries" + priority="Medium" + > + <ui5-li-notification + show-close + truncate + heading="New Delivery (#2900) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New Delivery (#29001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="Medium" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + priority="High" + heading="Meetings With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + <ui5-li-notification + show-close + truncate + heading="New meeting at Building (#35001)" + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + <ui5-li-notification + show-close + truncate + heading="New meeting at Building (#35001)" + priority="High" + read + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + </ui5-li-notification> + + </ui5-li-notification-group> + </ui5-list> + </ui5-popover> + + <script> + shellbar.addEventListener("ui5-notificationsClick", function(event) { + notificationsPopover.openBy(event.detail.targetRef); + }); + </script> + </div> + <pre class="prettyprint lang-html"><xmp> +<ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> +</ui5-shellbar> + +<ui5-popover + id="notificationsPopover" + style="max-width: 400px" + placement-type="Bottom" + horizontal-align="Right" +> + <ui5-list header-text="Notifications"> + <ui5-li-notification-group + show-close + show-counter + heading="Orders" + priority="High" + > + <ui5-li-notification + show-close + truncate + heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar image="./img/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> + <span slot="footnotes">John Doe</span> + <span slot="footnotes">2 Days</span> + + <ui5-notification-overflow-action id="acceptBtnInPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action id="rejectBtnInPopover" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-li-notification-group> + ... + </ui5-list> +</ui5-popover> + +<script> + shellbar.addEventListener("ui5-notificationsClick", function(event) { + notificationsPopover.openBy(event.detail.targetRef); + }); +</script> + + </xmp></pre> +</section> + + +<!-- JSDoc marker --> diff --git a/packages/fiori/test/samples/NotificationListItem.sample.html b/packages/fiori/test/samples/NotificationListItem.sample.html index ce88f77bd3ae..2923e725460a 100644 --- a/packages/fiori/test/samples/NotificationListItem.sample.html +++ b/packages/fiori/test/samples/NotificationListItem.sample.html @@ -7,7 +7,7 @@ <h2 class="control-header">NotificationListItem</h2> <div class="component-package">@ui5/webcomponents-fiori</div> -<div class="control-tag"><ui5-list></div> +<div class="control-tag"><ui5-li-notification></div> <!--Basic --> <section> diff --git a/packages/fiori/test/specs/NotificationListItem.spec.js b/packages/fiori/test/specs/NotificationListItem.spec.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/main/src/List.js b/packages/main/src/List.js index 47c640db3f7c..3a07f3939118 100644 --- a/packages/main/src/List.js +++ b/packages/main/src/List.js @@ -180,10 +180,10 @@ const metadata = { }, /** - * Fired when the Close button of any item is clicked + * Fired when the <code>Close</code> button of any item is clicked * <br><br> - * <b>Note:</b> This event is applicable to NotificationListItem only, - * to not be confused with <code>itemDelete</code>. + * <b>Note:</b> This event is applicable to <code>ui5-li-notification</code> items only, + * not to be confused with <code>itemDelete</code>. * @event * @param {HTMLElement} item the item about to be closed. * @public @@ -195,6 +195,21 @@ const metadata = { }, }, + /** + * Fired when the <code>Toggle</code> button of any item is clicked. + * <br><br> + * <b>Note:</b> This event is applicable to <code>ui5-li-notification-group</code> items only. + * @event + * @param {HTMLElement} item the toggled item. + * @public + * @since 1.0.0-rc.8 + */ + itemToggle: { + detail: { + item: { type: HTMLElement }, + }, + }, + /** * Fired when the Delete button of any item is pressed. * <br><br> @@ -310,6 +325,7 @@ class List extends UI5Element { this.addEventListener("ui5-_press", this.onItemPress.bind(this)); this.addEventListener("ui5-_close", this.onItemClose.bind(this)); + this.addEventListener("ui5-toggle", this.onItemToggle.bind(this)); this.addEventListener("ui5-_focused", this.onItemFocused.bind(this)); this.addEventListener("ui5-_forwardAfter", this.onForwardAfter.bind(this)); this.addEventListener("ui5-_forwardBefore", this.onForwardBefore.bind(this)); @@ -560,6 +576,10 @@ class List extends UI5Element { this.fireEvent("itemClose", { item: event.detail.item }); } + onItemToggle(event) { + this.fireEvent("itemToggle", { item: event.detail.item }); + } + onForwardBefore(event) { this.setPreviouslyFocusedItem(event.target); this.focusBeforeElement(); diff --git a/packages/playground/build-scripts/samples-prepare.js b/packages/playground/build-scripts/samples-prepare.js index 96a92089354a..ef131fb8dd3f 100644 --- a/packages/playground/build-scripts/samples-prepare.js +++ b/packages/playground/build-scripts/samples-prepare.js @@ -14,7 +14,9 @@ const components = []; const newComponents = [ "DateTimePicker", "DurationPicker", - "UploadCollection" + "NotificationListItem", + "NotificationListGroupItem", + "UploadCollection", ]; packages.forEach(package => { From 9ac6d0f2268a3fb4eba3573d6222588aaae88a28 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Wed, 6 May 2020 20:12:52 +0300 Subject: [PATCH 10/22] extract NotificationListItemBase base class --- ... => NotifactionOverflowActionsPopover.hbs} | 2 +- .../fiori/src/NotificationListGroupItem.hbs | 19 +- .../fiori/src/NotificationListGroupItem.js | 183 +-------------- packages/fiori/src/NotificationListItem.hbs | 1 + packages/fiori/src/NotificationListItem.js | 178 +------------- .../fiori/src/NotificationListItemBase.js | 222 ++++++++++++++++++ ... => NotifactionOverflowActionsPopover.css} | 2 +- .../src/themes/NotificationListGroupItem.css | 28 +-- .../test/pages/NotificationListGroupItem.html | 17 +- .../test/pages/NotificationListItem.html | 50 ++-- packages/main/src/List.js | 2 +- 11 files changed, 305 insertions(+), 399 deletions(-) rename packages/fiori/src/{NotificationListItemPopover.hbs => NotifactionOverflowActionsPopover.hbs} (88%) create mode 100644 packages/fiori/src/NotificationListItemBase.js rename packages/fiori/src/themes/{NotifactionListItemPopover.css => NotifactionOverflowActionsPopover.css} (64%) diff --git a/packages/fiori/src/NotificationListItemPopover.hbs b/packages/fiori/src/NotifactionOverflowActionsPopover.hbs similarity index 88% rename from packages/fiori/src/NotificationListItemPopover.hbs rename to packages/fiori/src/NotifactionOverflowActionsPopover.hbs index e1b92fb862f4..f30aead36c08 100644 --- a/packages/fiori/src/NotificationListItemPopover.hbs +++ b/packages/fiori/src/NotifactionOverflowActionsPopover.hbs @@ -4,7 +4,7 @@ horizontal-align="Right" no-arrow > - <div class="ui5-nli-overflow-list"> + <div class="ui5-notification-overflow-list"> {{#each overflowActions}} <ui5-button icon="{{this.icon}}" diff --git a/packages/fiori/src/NotificationListGroupItem.hbs b/packages/fiori/src/NotificationListGroupItem.hbs index a79e1154b235..f4b4080c50ce 100644 --- a/packages/fiori/src/NotificationListGroupItem.hbs +++ b/packages/fiori/src/NotificationListGroupItem.hbs @@ -1,5 +1,5 @@ <li - class="ui5-ng-root ui5-nli-focusable" + class="ui5-nli-group-root ui5-nli-focusable" @focusin="{{_onfocusin}}" @focusout="{{_onfocusout}}" @keydown="{{_onkeydown}}" @@ -8,12 +8,12 @@ dir="{{rtl}}" aria-labelledby="{{_id}}-heading {{_id}}-invisibleText" > - <div class="ui5-ng-header"> + <div class="ui5-nli-group-header"> <ui5-button icon="navigation-right-arrow" design="Transparent" @click="{{_onBtnToggleClick}}" - class="ui5-ng-toggle-btn" + class="ui5-nli-group-toggle-btn" ></ui5-button> {{#if hasPriority}} @@ -23,15 +23,15 @@ </ui5-icon> {{/if}} - <div id="{{_id}}-heading" class="ui5-ng-heading" part="heading"> + <div id="{{_id}}-heading" class="ui5-nli-group-heading" part="heading"> {{heading}} </div> {{#if showCounter}} - <span class="ui5-ng-counter">{{counter}}</span> + <span class="ui5-nli-group-counter">{{counter}}</span> {{/if}} - <div class="ui5-ng-divider"></div> + <div class="ui5-nli-group-divider"></div> {{#unless collapsed}} {{#if showOverflow}} @@ -39,14 +39,15 @@ icon="overflow" design="Transparent" @click="{{_onBtnOverflowClick}}" - class="ui5-ng-overflow-btn" + class="ui5-nli-group-overflow-btn" title="{{overflowBtnTitle}}" + overflow-btn ></ui5-button> {{else}} {{#each standardActions}} <ui5-button icon="{{this.icon}}" - class="ui5-ng-action" + class="ui5-nli-group-action" @click="{{this.press}}" data-ui5-external-action-item-id="{{this.refItemid}}" > @@ -68,7 +69,7 @@ <span id="{{_id}}-invisibleText" class="ui5-hidden-text">{{accInvisibleText}}</span> </div> - <ui5-list class="ui5-ng-items"> + <ui5-list class="ui5-nli-group-items"> <slot></slot> </ui5-list> </li> \ No newline at end of file diff --git a/packages/fiori/src/NotificationListGroupItem.js b/packages/fiori/src/NotificationListGroupItem.js index 908ef228b391..46b0966d06ef 100644 --- a/packages/fiori/src/NotificationListGroupItem.js +++ b/packages/fiori/src/NotificationListGroupItem.js @@ -1,19 +1,8 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; -import { isSpace } from "@ui5/webcomponents-base/dist/Keys.js"; import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; -import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; - -import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; -import Priority from "@ui5/webcomponents/dist/types/Priority.js"; - -// Icons -import "@ui5/webcomponents-icons/dist/icons/decline.js"; -import "@ui5/webcomponents-icons/dist/icons/message-success.js"; -import "@ui5/webcomponents-icons/dist/icons/message-error.js"; -import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; -import "@ui5/webcomponents-icons/dist/icons/overflow.js"; +import NotificationListItemBase from "./NotificationListItemBase.js"; // Texts import { @@ -26,17 +15,9 @@ import { // Templates import NotificationListGroupItemTemplate from "./generated/templates/NotificationListGroupItemTemplate.lit.js"; -import NotificationListItemPopoverTemplate from "./generated/templates/NotificationListItemPopoverTemplate.lit.js"; // Styles import NotificationListGroupItemCss from "./generated/themes/NotificationListGroupItem.css.js"; -import NotifactionListItemPopoverCss from "./generated/themes/NotifactionListItemPopover.css.js"; - -const PRIORITY_ICONS_MAP = { - "High": "message-error", - "Medium": "message-warning", - "Low": "message-success", -}; /** * @public @@ -45,26 +26,6 @@ const metadata = { tag: "ui5-li-notification-group", managedSlots: true, properties: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { - /** - * Defines the <code>heading</code> of the group. - * @type {string} - * @defaultvalue "" - * @public - */ - heading: { - type: String, - }, - - /** - * Defines the <code>priority</code> of the group. - * @type {Priority} - * @defaultvalue "None" - * @public - */ - priority: { - type: Priority, - defaultValue: Priority.None, - }, /** * Defines if the group is collapsed or expanded. @@ -76,16 +37,6 @@ const metadata = { type: Boolean, }, - /** - * Defines if the <code>close</code> button would be displayed. - * @type {boolean} - * @defaultvalue false - * @public - */ - showClose: { - type: Boolean, - }, - /** * Defines if the items <code>counter</code> would be displayed. * @type {boolean} @@ -98,19 +49,6 @@ const metadata = { }, slots: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { - /** - * Defines the actions, displayed in the <code>ui5-li-notification-group</code>. - * <br><br> - * <b>Note:</b> use the <code>ui5-notification-overflow-action</code> component. - * - * @type {HTMLElement} - * @slot - * @public - */ - actions: { - type: HTMLElement, - }, - /** * Defines the items of the <code>ui5-li-notification-group</code>, * usually <code>ui5-li-notification</code> items. @@ -125,7 +63,6 @@ const metadata = { }, }, events: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { - _close: {}, /** * Fired when the <code>ui5-li-notification-group</code> is expanded/collapsed by user interaction. @@ -165,13 +102,13 @@ const metadata = { * @constructor * @author SAP SE * @alias sap.ui.webcomponents.fiori.NotificationListGroupItem - * @extends ListItemBase + * @extends NotificationListItemBase * @tagname ui5-li-notification-group * @since 1.0.0-rc.8 * @appenddocs NotificationOverflowAction * @public */ -class NotificationListGroupItem extends ListItemBase { +class NotificationListGroupItem extends NotificationListItemBase { constructor() { super(); this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); @@ -193,14 +130,6 @@ class NotificationListGroupItem extends ListItemBase { return NotificationListGroupItemTemplate; } - static get staticAreaTemplate() { - return NotificationListItemPopoverTemplate; - } - - static get staticAreaStyles() { - return NotifactionListItemPopoverCss; - } - static async onDefine() { await Promise.all([ Button.define(), @@ -209,12 +138,12 @@ class NotificationListGroupItem extends ListItemBase { ]); } - get hasPriority() { - return this.priority !== Priority.None; + get itemsCount() { + return this.items.length; } - get priorityIcon() { - return PRIORITY_ICONS_MAP[this.priority]; + get counter() { + return `(${this.itemsCount})`; } get overflowBtnTitle() { @@ -225,53 +154,6 @@ class NotificationListGroupItem extends ListItemBase { return this.i18nBundle.getText(NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE); } - get overflowButtonDOM() { - return this.shadowRoot.querySelector(".ui5-ng-overflow-btn"); - } - - get showOverflow() { - return !!this.overflowActions.length; - } - - get overflowActions() { - if (this.actions.length <= 1) { - return []; - } - - return this.actionsInfo; - } - - get standardActions() { - if (this.actions.length > 1) { - return []; - } - - return this.actionsInfo; - } - - get actionsInfo() { - return this.actions.map(action => { - return { - icon: action.icon, - text: action.text, - press: this._onCustomActionClick.bind(this), - refItemid: action._id, - }; - }); - } - - get rtl() { - return getRTL() ? "rtl" : undefined; - } - - get itemsCount() { - return this.items.length; - } - - get counter() { - return `(${this.itemsCount})`; - } - get accInvisibleText() { const groupTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_TXT); const prioTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_PRIORITY_TXT); @@ -285,61 +167,10 @@ class NotificationListGroupItem extends ListItemBase { * Event handlers * */ - - _onBtnCloseClick() { - this.fireEvent("_close", { item: this }); - } - - _onBtnOverflowClick() { - this.openOverflow(); - } - _onBtnToggleClick() { this.collapsed = !this.collapsed; this.fireEvent("toggle", { item: this }); } - - _onCustomActionClick(event) { - const refItemId = event.target.getAttribute("data-ui5-external-action-item-id"); - - if (refItemId) { - this.getActionByID(refItemId).fireEvent("click", { - targetRef: event.target, - }, true); - - this.closeOverflow(); - } - } - - _onkeydown(event) { - super._onkeydown(event); - - if (isSpace(event)) { - event.preventDefault(); - } - } - - /** - * Private - */ - getActionByID(id) { - return this.actions.find(action => action._id === id); - } - - async openOverflow() { - const overflowPopover = await this.getOverflowPopover(); - overflowPopover.openBy(this.overflowButtonDOM); - } - - async closeOverflow() { - const overflowPopover = await this.getOverflowPopover(); - overflowPopover.close(); - } - - async getOverflowPopover() { - const staticAreaItem = await this.getStaticAreaItemDomRef(); - return staticAreaItem.querySelector(".ui5-notification-overflow-popover"); - } } NotificationListGroupItem.define(); diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index 0bc48fa97eca..a1b09c818675 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -18,6 +18,7 @@ @click="{{_onBtnOverflowClick}}" class="ui5-nli-overflow-btn" title="{{overflowBtnTitle}}" + overflow-btn ></ui5-button> {{else}} {{#each standardActions}} diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index f82918efa3e7..42501fad07a0 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -3,19 +3,10 @@ import { isSpace, isEnter } from "@ui5/webcomponents-base/dist/Keys.js"; import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js"; import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; -import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; -import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; -import Priority from "@ui5/webcomponents/dist/types/Priority.js"; - -// Icons -import "@ui5/webcomponents-icons/dist/icons/decline.js"; -import "@ui5/webcomponents-icons/dist/icons/message-success.js"; -import "@ui5/webcomponents-icons/dist/icons/message-error.js"; -import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; -import "@ui5/webcomponents-icons/dist/icons/overflow.js"; +import NotificationListItemBase from "./NotificationListItemBase.js"; // Texts import { @@ -26,17 +17,9 @@ import { // Templates import NotificationListItemTemplate from "./generated/templates/NotificationListItemTemplate.lit.js"; -import NotificationListItemPopoverTemplate from "./generated/templates/NotificationListItemPopoverTemplate.lit.js"; // Styles import NotificationListItemCss from "./generated/themes/NotificationListItem.css.js"; -import NotifactionListItemPopoverCss from "./generated/themes/NotifactionListItemPopover.css.js"; - -const PRIORITY_ICONS_MAP = { - "High": "message-error", - "Medium": "message-warning", - "Low": "message-success", -}; const MAX_WRAP_HEIGHT = 32; // px. @@ -47,36 +30,6 @@ const metadata = { tag: "ui5-li-notification", managedSlots: true, properties: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { - /** - * Defines the <code>heading</code>. - * @type {string} - * @defaultvalue "" - * @public - */ - heading: { - type: String, - }, - - /** - * Defines the <code>priority</code> of the notification. - * @type {Priority} - * @defaultvalue "None" - * @public - */ - priority: { - type: Priority, - defaultValue: Priority.None, - }, - - /** - * Defines if a <code>close</code> button should be displayed. - * @type {boolean} - * @defaultvalue false - * @public - */ - showClose: { - type: Boolean, - }, /** * Defines if the <code>heading</code> and <code>decription</code> should truncate, @@ -89,7 +42,6 @@ const metadata = { type: Boolean, }, - /** * Defines if the <code>notification</code> is new or has been already read. * <br><br> @@ -122,19 +74,6 @@ const metadata = { }, slots: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { - /** - * Defines the actions, displayed in the <code>ui5-li-notification</code>. - * <br><br> - * <b>Note:</b> Consider using the <code>ui5-notification-overflow-action</code>. - * - * @type {HTMLElement} - * @slot - * @public - */ - actions: { - type: HTMLElement, - }, - /** * Defines the avatar, displayed in the <code>ui5-li-notification</code>. * @@ -178,7 +117,6 @@ const metadata = { }, }, events: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { - _close: {}, _press: {}, }, }; @@ -213,13 +151,13 @@ const metadata = { * @constructor * @author SAP SE * @alias sap.ui.webcomponents.fiori.NotificationListItem - * @extends ListItemBase + * @extends NotificationListItemBase * @tagname ui5-li-notification * @appenddocs NotificationOverflowAction * @since 1.0.0-rc.8 * @public */ -class NotificationListItem extends ListItemBase { +class NotificationListItem extends NotificationListItemBase { constructor() { super(); @@ -251,14 +189,6 @@ class NotificationListItem extends ListItemBase { return NotificationListItemTemplate; } - static get staticAreaTemplate() { - return NotificationListItemPopoverTemplate; - } - - static get staticAreaStyles() { - return NotifactionListItemPopoverCss; - } - static async onDefine() { await Promise.all([ Button.define(), @@ -275,15 +205,6 @@ class NotificationListItem extends ListItemBase { ResizeHandler.deregister(this, this.onResizeBind); } - get footerItems() { - return this.footnotes.map((el, idx, arr) => { - return { - slotName: el._individualSlot, - showDivider: idx !== arr.length - 1, - }; - }); - } - get hasHeading() { return !!this.heading.length; } @@ -296,14 +217,6 @@ class NotificationListItem extends ListItemBase { return !!this.footnotes.length; } - get hasPriority() { - return this.priority !== Priority.None; - } - - get priorityIcon() { - return PRIORITY_ICONS_MAP[this.priority]; - } - get showMoreText() { return this.i18nBundle.getText(NOTIFICATIONLISTITEM_SHOW_MORE); } @@ -368,37 +281,11 @@ class NotificationListItem extends ListItemBase { return description.offsetHeight < description.scrollHeight; } - get overflowButtonDOM() { - return this.shadowRoot.querySelector(".ui5-nli-overflow-btn"); - } - - get showOverflow() { - return !!this.overflowActions.length; - } - - get overflowActions() { - if (this.actions.length <= 1) { - return []; - } - - return this.actionsInfo; - } - - get standardActions() { - if (this.actions.length > 1) { - return []; - } - - return this.actionsInfo; - } - - get actionsInfo() { - return this.actions.map(action => { + get footerItems() { + return this.footnotes.map((el, idx, arr) => { return { - icon: action.icon, - text: action.text, - press: this._onCustomActionPress.bind(this), - refItemid: action._id, + slotName: el._individualSlot, + showDivider: idx !== arr.length - 1, }; }); } @@ -420,11 +307,6 @@ class NotificationListItem extends ListItemBase { return ids.join(" "); } - - get rtl() { - return getRTL() ? "rtl" : undefined; - } - get classes() { return { content: { @@ -435,9 +317,7 @@ class NotificationListItem extends ListItemBase { /** * Event handlers - * */ - _onclick(event) { if (event.isMarked === "button") { return; @@ -449,21 +329,9 @@ class NotificationListItem extends ListItemBase { this._showMorePressed = !this._showMorePressed; } - _onBtnCloseClick() { - this.fireEvent("_close", { item: this }); - } - - _onBtnOverflowClick() { - this.openOverflow(); - } - _onkeydown(event) { super._onkeydown(event); - if (isSpace(event)) { - event.preventDefault(); - } - if (isEnter(event)) { this.fireItemPress(event); } @@ -506,38 +374,6 @@ class NotificationListItem extends ListItemBase { this._showMore = false; } - - _onCustomActionPress(event) { - const refItemId = event.target.getAttribute("data-ui5-external-action-item-id"); - - if (refItemId) { - this.getActionByID(refItemId).fireEvent("click", { - targetRef: event.target, - }, true); - - this.closeOverflow(); - } - } - - - getActionByID(id) { - return this.actions.find(action => action._id === id); - } - - async openOverflow() { - const overflowPopover = await this.getOverflowPopover(); - overflowPopover.openBy(this.overflowButtonDOM); - } - - async closeOverflow() { - const overflowPopover = await this.getOverflowPopover(); - overflowPopover.close(); - } - - async getOverflowPopover() { - const staticAreaItem = await this.getStaticAreaItemDomRef(); - return staticAreaItem.querySelector(".ui5-notification-overflow-popover"); - } } NotificationListItem.define(); diff --git a/packages/fiori/src/NotificationListItemBase.js b/packages/fiori/src/NotificationListItemBase.js new file mode 100644 index 000000000000..8662cc235d89 --- /dev/null +++ b/packages/fiori/src/NotificationListItemBase.js @@ -0,0 +1,222 @@ +import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; +import { isSpace } from "@ui5/webcomponents-base/dist/Keys.js"; +import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; + +import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; +import Priority from "@ui5/webcomponents/dist/types/Priority.js"; + +// Icons +import "@ui5/webcomponents-icons/dist/icons/decline.js"; +import "@ui5/webcomponents-icons/dist/icons/message-success.js"; +import "@ui5/webcomponents-icons/dist/icons/message-error.js"; +import "@ui5/webcomponents-icons/dist/icons/message-warning.js"; +import "@ui5/webcomponents-icons/dist/icons/overflow.js"; + +// Templates +import NotifactionOverflowActionsPopoverTemplate from "./generated/templates/NotifactionOverflowActionsPopoverTemplate.lit.js"; + +// Styles +import NotifactionOverflowActionsPopoverCss from "./generated/themes/NotifactionOverflowActionsPopover.css.js"; + +const PRIORITY_ICONS_MAP = { + "High": "message-error", + "Medium": "message-warning", + "Low": "message-success", +}; + +/** + * @public + */ +const metadata = { + managedSlots: true, + properties: /** @lends sap.ui.webcomponents.fiori.NotificationListItemBase.prototype */ { + + /** + * Defines the <code>heading</code> of the item. + * @type {string} + * @defaultvalue "" + * @public + */ + heading: { + type: String, + }, + + /** + * Defines the <code>priority</code> of the item. + * @type {Priority} + * @defaultvalue "None" + * @public + */ + priority: { + type: Priority, + defaultValue: Priority.None, + }, + + /** + * Defines if the <code>close</code> button would be displayed. + * @type {boolean} + * @defaultvalue false + * @public + */ + showClose: { + type: Boolean, + }, + }, + slots: /** @lends sap.ui.webcomponents.fiori.NotificationListItemBase.prototype */ { + + /** + * Defines the actions, displayed in the <code>ui5-li-notification-group</code>. + * <br><br> + * <b>Note:</b> use the <code>ui5-notification-overflow-action</code> component. + * + * @type {HTMLElement} + * @slot + * @public + */ + actions: { + type: HTMLElement, + }, + }, + events: /** @lends sap.ui.webcomponents.fiori.NotificationListItemBase.prototype */ { + /** + * Fired when the <code>Close</code> button is pressed. + * + * @event + * @public + */ + close: {}, + }, +}; + +/** + * @class + * + * The base class of the <code>NotificationListItem</code> and <code>NotificationListGroupItem</code>. + * + * @abstract + * @constructor + * @author SAP SE + * @alias sap.ui.webcomponents.fiori.NotificationListItemBase + * @extends ListItemBase + * @tagname ui5-li-notification-group + * @since 1.0.0-rc.8 + * @appenddocs NotificationOverflowAction + * @public + */ +class NotificationListItemBase extends ListItemBase { + + static get metadata() { + return metadata; + } + + static get render() { + return litRender; + } + + static get staticAreaTemplate() { + return NotifactionOverflowActionsPopoverTemplate; + } + + static get staticAreaStyles() { + return NotifactionOverflowActionsPopoverCss; + } + + get hasPriority() { + return this.priority !== Priority.None; + } + + get priorityIcon() { + return PRIORITY_ICONS_MAP[this.priority]; + } + + get overflowButtonDOM() { + return this.shadowRoot.querySelector("[overflow-btn]"); + } + + get showOverflow() { + return !!this.overflowActions.length; + } + + get overflowActions() { + if (this.actions.length <= 1) { + return []; + } + + return this.actionsInfo; + } + + get standardActions() { + if (this.actions.length > 1) { + return []; + } + + return this.actionsInfo; + } + + get actionsInfo() { + return this.actions.map(action => { + return { + icon: action.icon, + text: action.text, + press: this._onCustomActionClick.bind(this), + refItemid: action._id, + }; + }); + } + + get rtl() { + return getRTL() ? "rtl" : undefined; + } + + /** + * Event handlers + */ + _onBtnCloseClick() { + this.fireEvent("close", { item: this }); + } + + _onBtnOverflowClick() { + this.openOverflow(); + } + + _onCustomActionClick(event) { + const refItemId = event.target.getAttribute("data-ui5-external-action-item-id"); + + if (refItemId) { + this.getActionByID(refItemId).fireEvent("click", { + targetRef: event.target, + }, true); + + this.closeOverflow(); + } + } + + _onkeydown(event) { + super._onkeydown(event); + + if (isSpace(event)) { + event.preventDefault(); + } + } + + getActionByID(id) { + return this.actions.find(action => action._id === id); + } + + async openOverflow() { + const overflowPopover = await this.getOverflowPopover(); + overflowPopover.openBy(this.overflowButtonDOM); + } + + async closeOverflow() { + const overflowPopover = await this.getOverflowPopover(); + overflowPopover.close(); + } + + async getOverflowPopover() { + const staticAreaItem = await this.getStaticAreaItemDomRef(); + return staticAreaItem.querySelector(".ui5-notification-overflow-popover"); + } +} + +export default NotificationListItemBase; diff --git a/packages/fiori/src/themes/NotifactionListItemPopover.css b/packages/fiori/src/themes/NotifactionOverflowActionsPopover.css similarity index 64% rename from packages/fiori/src/themes/NotifactionListItemPopover.css rename to packages/fiori/src/themes/NotifactionOverflowActionsPopover.css index 6c1cbb347ef8..d0597b56a1f3 100644 --- a/packages/fiori/src/themes/NotifactionListItemPopover.css +++ b/packages/fiori/src/themes/NotifactionOverflowActionsPopover.css @@ -1,4 +1,4 @@ -.ui5-nli-overflow-list { +.ui5-notification-overflow-list { display: flex; flex-direction: column; padding: 0 0.5rem; diff --git a/packages/fiori/src/themes/NotificationListGroupItem.css b/packages/fiori/src/themes/NotificationListGroupItem.css index 2face279664b..3fe7645a3f46 100644 --- a/packages/fiori/src/themes/NotificationListGroupItem.css +++ b/packages/fiori/src/themes/NotificationListGroupItem.css @@ -2,15 +2,15 @@ @import "./NotificationListItemBase.css"; @import "./NotificationPrioIcon.css"; -:host(:not([collapsed])) .ui5-ng-toggle-btn { +:host(:not([collapsed])) .ui5-nli-group-toggle-btn { transform: rotate(90deg); } -:host([collapsed]) .ui5-ng-items { +:host([collapsed]) .ui5-nli-group-items { display: none; } -.ui5-ng-root { +.ui5-nli-group-root { display: flex; flex-direction: column; position: relative; @@ -18,7 +18,7 @@ box-sizing: border-box; } -.ui5-ng-header { +.ui5-nli-group-header { display: flex; align-items: center; padding: 0.75rem 0.5rem 0.25rem 0.75rem; @@ -28,12 +28,12 @@ cursor: default; } -.ui5-ng-toggle-btn { +.ui5-nli-group-toggle-btn { margin-right: 1rem; cursor: pointer; } -.ui5-ng-heading { +.ui5-nli-group-heading { color: var(--sapGroup_TitleTextColor); font-family: var(--sapFontFamily); font-size: var(--sapFontHeader6Size); @@ -42,11 +42,11 @@ text-overflow: ellipsis; } -.ui5-ng-divider { +.ui5-nli-group-divider { flex: 1; } -.ui5-ng-counter { +.ui5-nli-group-counter { margin-left: 0.25rem; margin-right: 1rem; color: var(--sapList_TableGroupHeaderTextColor); @@ -54,28 +54,28 @@ font-family: var(--sapFontHeaderFamily); } -.ui5-ng-action { +.ui5-nli-group-action { flex-shrink: 0; margin-right: 0.5rem; } -.ui5-ng-overflow-btn { +.ui5-nli-group-overflow-btn { margin-right: 0.5rem; } -[dir="rtl"] .ui5-ng-action { +[dir="rtl"] .ui5-nli-group-action { margin-left: 0.5rem; } -[dir="rtl"] .ui5-ng-overflow-btn { +[dir="rtl"] .ui5-nli-group-overflow-btn { margin-left: 0.5rem; } -[dir="rtl"] .ui5-ng-toggle-btn { +[dir="rtl"] .ui5-nli-group-toggle-btn { margin-left: 1rem; } -[dir="rtl"] .ui5-ng-counter { +[dir="rtl"] .ui5-nli-group-counter { margin-right: 0.25rem; margin-left: 1rem; } \ No newline at end of file diff --git a/packages/fiori/test/pages/NotificationListGroupItem.html b/packages/fiori/test/pages/NotificationListGroupItem.html index 8c1d8882d2cf..48c5a4ca2976 100644 --- a/packages/fiori/test/pages/NotificationListGroupItem.html +++ b/packages/fiori/test/pages/NotificationListGroupItem.html @@ -23,10 +23,10 @@ <h3>Properties</h3> <ul> <li>heading</li> - <li>priority</li> - <li>collapsed</li> - <li>show-close</li> - <li>show-counter</li> + <li>priority (default: "None")</li> + <li>collapsed (default: "false")</li> + <li>show-close (default: "false")</li> + <li>show-counter (default: "false")</li> </ul> <h3>Slots</h3> @@ -35,8 +35,15 @@ <h3>Slots</h3> <li>actions</li> </ul> + <h3>Events</h3> + <ul> + <li>close</li> + <li>toggle</li> + </ul> + <h3>Events on ui5-list level</h3> <ul> + <li>itemClose</li> <li>itemToggle</li> </ul> @@ -60,7 +67,7 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">3 Days</span> <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> - <ui5-notification-overflow-action icon="reject" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> <ui5-li-notification diff --git a/packages/fiori/test/pages/NotificationListItem.html b/packages/fiori/test/pages/NotificationListItem.html index 898ca4c7dea4..1a71aa1da9a0 100644 --- a/packages/fiori/test/pages/NotificationListItem.html +++ b/packages/fiori/test/pages/NotificationListItem.html @@ -20,29 +20,13 @@ <br/><br/> - <div style="display: flex; flex-direction: column;"> - <ui5-label>click event:</ui5-label> - - <ui5-input id="clickInput"> - </ui5-input> - </div> - - <br/> - - <div style="display: flex; flex-direction: column;"> - <ui5-label>close event:</ui5-label> - - <ui5-input id="closeInput"> - </ui5-input> - </div> - <h3>Properties</h3> <ul> <li>heading</li> - <li>truncate</li> - <li>priority</li> - <li>read</li> - <li>show-close</li> + <li>truncate (default: "false")</li> + <li>priority (default: "None")</li> + <li>read (default: "false")</li> + <li>show-close (default: "false")</li> </ul> <h3>Slots</h3> @@ -52,6 +36,12 @@ <h3>Slots</h3> <li>footnotes</li> </ul> + <h3>Events</h3> + <ul> + <li>click</li> + <li>close</li> + </ul> + <h3>Events on ui5-list level</h3> <ul> <li>itemClick</li> @@ -115,6 +105,21 @@ <h3>Events on ui5-list level</h3> </ui5-list> <br><br> + <div style="display: flex; flex-direction: column;"> + <ui5-label>click event:</ui5-label> + + <ui5-input id="clickInput"> + </ui5-input> + </div> + + <br><br> + + <div style="display: flex; flex-direction: column;"> + <ui5-label>close event:</ui5-label> + + <ui5-input id="closeInput"> + </ui5-input> + </div> <ui5-list id="notificationList2" header-text="Notifications heading and content 'wraps'"> @@ -238,7 +243,10 @@ <h3>Events on ui5-list level</h3> }); notificationList2.addEventListener("itemClick", function(event) { - wcToastBS.textContent = event.detail.item.heading; + var item = event.detail.item; + item.read = true; + + wcToastBS.textContent = item.heading; wcToastBS.show(); }); diff --git a/packages/main/src/List.js b/packages/main/src/List.js index 3a07f3939118..859d89c3bd75 100644 --- a/packages/main/src/List.js +++ b/packages/main/src/List.js @@ -324,7 +324,7 @@ class List extends UI5Element { this._previouslySelectedItem = null; this.addEventListener("ui5-_press", this.onItemPress.bind(this)); - this.addEventListener("ui5-_close", this.onItemClose.bind(this)); + this.addEventListener("ui5-close", this.onItemClose.bind(this)); this.addEventListener("ui5-toggle", this.onItemToggle.bind(this)); this.addEventListener("ui5-_focused", this.onItemFocused.bind(this)); this.addEventListener("ui5-_forwardAfter", this.onForwardAfter.bind(this)); From 5eec2f73fb2ea82fe763920c1328a1f2249dc9ac Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Wed, 6 May 2020 21:28:18 +0300 Subject: [PATCH 11/22] mark Link press like the Button --- .../fiori/src/NotificationListGroupItem.hbs | 2 +- .../fiori/src/NotificationListGroupItem.js | 54 +++++++++--- packages/fiori/src/NotificationListItem.hbs | 3 + packages/fiori/src/NotificationListItem.js | 84 ++++++++++++++----- .../fiori/src/NotificationListItemBase.js | 7 +- .../fiori/src/i18n/messagebundle.properties | 30 +++++-- .../src/themes/NotificationListGroupItem.css | 1 - .../src/themes/NotificationListItemBase.css | 2 + packages/main/src/Link.hbs | 6 +- packages/main/src/Link.js | 16 ++++ packages/main/src/ListItemBase.js | 4 +- packages/main/src/themes/Link.css | 1 - 12 files changed, 165 insertions(+), 45 deletions(-) diff --git a/packages/fiori/src/NotificationListGroupItem.hbs b/packages/fiori/src/NotificationListGroupItem.hbs index f4b4080c50ce..1b055f44f3e8 100644 --- a/packages/fiori/src/NotificationListGroupItem.hbs +++ b/packages/fiori/src/NotificationListGroupItem.hbs @@ -6,7 +6,7 @@ role="option" tabindex="{{_tabIndex}}" dir="{{rtl}}" - aria-labelledby="{{_id}}-heading {{_id}}-invisibleText" + aria-labelledby="{{ariaLabelledBy}}" > <div class="ui5-nli-group-header"> <ui5-button diff --git a/packages/fiori/src/NotificationListGroupItem.js b/packages/fiori/src/NotificationListGroupItem.js index 46b0966d06ef..333beffb91af 100644 --- a/packages/fiori/src/NotificationListGroupItem.js +++ b/packages/fiori/src/NotificationListGroupItem.js @@ -1,16 +1,19 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; +import Priority from "@ui5/webcomponents/dist/types/Priority.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; import NotificationListItemBase from "./NotificationListItemBase.js"; // Texts import { - NOTIFICATIONGROUPITEM_TXT, - NOTIFICATIONGROUPITEM_PRIORITY_TXT, - NOTIFICATIONGROUPITEM_COUNTER_TXT, - NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE, - NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE, + NOTIFICATION_LIST_GROUP_ITEM_TXT, + NOTIFICATION_LIST_GROUP_ITEM_COUNTER_TXT, + NOTIFICATION_LIST_ITEM_HIGH_PRIORITY_TXT, + NOTIFICATION_LIST_ITEM_MEDIUM_PRIORITY_TXT, + NOTIFICATION_LIST_ITEM_LOW_PRIORITY_TXT, + NOTIFICATION_LIST_ITEM_OVERLOW_BTN_TITLE, + NOTIFICATION_LIST_ITEM_CLOSE_BTN_TITLE, } from "./generated/i18n/i18n-defaults.js"; // Templates @@ -147,20 +150,49 @@ class NotificationListGroupItem extends NotificationListItemBase { } get overflowBtnTitle() { - return this.i18nBundle.getText(NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE); + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_OVERLOW_BTN_TITLE); } get closeBtnTitle() { - return this.i18nBundle.getText(NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE); + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_CLOSE_BTN_TITLE); + } + + get priorityText() { + if (this.priority === Priority.High) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_HIGH_PRIORITY_TXT); + } + + if (this.priority === Priority.Medium) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_MEDIUM_PRIORITY_TXT); + } + + if (this.priority === Priority.Low) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_LOW_PRIORITY_TXT); + } + + return ""; } get accInvisibleText() { - const groupTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_TXT); - const prioTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_PRIORITY_TXT); - const counterTxt = this.i18nBundle.getText(NOTIFICATIONGROUPITEM_COUNTER_TXT); + const groupTxt = this.i18nBundle.getText(NOTIFICATION_LIST_GROUP_ITEM_TXT); + const counterTxt = this.i18nBundle.getText(NOTIFICATION_LIST_GROUP_ITEM_COUNTER_TXT); const counter = this.showCounter ? `${counterTxt} ${this.itemsCount}` : ""; + const priorityText = this.priorityText; + + return `${groupTxt} ${priorityText} ${counter}`; + } + + get ariaLabelledBy() { + const id = this._id; + const ids = []; + + if (this.hasHeading) { + ids.push(`${id}-heading`); + } + + ids.push(`${id}-invisibleText`); - return `${groupTxt}. ${this.priority} ${prioTxt}. ${counter}`; + return ids.join(" "); } /** diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index a1b09c818675..1d1940581354 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -76,10 +76,13 @@ ?hidden="{{hideShowMore}}" @click="{{_onShowMoreClick}}" aria-hidden="true" + href="#" {{!--without href ENTER does not trigger click --}} > {{showMoreText}} </ui5-link> </div> + + <span id="{{_id}}-invisibleText" class="ui5-hidden-text">{{accInvisibleText}}</span> </div> <div class="ui5-nli-avatar"> diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 42501fad07a0..8e448b3690ee 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -4,15 +4,23 @@ import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18 import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js"; import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; +import Priority from "@ui5/webcomponents/dist/types/Priority.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; import NotificationListItemBase from "./NotificationListItemBase.js"; // Texts import { - NOTIFICATIONLISTITEM_SHOW_MORE, - NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE, - NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE, + NOTIFICATION_LIST_ITEM_TXT, + NOTIFICATION_LIST_ITEM_READ, + NOTIFICATION_LIST_ITEM_UNREAD, + NOTIFICATION_LIST_ITEM_SHOW_MORE, + NOTIFICATION_LIST_ITEM_SHOW_LESS, + NOTIFICATION_LIST_ITEM_HIGH_PRIORITY_TXT, + NOTIFICATION_LIST_ITEM_MEDIUM_PRIORITY_TXT, + NOTIFICATION_LIST_ITEM_LOW_PRIORITY_TXT, + NOTIFICATION_LIST_ITEM_OVERLOW_BTN_TITLE, + NOTIFICATION_LIST_ITEM_CLOSE_BTN_TITLE, } from "./generated/i18n/i18n-defaults.js"; // Templates @@ -205,10 +213,6 @@ class NotificationListItem extends NotificationListItemBase { ResizeHandler.deregister(this, this.onResizeBind); } - get hasHeading() { - return !!this.heading.length; - } - get hasDesc() { return !!this.description.length; } @@ -218,15 +222,19 @@ class NotificationListItem extends NotificationListItemBase { } get showMoreText() { - return this.i18nBundle.getText(NOTIFICATIONLISTITEM_SHOW_MORE); + if (this._showMorePressed) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_SHOW_LESS); + } + + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_SHOW_MORE); } get overflowBtnTitle() { - return this.i18nBundle.getText(NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE); + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_OVERLOW_BTN_TITLE); } get closeBtnTitle() { - return this.i18nBundle.getText(NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE); + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_CLOSE_BTN_TITLE); } get hideShowMore() { @@ -291,22 +299,49 @@ class NotificationListItem extends NotificationListItemBase { } get ariaLabelledBy() { + const id = this._id; const ids = []; if (this.hasHeading) { - ids.push(`${this._id}-heading`); + ids.push(`${id}-heading`); } if (this.hasDesc) { - ids.push(`${this._id}-description`); + ids.push(`${id}-description`); } if (this.hasFootNotes) { - ids.push(`${this._id}-footer`); + ids.push(`${id}-footer`); } + ids.push(`${id}-invisibleText`); + return ids.join(" "); } + get priorityText() { + if (this.priority === Priority.High) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_HIGH_PRIORITY_TXT); + } + + if (this.priority === Priority.Medium) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_MEDIUM_PRIORITY_TXT); + } + + if (this.priority === Priority.Low) { + return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_LOW_PRIORITY_TXT); + } + + return ""; + } + + get accInvisibleText() { + const notifcatationTxt = this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_TXT); + const readTxt = this.read ? this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_READ) : this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_UNREAD); + const priorityText = this.priorityText; + + return `${notifcatationTxt} ${readTxt} ${priorityText}`; + } + get classes() { return { content: { @@ -319,13 +354,11 @@ class NotificationListItem extends NotificationListItemBase { * Event handlers */ _onclick(event) { - if (event.isMarked === "button") { - return; - } this.fireItemPress(event); } - _onShowMoreClick() { + _onShowMoreClick(event) { + event.preventDefault(); this._showMorePressed = !this._showMorePressed; } @@ -338,7 +371,16 @@ class NotificationListItem extends NotificationListItemBase { } _onkeyup(event) { - if (isSpace(event)) { + super._onkeyup(event); + + const space = isSpace(event); + + if (space && event.isMarked === "link") { + this._onShowMoreClick(event); + return; + } + + if (space) { this.fireItemPress(event); } } @@ -346,7 +388,11 @@ class NotificationListItem extends NotificationListItemBase { /** * Private */ - fireItemPress() { + fireItemPress(event) { + if (event.isMarked === "button" || event.isMarked === "link") { + return; + } + this.fireEvent("_press", { item: this }); } diff --git a/packages/fiori/src/NotificationListItemBase.js b/packages/fiori/src/NotificationListItemBase.js index 8662cc235d89..19ff3d8d6748 100644 --- a/packages/fiori/src/NotificationListItemBase.js +++ b/packages/fiori/src/NotificationListItemBase.js @@ -65,7 +65,7 @@ const metadata = { slots: /** @lends sap.ui.webcomponents.fiori.NotificationListItemBase.prototype */ { /** - * Defines the actions, displayed in the <code>ui5-li-notification-group</code>. + * Defines the actions, displayed in the top-right area. * <br><br> * <b>Note:</b> use the <code>ui5-notification-overflow-action</code> component. * @@ -104,7 +104,6 @@ const metadata = { * @public */ class NotificationListItemBase extends ListItemBase { - static get metadata() { return metadata; } @@ -121,6 +120,10 @@ class NotificationListItemBase extends ListItemBase { return NotifactionOverflowActionsPopoverCss; } + get hasHeading() { + return !!this.heading.length; + } + get hasPriority() { return this.priority !== Priority.None; } diff --git a/packages/fiori/src/i18n/messagebundle.properties b/packages/fiori/src/i18n/messagebundle.properties index add1934f2376..e7ec583121bb 100644 --- a/packages/fiori/src/i18n/messagebundle.properties +++ b/packages/fiori/src/i18n/messagebundle.properties @@ -1,23 +1,37 @@ #This is the resource bundle for the UI5 Web Components #__ldi.translation.uuid=95d47730-48a4-4d6d-92f6-61f8c9d8f274 +#XTXT: Text for the NotificationListGroupItem +NOTIFICATION_LIST_ITEM_TXT=Notification + #XTXT: Text for the 'ShowMore' link in the NotificationListItem -NOTIFICATIONLISTITEM_SHOW_MORE=Show More +NOTIFICATION_LIST_ITEM_SHOW_MORE=Show More + +#XTXT: Text for the 'ShowLess' link in the NotificationListItem +NOTIFICATION_LIST_ITEM_SHOW_LESS=Show Less #XBUT: Tooltip text for 'Overflow' button in the NotificationListItem -NOTIFICATIONLISTITEM_OVERLOW_BTN_TITLE=More +NOTIFICATION_LIST_ITEM_OVERLOW_BTN_TITLE=More #XBUT: Tooltip text for 'Close' button in the NotificationListItem -NOTIFICATIONLISTITEM_CLOSE_BTN_TITLE=Close +NOTIFICATION_LIST_ITEM_CLOSE_BTN_TITLE=Close -#XTXT: Text for the NotificationListGroupItem -NOTIFICATIONGROUPITEM_TXT=Notification group +#XTXT: Text for the NotificationListItem "read" state +NOTIFICATION_LIST_ITEM_READ=read -#XTXT: Text for the NotificationListGroupItem priority -NOTIFICATIONGROUPITEM_PRIORITY_TXT=Priority +#XTXT: Text for the NotificationListGroupItem "unread" state +NOTIFICATION_LIST_ITEM_UNREAD=unread + +#XTXT: Text for the NotificationListItem priority +NOTIFICATION_LIST_ITEM_HIGH_PRIORITY_TXT=High Priority +NOTIFICATION_LIST_ITEM_MEDIUM_PRIORITY_TXT=Medium Priority +NOTIFICATION_LIST_ITEM_LOW_PRIORITY_TXT=Low Priority + +#XTXT: Text for the NotificationListGroupItem +NOTIFICATION_LIST_GROUP_ITEM_TXT=Notification group #XTXT: Text for the NotificationListGroupItem counter -NOTIFICATIONGROUPITEM_COUNTER_TXT=Counter +NOTIFICATION_LIST_GROUP_ITEM_COUNTER_TXT=Counter #XBUT: Button text for cancel button in the UploadCollectionItem UPLOADCOLLECTIONITEM_CANCELBUTTON_TEXT=Cancel diff --git a/packages/fiori/src/themes/NotificationListGroupItem.css b/packages/fiori/src/themes/NotificationListGroupItem.css index 3fe7645a3f46..2deecbeb150a 100644 --- a/packages/fiori/src/themes/NotificationListGroupItem.css +++ b/packages/fiori/src/themes/NotificationListGroupItem.css @@ -1,4 +1,3 @@ -@import "./InvisibleTextStyles.css"; @import "./NotificationListItemBase.css"; @import "./NotificationPrioIcon.css"; diff --git a/packages/fiori/src/themes/NotificationListItemBase.css b/packages/fiori/src/themes/NotificationListItemBase.css index 19710cdfb069..c300084fcf31 100644 --- a/packages/fiori/src/themes/NotificationListItemBase.css +++ b/packages/fiori/src/themes/NotificationListItemBase.css @@ -1,3 +1,5 @@ +@import "./InvisibleTextStyles.css"; + :host(:not([hidden])) { display: block; width: 100%; diff --git a/packages/main/src/Link.hbs b/packages/main/src/Link.hbs index e045f93b582d..87745856bb8a 100644 --- a/packages/main/src/Link.hbs +++ b/packages/main/src/Link.hbs @@ -6,7 +6,11 @@ rel="{{_rel}}" tabindex="{{tabIndex}}" ?disabled="{{disabled}}" - aria-disabled="{{ariaDisabled}}"> + aria-disabled="{{ariaDisabled}}" + @focusin={{_onfocusin}} + @click={{_onclick}} + @keydown={{_onkeydown}} + @keyup={{_onkeyup}}> <slot></slot> {{#if hasLinkType}} <span class="ui5-hidden-text">{{linkTypeText}}</span> diff --git a/packages/main/src/Link.js b/packages/main/src/Link.js index 9d776d9216dc..0c59d6c3dba6 100644 --- a/packages/main/src/Link.js +++ b/packages/main/src/Link.js @@ -232,6 +232,22 @@ class Link extends UI5Element { static async onDefine() { await fetchI18nBundle("@ui5/webcomponents"); } + + _onclick(event) { + event.isMarked = "link"; + } + + _onfocusin(event) { + event.isMarked = "link"; + } + + _onkeydown(event) { + event.isMarked = "link"; + } + + _onkeyup(event) { + event.isMarked = "link"; + } } Link.define(); diff --git a/packages/main/src/ListItemBase.js b/packages/main/src/ListItemBase.js index 62b7597393c6..6e34a76f4e7f 100644 --- a/packages/main/src/ListItemBase.js +++ b/packages/main/src/ListItemBase.js @@ -71,7 +71,7 @@ class ListItemBase extends UI5Element { } _onfocusin(event) { - if (event.isMarked === "button") { + if (event.isMarked === "button" || event.isMarked === "link") { return; } @@ -93,6 +93,8 @@ class ListItemBase extends UI5Element { } } + _onkeyup() {} + _handleTabNext(event) { const target = event.target; diff --git a/packages/main/src/themes/Link.css b/packages/main/src/themes/Link.css index b7e15a39a19f..ca1f4fd6f626 100644 --- a/packages/main/src/themes/Link.css +++ b/packages/main/src/themes/Link.css @@ -16,7 +16,6 @@ pointer-events: none; } -:host(:not([disabled])) .ui5-link-root:hover, :host(:not([disabled])) .ui5-link-root:hover { text-decoration: underline; color: var(--sapLinkColor); From 6c2b99bc983542fa1ba02bd1e5b3371be1206f58 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Thu, 7 May 2020 00:06:02 +0300 Subject: [PATCH 12/22] add tests --- .../fiori/src/NotificationListGroupItem.hbs | 3 + .../fiori/src/NotificationListGroupItem.js | 4 +- packages/fiori/src/NotificationListItem.hbs | 3 + packages/fiori/src/NotificationListItem.js | 2 + .../fiori/src/NotificationOverflowAction.js | 1 + .../test/pages/NotificationListGroupItem.html | 6 +- .../test/pages/NotificationListItem.html | 45 +--- .../pages/NotificationList_test_page.html | 199 ++++++++++++++++++ .../fiori/test/specs/NotificationList.spec.js | 154 ++++++++++++++ .../test/specs/NotificationListItem.spec.js | 0 10 files changed, 371 insertions(+), 46 deletions(-) create mode 100644 packages/fiori/test/pages/NotificationList_test_page.html create mode 100644 packages/fiori/test/specs/NotificationList.spec.js delete mode 100644 packages/fiori/test/specs/NotificationListItem.spec.js diff --git a/packages/fiori/src/NotificationListGroupItem.hbs b/packages/fiori/src/NotificationListGroupItem.hbs index 1b055f44f3e8..0cbbf3e33fa8 100644 --- a/packages/fiori/src/NotificationListGroupItem.hbs +++ b/packages/fiori/src/NotificationListGroupItem.hbs @@ -14,6 +14,7 @@ design="Transparent" @click="{{_onBtnToggleClick}}" class="ui5-nli-group-toggle-btn" + toggle-btn ></ui5-button> {{#if hasPriority}} @@ -50,6 +51,7 @@ class="ui5-nli-group-action" @click="{{this.press}}" data-ui5-external-action-item-id="{{this.refItemid}}" + custom-btn > {{this.text}} </ui5-button> @@ -63,6 +65,7 @@ design="Transparent" @click="{{_onBtnCloseClick}}" title="{{closeBtnTitle}}" + close-btn ></ui5-button> {{/if}} diff --git a/packages/fiori/src/NotificationListGroupItem.js b/packages/fiori/src/NotificationListGroupItem.js index 333beffb91af..52f5f4e058f1 100644 --- a/packages/fiori/src/NotificationListGroupItem.js +++ b/packages/fiori/src/NotificationListGroupItem.js @@ -1,6 +1,7 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; import Priority from "@ui5/webcomponents/dist/types/Priority.js"; +import List from "@ui5/webcomponents/dist/List.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; import NotificationListItemBase from "./NotificationListItemBase.js"; @@ -90,7 +91,7 @@ const metadata = { * <li><code>Toggle</code> button to expand and collapse the group</li> * <li><code>Priority</code> icon to display the priority of the group</li> * <li><code>Heading</code> to entitle the group</li> - * <li>Custom actions</li> + * <li>Custom actions - with the use of <code>ui5-notification-overflow-action</code></li> * <li>Items of the group</li> * </ul> * @@ -135,6 +136,7 @@ class NotificationListGroupItem extends NotificationListItemBase { static async onDefine() { await Promise.all([ + List.define(), Button.define(), Icon.define(), fetchI18nBundle("@ui5/webcomponents-fiori"), diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index 1d1940581354..d7b140611498 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -27,6 +27,7 @@ class="ui5-nli-action" @click="{{this.press}}" data-ui5-external-action-item-id="{{this.refItemid}}" + custom-btn > {{this.text}} </ui5-button> @@ -39,6 +40,7 @@ design="Transparent" @click="{{_onBtnCloseClick}}" title="{{closeBtnTitle}}" + close-btn ></ui5-button> {{/if}} </div> @@ -77,6 +79,7 @@ @click="{{_onShowMoreClick}}" aria-hidden="true" href="#" {{!--without href ENTER does not trigger click --}} + showMore-btn > {{showMoreText}} </ui5-link> diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 8e448b3690ee..eadbf433fb0a 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -6,6 +6,7 @@ import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; import Priority from "@ui5/webcomponents/dist/types/Priority.js"; import Button from "@ui5/webcomponents/dist/Button.js"; +import Link from "@ui5/webcomponents/dist/Link.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; import NotificationListItemBase from "./NotificationListItemBase.js"; @@ -201,6 +202,7 @@ class NotificationListItem extends NotificationListItemBase { await Promise.all([ Button.define(), Icon.define(), + Link.define(), fetchI18nBundle("@ui5/webcomponents-fiori"), ]); } diff --git a/packages/fiori/src/NotificationOverflowAction.js b/packages/fiori/src/NotificationOverflowAction.js index 3c5efb682adc..aa0527315180 100644 --- a/packages/fiori/src/NotificationOverflowAction.js +++ b/packages/fiori/src/NotificationOverflowAction.js @@ -25,6 +25,7 @@ const metadata = { * <ui5-link target="_blank" href="https://openui5.hana.ondemand.com/test-resources/sap/m/demokit/iconExplorer/webapp/index.html" class="api-table-content-cell-link">Icon Explorer</ui5-link>. * * @type {string} + * @defaultvalue "" * @public */ icon: { diff --git a/packages/fiori/test/pages/NotificationListGroupItem.html b/packages/fiori/test/pages/NotificationListGroupItem.html index 48c5a4ca2976..7b7e8abc37c9 100644 --- a/packages/fiori/test/pages/NotificationListGroupItem.html +++ b/packages/fiori/test/pages/NotificationListGroupItem.html @@ -248,7 +248,7 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">Office Notifications</span> <span slot="footnotes">3 Days</span> - <ui5-notification-overflow-action id="acceptBtn2InPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> </ui5-li-notification-group> @@ -310,15 +310,11 @@ <h3>Events on ui5-list level</h3> acceptBtnInPopover.addEventListener("click", function(event) { wcToastBS.textContent = "Accept btn In popover btn clicked"; wcToastBS.show(); - - console.log("acceptBtnInPopover btn clicked"); }); rejectBtnInPopover.addEventListener("click", function(event) { wcToastBS.textContent = "Reject btn In popover btn clicked"; wcToastBS.show(); - - console.log("rejectBtnInPopover btn clicked"); }); openNotifications.addEventListener("click", function(event) { diff --git a/packages/fiori/test/pages/NotificationListItem.html b/packages/fiori/test/pages/NotificationListItem.html index 1a71aa1da9a0..f06d2f2369b0 100644 --- a/packages/fiori/test/pages/NotificationListItem.html +++ b/packages/fiori/test/pages/NotificationListItem.html @@ -77,7 +77,7 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">Office Notifications</span> <span slot="footnotes">3 Days</span> - <ui5-notification-overflow-action id="acceptBtn2" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> <ui5-li-notification @@ -105,22 +105,6 @@ <h3>Events on ui5-list level</h3> </ui5-list> <br><br> - <div style="display: flex; flex-direction: column;"> - <ui5-label>click event:</ui5-label> - - <ui5-input id="clickInput"> - </ui5-input> - </div> - - <br><br> - - <div style="display: flex; flex-direction: column;"> - <ui5-label>close event:</ui5-label> - - <ui5-input id="closeInput"> - </ui5-input> - </div> - <ui5-list id="notificationList2" header-text="Notifications heading and content 'wraps'"> @@ -166,7 +150,6 @@ <h3>Events on ui5-list level</h3> </ui5-li-notification> </ui5-list> - <ui5-toast id="wcToastBS" duration="2000"></ui5-toast> <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> @@ -232,21 +215,18 @@ <h3>Events on ui5-list level</h3> <script> notificationList.addEventListener("itemClick", function(event) { - clickInput.value = event.detail.item.heading; + wcToastBS.textContent = event.detail.item.heading; + wcToastBS.show(); }); notificationList.addEventListener("itemClose", function(event) { - closeInput.value = event.detail.item.heading; - wcToastBS.textContent = event.detail.item.heading; wcToastBS.show(); }); notificationList2.addEventListener("itemClick", function(event) { - var item = event.detail.item; - item.read = true; - - wcToastBS.textContent = item.heading; + event.detail.item.read = true; + wcToastBS.textContent = event.detail.item.heading; wcToastBS.show(); }); @@ -258,36 +238,21 @@ <h3>Events on ui5-list level</h3> acceptBtn.addEventListener("click", function(event) { wcToastBS.textContent = "Accept btn clicked"; wcToastBS.show(); - - console.log("Accept btn clicked"); - }); - - acceptBtn2.addEventListener("click", function(event) { - wcToastBS.textContent = "Accept2 btn clicked"; - wcToastBS.show(); - - console.log("Accept2 btn clicked"); }); acceptBtnInPopover.addEventListener("click", function(event) { wcToastBS.textContent = "Accept btn In popover btn clicked"; wcToastBS.show(); - - console.log("acceptBtnInPopover btn clicked"); }); rejectBtn.addEventListener("click", function(event) { wcToastBS.textContent = "Reject btn clicked"; wcToastBS.show(); - - console.log("Reject btn clicked"); }); rejectBtnInPopover.addEventListener("click", function(event) { wcToastBS.textContent = "Reject btn In popover btn clicked"; wcToastBS.show(); - - console.log("rejectBtnInPopover btn clicked"); }); openNotifications.addEventListener("click", function(event) { diff --git a/packages/fiori/test/pages/NotificationList_test_page.html b/packages/fiori/test/pages/NotificationList_test_page.html new file mode 100644 index 000000000000..2364efc81159 --- /dev/null +++ b/packages/fiori/test/pages/NotificationList_test_page.html @@ -0,0 +1,199 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>NotificationListItem and NotificationListGroupItem</title> + + <script src="../../webcomponentsjs/webcomponents-loader.js"></script> + <script src="../../resources/bundle.esm.js" type="module"></script> + <script nomodule src="../../resources/bundle.es5.js"></script> + + <script>delete Document.prototype.adoptedStyleSheets;</script> + + <style> + .test-section { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + </style> +</head> + +<body style="background-color: var(--sapBackgroundColor);"> + + <ui5-title>Test NotificationListItem and NotificationListGroupItem</ui5-title> + + <div class="test-section"> + <ui5-label>itemClick event:</ui5-label> + + <ui5-input id="clickInput"> + </ui5-input> + </div> + + <div class="test-section"> + <ui5-label>itemClose event:</ui5-label> + + <ui5-input id="closeInput"> + </ui5-input> + </div> + + <div class="test-section"> + <ui5-label>itemToggle event:</ui5-label> + + <ui5-input id="toggleInput"> + </ui5-input> + </div> + + <div class="test-section"> + <ui5-label>custom action click:</ui5-label> + + <ui5-input id="customActionInput"> + </ui5-input> + </div> + + <div class="test-section"> + + <ui5-list id="notificationList" style="width: 500px" header-text="Notifications grouped"> + <ui5-li-notification-group + id="nlgi1" + show-close + show-counter + heading="Orders" + priority="High" + > + <ui5-li-notification + id="nli1" + show-close + truncate + heading="New order #2201" + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action id="acceptBtnInOverflow" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + id="nli2" + show-close + truncate + heading="New order #2202" + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action id="acceptBtn" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action id="acceptBtnInOverflow2" icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + + <ui5-li-notification-group + show-close + show-counter + heading="Payments" + priority="High" + > + <ui5-li-notification + id="nli3" + show-close + heading="New payment #2900" + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-li-notification + id="nli4" + show-close + heading="New payment #2901" + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + </ui5-li-notification-group> + + <ui5-li-notification-group + id="nlgi3" + show-close + show-counter + heading="Collapsed" + priority="High" + collapsed + > + <ui5-li-notification + id="nli5" + show-close + heading="New payment #2900" + priority="High" + > + And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. + <ui5-avatar icon="employee" size="XS" slot="avatar"></ui5-avatar> + + <span slot="footnotes">Office Notifications</span> + <span slot="footnotes">3 Days</span> + + <ui5-notification-overflow-action icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification> + + <ui5-notification-overflow-action icon="accept" text="Accept All" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" text="Reject All" slot="actions"></ui5-notification-overflow-action> + </ui5-li-notification-group> + </ui5-list> + </div> + + <script> + notificationList.addEventListener("ui5-itemClick", function(event) { + clickInput.value = event.detail.item.heading; + }); + + notificationList.addEventListener("ui5-itemClose", function(event) { + closeInput.value = event.detail.item.heading; + }); + + notificationList.addEventListener("ui5-itemToggle", function(event) { + toggleInput.value = event.detail.item.heading; + }); + + var counter = 0; + acceptBtn.addEventListener("ui5-click", function(event) { + customActionInput.value = ++counter; + }); + + acceptBtnInOverflow.addEventListener("ui5-click", function(event) { + customActionInput.value = ++counter; + }); + + acceptBtnInOverflow2.addEventListener("ui5-click", function(event) { + customActionInput.value = ++counter; + }); + </script> +</body> +</html> diff --git a/packages/fiori/test/specs/NotificationList.spec.js b/packages/fiori/test/specs/NotificationList.spec.js new file mode 100644 index 000000000000..7742f930442a --- /dev/null +++ b/packages/fiori/test/specs/NotificationList.spec.js @@ -0,0 +1,154 @@ +const assert = require("chai").assert; + +describe("Notification List Item Tests", () => { + before(() => { + browser.url("http://localhost:8081/test-resources/pages/NotificationList_test_page.html"); + }); + + it("tests itemClick fired", () => { + const clickInput = $("#clickInput"); + const EXPECTED_RESULT = "New order #2201"; + const firstItem = $("#nli1"); + + // act + firstItem.click(); + + // assert + assert.strictEqual(clickInput.getProperty("value"), EXPECTED_RESULT, + "The itemClick has been fired."); + }); + + it("tests itemClose fired", () => { + const closeInput = $("#closeInput"); + const EXPECTED_RESULT_1 = "Orders"; + const EXPECTED_RESULT_2 = "New order #2201"; + const firstGroupItem = $("#nlgi1"); + const firstItem = $("#nli1"); + const btnListGroupItemClose = firstGroupItem.shadow$("[close-btn]"); + const btnListItemClose = firstItem.shadow$("[close-btn]"); + + // act + btnListGroupItemClose.click(); + + // assert + assert.strictEqual(closeInput.getProperty("value"), EXPECTED_RESULT_1, + "The itemClose of list group item has been fired."); + + // act + btnListItemClose.click(); + + // assert + assert.strictEqual(closeInput.getProperty("value"), EXPECTED_RESULT_2, + "The itemClose of list item has been fired."); + }); + + it("tests click fired on custom actions", () => { + const customActionInput = $("#customActionInput"); + const secondItem = $("#nli2"); + const customAction = secondItem.shadow$("[custom-btn]"); + + // act + customAction.click(); + + // assert + assert.strictEqual(customActionInput.getProperty("value"), "1", + "The click on custom action has been fired."); + }); + + it("tests itemToggle fired", () => { + const toggleInput = $("#toggleInput"); + const EXPECTED_RESULT = "Orders"; + const firstGroupItem = $("#nlgi1"); + const btnListGroupItemToggle = firstGroupItem.shadow$("[toggle-btn]"); + + // act + btnListGroupItemToggle.click(); + + // assert + assert.strictEqual(toggleInput.getProperty("value"), EXPECTED_RESULT, + "The itemToggle of list group item has been fired."); + + // reset + btnListGroupItemToggle.click(); + }); + + it("tests click on ShowMore", () => { + const firstItem = $("#nli1"); + const btnListItemShowMore = firstItem.shadow$("[showMore-btn]"); + const content = firstItem.shadow$(".ui5-nli-content"); + + const hightBefore = content.getSize("height"); + + // act + btnListItemShowMore.click(); + + const hightAfter = content.getSize("height"); + + // assert + assert.ok(hightAfter > hightBefore, + "The content has been expanded by the ShowMore button."); + }); + + it("tests no ShowMore, when truncate is not enabled", () => { + const thirdItem = $("#nli3"); + const btnListItemShowMore = thirdItem.shadow$("[showMore-btn]"); + + assert.strictEqual(btnListItemShowMore.getAttribute("hidden"), "true", + "The ShowMore button is not displayed."); + }); + + it("tests no custom actions, when group item collapsed", () => { + const fifthItem = $("#nlgi3"); + const overflow = fifthItem.shadow$("[overflow-btn]"); + + assert.ok(!overflow.isExisting(), + "The custom actions are hidden when the group is collapsed"); + }); + + it("tests List Group Item ACC invisible text", () => { + const EXPECTED_RESULT = "Notification group High Priority Counter 2"; + const firstGroupItem = $("#nlgi1"); + const invisibleText = firstGroupItem.shadow$(".ui5-hidden-text"); + + // assert + assert.strictEqual(invisibleText.getText(), EXPECTED_RESULT, + "The invisible text is correct."); + }); + + it("tests List Group Item ACC ariaLabelledBy", () => { + const firstGroupItem = $("#nlgi1"); + const firstGroupItemRoot = firstGroupItem.shadow$(".ui5-nli-group-root"); + const headingId = `${firstGroupItem.getProperty("_id")}-heading`; + const inivisbleTextId = `${firstGroupItem.getProperty("_id")}-invisibleText`; + const EXPECTED_ARIA_LABELLED_BY = `${headingId} ${inivisbleTextId}`; + + // assert + assert.strictEqual(firstGroupItemRoot.getAttribute("aria-labelledby"), EXPECTED_ARIA_LABELLED_BY, + "The ariaLabelledBy text is correct."); + }); + + it("tests List Item ACC invisible text", () => { + const EXPECTED_RESULT = "Notification unread High Priority"; + const firstItem = $("#nli1"); + const invisibleText = firstItem.shadow$(".ui5-hidden-text"); + + // assert + assert.strictEqual(invisibleText.getText(), EXPECTED_RESULT, + "The invisible text is correct."); + }); + + it("tests List Group Item ACC ariaLabelledBy", () => { + const firstItem = $("#nli1"); + const firstItemRoot = firstItem.shadow$(".ui5-nli-root"); + + const headingId = `${firstItem.getProperty("_id")}-heading`; + const descriptionId = `${firstItem.getProperty("_id")}-description`; + const footerId = `${firstItem.getProperty("_id")}-footer`; + const inivisbleTextId = `${firstItem.getProperty("_id")}-invisibleText`; + const EXPECTED_ARIA_LABELLED_BY = `${headingId} ${descriptionId} ${footerId} ${inivisbleTextId}`; + + // assert + assert.strictEqual(firstItemRoot.getAttribute("aria-labelledby"), EXPECTED_ARIA_LABELLED_BY, + "The ariaLabelledBy text is correct."); + }); +}); \ No newline at end of file diff --git a/packages/fiori/test/specs/NotificationListItem.spec.js b/packages/fiori/test/specs/NotificationListItem.spec.js deleted file mode 100644 index e69de29bb2d1..000000000000 From ed9f0967d9792f68384a3a1e37dbdc40f466caac Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Thu, 7 May 2020 07:32:37 +0300 Subject: [PATCH 13/22] enrich the NotificationOverflowAction API --- .../src/NotifactionOverflowActionsPopover.hbs | 2 ++ .../fiori/src/NotificationListGroupItem.hbs | 2 ++ packages/fiori/src/NotificationListItem.hbs | 2 ++ .../fiori/src/NotificationListItemBase.js | 2 ++ .../fiori/src/NotificationOverflowAction.js | 29 +++++++++++++++++ .../test/pages/NotificationListItem.html | 31 +++++++++++++++---- 6 files changed, 62 insertions(+), 6 deletions(-) diff --git a/packages/fiori/src/NotifactionOverflowActionsPopover.hbs b/packages/fiori/src/NotifactionOverflowActionsPopover.hbs index f30aead36c08..d0651ad7ca3c 100644 --- a/packages/fiori/src/NotifactionOverflowActionsPopover.hbs +++ b/packages/fiori/src/NotifactionOverflowActionsPopover.hbs @@ -10,6 +10,8 @@ icon="{{this.icon}}" design="Transparent" @click="{{this.press}}" + ?disabled="{{this.disabled}}" + design="{{this.design}}" data-ui5-external-action-item-id="{{this.refItemid}}" >{{this.text}} </ui5-button> diff --git a/packages/fiori/src/NotificationListGroupItem.hbs b/packages/fiori/src/NotificationListGroupItem.hbs index 0cbbf3e33fa8..19b211d6f9a8 100644 --- a/packages/fiori/src/NotificationListGroupItem.hbs +++ b/packages/fiori/src/NotificationListGroupItem.hbs @@ -49,6 +49,8 @@ <ui5-button icon="{{this.icon}}" class="ui5-nli-group-action" + ?disabled="{{this.disabled}}" + design="{{this.design}}" @click="{{this.press}}" data-ui5-external-action-item-id="{{this.refItemid}}" custom-btn diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index d7b140611498..50e49bd42fb8 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -26,6 +26,8 @@ icon="{{this.icon}}" class="ui5-nli-action" @click="{{this.press}}" + ?disabled="{{this.disabled}}" + design="{{this.design}}" data-ui5-external-action-item-id="{{this.refItemid}}" custom-btn > diff --git a/packages/fiori/src/NotificationListItemBase.js b/packages/fiori/src/NotificationListItemBase.js index 19ff3d8d6748..9611263fa130 100644 --- a/packages/fiori/src/NotificationListItemBase.js +++ b/packages/fiori/src/NotificationListItemBase.js @@ -163,6 +163,8 @@ class NotificationListItemBase extends ListItemBase { text: action.text, press: this._onCustomActionClick.bind(this), refItemid: action._id, + disabled: action.disabled ? true : undefined, + design: action.design, }; }); } diff --git a/packages/fiori/src/NotificationOverflowAction.js b/packages/fiori/src/NotificationOverflowAction.js index aa0527315180..03f873dde78e 100644 --- a/packages/fiori/src/NotificationOverflowAction.js +++ b/packages/fiori/src/NotificationOverflowAction.js @@ -1,4 +1,5 @@ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js"; +import ButtonDesign from "@ui5/webcomponents/dist/types/ButtonDesign.js"; /** * @public @@ -17,6 +18,34 @@ const metadata = { type: String, }, + /** + * Defines if the action is disabled. + * <br><br> + * <b>Note:</b> a disabled action can't be pressed or focused, and it is not in the tab chain. + * + * @type {boolean} + * @defaultvalue false + * @public + */ + disabled: { + type: Boolean, + }, + + /** + * Defines the action design. + * <br><br> + * <b>Note:</b> Available options are "Default", "Emphasized", "Positive", + * "Negative", and "Transparent". + * + * @type {ButtonDesign} + * @defaultvalue "Transparent" + * @public + */ + design: { + type: ButtonDesign, + defaultValue: ButtonDesign.Transparent, + }, + /** * Defines the <code>icon</code> source URI. * <br><br> diff --git a/packages/fiori/test/pages/NotificationListItem.html b/packages/fiori/test/pages/NotificationListItem.html index f06d2f2369b0..4cc507e19f51 100644 --- a/packages/fiori/test/pages/NotificationListItem.html +++ b/packages/fiori/test/pages/NotificationListItem.html @@ -62,7 +62,13 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">Other stuff</span> <ui5-notification-overflow-action id="acceptBtn" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> - <ui5-notification-overflow-action id="rejectBtn" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action + id="rejectBtn" + icon="message-error" + text="Reject" + slot="actions" + design="Negative" + ></ui5-notification-overflow-action> </ui5-li-notification> <ui5-li-notification @@ -91,7 +97,7 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">3 Days</span> <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> - <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="decline" design="Negative" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> <ui5-li-notification heading="New order (#2523)" truncate> @@ -100,7 +106,14 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">John SMith</span> <span slot="footnotes">3 Days</span> - <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action + icon="message-error" + design="Negative" + text="Reject" + slot="actions"> + </ui5-notification-overflow-action> + + <ui5-notification-overflow-action icon="decline" disabled design="Negative" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> </ui5-list> @@ -166,7 +179,13 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">Other stuff</span> <ui5-notification-overflow-action id="acceptBtnInPopover" icon="accept" text="Accept" slot="actions"></ui5-notification-overflow-action> - <ui5-notification-overflow-action id="rejectBtnInPopover" icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action + id="rejectBtnInPopover" + icon="message-error" + text="Reject" + design="Negative" + slot="actions"> + </ui5-notification-overflow-action> </ui5-li-notification> <ui5-li-notification @@ -195,7 +214,7 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">3 Days</span> <ui5-notification-overflow-action icon="accept" text="Accept All Requested Information" slot="actions"></ui5-notification-overflow-action> - <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="decline" design="Negative" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> <ui5-li-notification heading="New order (#2523)" truncate> @@ -204,7 +223,7 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">John SMith</span> <span slot="footnotes">3 Days</span> - <ui5-notification-overflow-action icon="message-error" text="Reject" slot="actions"></ui5-notification-overflow-action> + <ui5-notification-overflow-action icon="message-error" design="Negative" text="Reject" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> </ui5-list> </ui5-popover> From 45cd039c7977f03e9e437d1a7c2e3c6463933501 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Thu, 7 May 2020 07:56:19 +0300 Subject: [PATCH 14/22] improve documentation --- packages/fiori/src/NotificationListItem.js | 11 ++++--- .../NotificationListGroupItem.sample.html | 26 +++++++++++++---- .../samples/NotificationListItem.sample.html | 29 +++++++++++++++++-- 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index eadbf433fb0a..b5f61cf656e8 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -42,8 +42,11 @@ const metadata = { /** * Defines if the <code>heading</code> and <code>decription</code> should truncate, - * otherwise they would wrap by default. - * @type {boolean} + * they wrap by default. + * + * <br><br> + * <b>Note:</b> when set to <code>true</code> + * a <code>ShowMore/Less</code> button would be displayed. * @defaultvalue false * @public */ @@ -54,8 +57,8 @@ const metadata = { /** * Defines if the <code>notification</code> is new or has been already read. * <br><br> - * <b>Note:</b> when set to <code>false</code> the <code>heading</code> has bold font - * and if set to true - it has a normal font. + * <b>Note:</b> if set to <code>false</code> the <code>heading</code> has bold font, + * if set to true - it has a normal font. * @type {boolean} * @defaultvalue false * @public diff --git a/packages/fiori/test/samples/NotificationListGroupItem.sample.html b/packages/fiori/test/samples/NotificationListGroupItem.sample.html index f9a0a9b8dafe..921aa046240a 100644 --- a/packages/fiori/test/samples/NotificationListGroupItem.sample.html +++ b/packages/fiori/test/samples/NotificationListGroupItem.sample.html @@ -61,6 +61,7 @@ <h3>NotificationListGroupItem</h3> show-counter heading="Deliveries" priority="Medium" + collapsed > <ui5-li-notification show-close @@ -99,14 +100,15 @@ <h3>NotificationListGroupItem</h3> <ui5-li-notification-group show-close show-counter - priority="High" + priority="Low" + collapsed heading="Meetings With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > <ui5-li-notification show-close truncate heading="New meeting at Building (#35001)" - priority="High" + priority="Low" read > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -120,7 +122,7 @@ <h3>NotificationListGroupItem</h3> show-close truncate heading="New meeting at Building (#35001)" - priority="High" + priority="Low" read > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -176,7 +178,13 @@ <h3>NotificationListGroupItem</h3> <section> <h3>NotificationListGroupItem In ShellBar</h3> <div class="snippet"> - <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> + <ui5-shellbar + id="shellbar" + primary-title="Corporate Portal" + logo="../../../assets/images/sap-logo-svg.svg" + show-notifications + notification-count="6" + > </ui5-shellbar> <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> @@ -228,6 +236,7 @@ <h3>NotificationListGroupItem In ShellBar</h3> show-counter heading="Deliveries" priority="Medium" + collapsed > <ui5-li-notification show-close @@ -267,6 +276,7 @@ <h3>NotificationListGroupItem In ShellBar</h3> show-close show-counter priority="High" + collapsed heading="Meetings With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > <ui5-li-notification @@ -308,7 +318,13 @@ <h3>NotificationListGroupItem In ShellBar</h3> </script> </div> <pre class="prettyprint lang-html"><xmp> -<ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> +<ui5-shellbar + id="shellbar" + primary-title="Corporate Portal" + logo="../../../assets/images/sap-logo-svg.svg" + show-notifications + notification-count="6" +> </ui5-shellbar> <ui5-popover diff --git a/packages/fiori/test/samples/NotificationListItem.sample.html b/packages/fiori/test/samples/NotificationListItem.sample.html index 2923e725460a..847840881e50 100644 --- a/packages/fiori/test/samples/NotificationListItem.sample.html +++ b/packages/fiori/test/samples/NotificationListItem.sample.html @@ -17,6 +17,7 @@ <h3>NotificationListItem</h3> <ui5-li-notification show-close heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. <ui5-avatar image="../../../assets/images/avatars/woman_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> @@ -27,6 +28,7 @@ <h3>NotificationListItem</h3> <ui5-li-notification show-close heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. <ui5-avatar image="../../../assets/images/avatars/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> @@ -36,6 +38,7 @@ <h3>NotificationListItem</h3> <ui5-li-notification show-close + priority="High" heading="New order (#2525) With a short title" > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -56,6 +59,7 @@ <h3>NotificationListItem</h3> <ui5-li-notification show-close heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. <ui5-avatar image="../../../assets/images/avatars/woman_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> @@ -66,6 +70,7 @@ <h3>NotificationListItem</h3> <ui5-li-notification show-close heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." + priority="High" > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. <ui5-avatar image="../../../assets/images/avatars/man_avatar_1.png" size="XS" slot="avatar"></ui5-avatar> @@ -90,6 +95,7 @@ <h3>NotificationListItem - Show "more/less"</h3> <ui5-li-notification truncate show-close + priority="Medium" heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. @@ -101,6 +107,7 @@ <h3>NotificationListItem - Show "more/less"</h3> <ui5-li-notification truncate show-close + priority="Medium" heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. @@ -111,6 +118,7 @@ <h3>NotificationListItem - Show "more/less"</h3> <ui5-li-notification show-close + priority="Medium" truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." > @@ -126,6 +134,7 @@ <h3>NotificationListItem - Show "more/less"</h3> <ui5-li-notification truncate show-close + priority="Medium" heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. @@ -145,6 +154,7 @@ <h3>NotificationListItem - Custom Actions</h3> <ui5-list id="myList3" class="full-width" header-text="Notifications"> <ui5-li-notification show-close + priority="Low" heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -158,6 +168,7 @@ <h3>NotificationListItem - Custom Actions</h3> <ui5-li-notification show-close + priority="Low" heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -170,6 +181,7 @@ <h3>NotificationListItem - Custom Actions</h3> <ui5-li-notification show-close + priority="Low" heading="New order (#2525) With a short title" > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -186,6 +198,7 @@ <h3>NotificationListItem - Custom Actions</h3> <ui5-list header-text="Notifications"> <ui5-li-notification show-close + priority="Low" heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -202,7 +215,13 @@ <h3>NotificationListItem - Custom Actions</h3> <section> <h3>NotificationListItem In ShellBar</h3> <div class="snippet"> - <ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> + <ui5-shellbar + id="shellbar" + primary-title="Corporate Portal" + logo="../../../assets/images/sap-logo-svg.svg" + show-notifications + notification-count="4" + > </ui5-shellbar> <ui5-popover id="notificationsPopover" style="max-width: 400px" placement-type="Bottom" horizontal-align="Right"> @@ -268,7 +287,13 @@ <h3>NotificationListItem In ShellBar</h3> </script> </div> <pre class="prettyprint lang-html"><xmp> -<ui5-shellbar id="shellbar" primary-title="Product Title" show-notifications> +<ui5-shellbar + id="shellbar" + primary-title="Corporate Portal" + logo="../../../assets/images/sap-logo-svg.svg" + show-notifications + notification-count="4" +> </ui5-shellbar> <ui5-popover From 5ed79ef364d7c87c3a78ac9dc006ab117e66510f Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Thu, 7 May 2020 10:34:51 +0300 Subject: [PATCH 15/22] enable opening the overflow via SPACE --- packages/fiori/src/NotificationListItemBase.js | 4 ++++ packages/main/src/Button.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/packages/fiori/src/NotificationListItemBase.js b/packages/fiori/src/NotificationListItemBase.js index 9611263fa130..5a6bc88a652f 100644 --- a/packages/fiori/src/NotificationListItemBase.js +++ b/packages/fiori/src/NotificationListItemBase.js @@ -199,6 +199,10 @@ class NotificationListItemBase extends ListItemBase { _onkeydown(event) { super._onkeydown(event); + if (event.isMarked === "button") { + return; + } + if (isSpace(event)) { event.preventDefault(); } diff --git a/packages/main/src/Button.js b/packages/main/src/Button.js index a675f28c4f4b..74f3026a100f 100644 --- a/packages/main/src/Button.js +++ b/packages/main/src/Button.js @@ -304,6 +304,8 @@ class Button extends UI5Element { } _onkeydown(event) { + event.isMarked = "button"; + if (isSpace(event) || isEnter(event)) { this.active = true; } From 9121d5bc236297f02341acc296ece06f77fa92b1 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Mon, 11 May 2020 09:37:35 +0300 Subject: [PATCH 16/22] add public imports --- docs/Public Module Imports.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Public Module Imports.md b/docs/Public Module Imports.md index 974d50a72fa1..24f14e69633b 100644 --- a/docs/Public Module Imports.md +++ b/docs/Public Module Imports.md @@ -136,6 +136,8 @@ For API documentation and samples, please check the [UI5 Web Components Playgrou | Shell Bar Item | `ui5-shellbar-item` | `import "@ui5/webcomponents-fiori/dist/ShellBarItem.js";` | | Product Switch | `ui5-product-switch` | `import "@ui5/webcomponents-fiori/dist/ProductSwitch.js";` | | Product Switch Item | `ui5-product-switch-item` | `import "@ui5/webcomponents-fiori/dist/ProductSwitchItem.js";` | +| Notification List Item | `ui5-li-notifcation` | `import "@ui5/webcomponents-fiori/dist/NotifcationListItem.js";` | +| Notification Group List Item|`ui5-li-notification-group`| `import "@ui5/webcomponents-fiori/dist/NotifcationListGroupItem.js";`| ### 2. Assets From 83273874cc8da13d0dd77f86f1b0e278e19bb5dd Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Mon, 11 May 2020 20:10:19 +0300 Subject: [PATCH 17/22] fix uploadcollectionitem tests --- packages/fiori/src/UploadCollectionItem.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/fiori/src/UploadCollectionItem.js b/packages/fiori/src/UploadCollectionItem.js index 92871413ba6b..673af221dd7d 100644 --- a/packages/fiori/src/UploadCollectionItem.js +++ b/packages/fiori/src/UploadCollectionItem.js @@ -257,13 +257,13 @@ class UploadCollectionItem extends ListItem { } onBeforeRendering() { - if (!this.focused) { + if (!this._focused) { this._editing = false; } } onAfterRendering() { - if (this.focused && this._editing) { + if (this._focused && this._editing) { this.focusAndSelectText(); } } @@ -286,6 +286,16 @@ class UploadCollectionItem extends ListItem { this._editing = true; } + _onfocusin(event) { + super._onfocusin(event); + this._focused = true; + } + + _onfocusout() { + super._onfocusout(event); + this._focused = false; + } + _onInputChange(event) { if (this.shadowRoot.getElementById("ui5-uci-edit-cancel").active) { return; From 2e67706780a8deb9d45745c249eeda33e1749886 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Mon, 11 May 2020 20:33:06 +0300 Subject: [PATCH 18/22] fix lint --- packages/fiori/src/UploadCollectionItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiori/src/UploadCollectionItem.js b/packages/fiori/src/UploadCollectionItem.js index 673af221dd7d..167ffe4d7b04 100644 --- a/packages/fiori/src/UploadCollectionItem.js +++ b/packages/fiori/src/UploadCollectionItem.js @@ -291,7 +291,7 @@ class UploadCollectionItem extends ListItem { this._focused = true; } - _onfocusout() { + _onfocusout(event) { super._onfocusout(event); this._focused = false; } From 9f10cc057f87b84ebbaa6bd476b9fc2b3afc5a1d Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 12 May 2020 16:32:21 +0300 Subject: [PATCH 19/22] address comments --- docs/Public Module Imports.md | 1 + packages/base/src/util/TabbableElements.js | 6 ++++- .../fiori/src/NotificationListGroupItem.hbs | 9 +++---- .../fiori/src/NotificationListGroupItem.js | 13 +++------- packages/fiori/src/NotificationListItem.hbs | 2 -- packages/fiori/src/NotificationListItem.js | 6 ++--- .../fiori/src/NotificationListItemBase.js | 25 +++++++++++++------ .../src/themes/NotificationListGroupItem.css | 17 ------------- .../fiori/src/themes/NotificationListItem.css | 16 ------------ .../src/themes/NotificationListItemBase.css | 17 +++++++++++++ .../fiori/test/specs/NotificationList.spec.js | 6 ++--- 11 files changed, 52 insertions(+), 66 deletions(-) diff --git a/docs/Public Module Imports.md b/docs/Public Module Imports.md index c6fb0c1592b4..bb21458674b4 100644 --- a/docs/Public Module Imports.md +++ b/docs/Public Module Imports.md @@ -138,6 +138,7 @@ For API documentation and samples, please check the [UI5 Web Components Playgrou | Product Switch Item | `ui5-product-switch-item` | `import "@ui5/webcomponents-fiori/dist/ProductSwitchItem.js";` | | Notification List Item | `ui5-li-notifcation` | `import "@ui5/webcomponents-fiori/dist/NotifcationListItem.js";` | | Notification Group List Item|`ui5-li-notification-group`| `import "@ui5/webcomponents-fiori/dist/NotifcationListGroupItem.js";`| +| Notification Overflow Action| `ui5-notification-overflow-action` | `import "@ui5/webcomponents-fiori/dist/NotificationOverflowAction.js";`| ### 2. Assets diff --git a/packages/base/src/util/TabbableElements.js b/packages/base/src/util/TabbableElements.js index 8587e8d1d307..7f3ef08052fa 100644 --- a/packages/base/src/util/TabbableElements.js +++ b/packages/base/src/util/TabbableElements.js @@ -12,8 +12,12 @@ const getLastTabbableElement = node => { const getTabbables = (nodes, tabbables) => { const tabbablesNodes = tabbables || []; + if (!nodes) { + return tabbablesNodes; + } + Array.from(nodes).forEach(currentNode => { - if (currentNode.nodeType === Node.TEXT_NODE) { + if (currentNode.nodeType === Node.TEXT_NODE || currentNode.nodeType === Node.COMMENT_NODE) { return; } diff --git a/packages/fiori/src/NotificationListGroupItem.hbs b/packages/fiori/src/NotificationListGroupItem.hbs index 19b211d6f9a8..e2a357c8b525 100644 --- a/packages/fiori/src/NotificationListGroupItem.hbs +++ b/packages/fiori/src/NotificationListGroupItem.hbs @@ -14,7 +14,6 @@ design="Transparent" @click="{{_onBtnToggleClick}}" class="ui5-nli-group-toggle-btn" - toggle-btn ></ui5-button> {{#if hasPriority}} @@ -29,7 +28,7 @@ </div> {{#if showCounter}} - <span class="ui5-nli-group-counter">{{counter}}</span> + <span class="ui5-nli-group-counter">({{itemsCount}})</span> {{/if}} <div class="ui5-nli-group-divider"></div> @@ -40,20 +39,18 @@ icon="overflow" design="Transparent" @click="{{_onBtnOverflowClick}}" - class="ui5-nli-group-overflow-btn" + class="ui5-nli-overflow-btn" title="{{overflowBtnTitle}}" - overflow-btn ></ui5-button> {{else}} {{#each standardActions}} <ui5-button icon="{{this.icon}}" - class="ui5-nli-group-action" + class="ui5-nli-action" ?disabled="{{this.disabled}}" design="{{this.design}}" @click="{{this.press}}" data-ui5-external-action-item-id="{{this.refItemid}}" - custom-btn > {{this.text}} </ui5-button> diff --git a/packages/fiori/src/NotificationListGroupItem.js b/packages/fiori/src/NotificationListGroupItem.js index 52f5f4e058f1..47fa18abc1b0 100644 --- a/packages/fiori/src/NotificationListGroupItem.js +++ b/packages/fiori/src/NotificationListGroupItem.js @@ -1,9 +1,10 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; -import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; +import { fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; import Priority from "@ui5/webcomponents/dist/types/Priority.js"; import List from "@ui5/webcomponents/dist/List.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; +import Popover from "@ui5/webcomponents/dist/Popover.js"; import NotificationListItemBase from "./NotificationListItemBase.js"; // Texts @@ -113,11 +114,6 @@ const metadata = { * @public */ class NotificationListGroupItem extends NotificationListItemBase { - constructor() { - super(); - this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); - } - static get metadata() { return metadata; } @@ -139,6 +135,7 @@ class NotificationListGroupItem extends NotificationListItemBase { List.define(), Button.define(), Icon.define(), + Popover.define(), fetchI18nBundle("@ui5/webcomponents-fiori"), ]); } @@ -147,10 +144,6 @@ class NotificationListGroupItem extends NotificationListItemBase { return this.items.length; } - get counter() { - return `(${this.itemsCount})`; - } - get overflowBtnTitle() { return this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_OVERLOW_BTN_TITLE); } diff --git a/packages/fiori/src/NotificationListItem.hbs b/packages/fiori/src/NotificationListItem.hbs index 50e49bd42fb8..835a54971beb 100644 --- a/packages/fiori/src/NotificationListItem.hbs +++ b/packages/fiori/src/NotificationListItem.hbs @@ -18,7 +18,6 @@ @click="{{_onBtnOverflowClick}}" class="ui5-nli-overflow-btn" title="{{overflowBtnTitle}}" - overflow-btn ></ui5-button> {{else}} {{#each standardActions}} @@ -29,7 +28,6 @@ ?disabled="{{this.disabled}}" design="{{this.design}}" data-ui5-external-action-item-id="{{this.refItemid}}" - custom-btn > {{this.text}} </ui5-button> diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index b5f61cf656e8..d1479eb9b402 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -1,6 +1,6 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; import { isSpace, isEnter } from "@ui5/webcomponents-base/dist/Keys.js"; -import { getI18nBundle, fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; +import { fetchI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js"; import { isIE } from "@ui5/webcomponents-base/dist/Device.js"; @@ -8,6 +8,7 @@ import Priority from "@ui5/webcomponents/dist/types/Priority.js"; import Button from "@ui5/webcomponents/dist/Button.js"; import Link from "@ui5/webcomponents/dist/Link.js"; import Icon from "@ui5/webcomponents/dist/Icon.js"; +import Popover from "@ui5/webcomponents/dist/Popover.js"; import NotificationListItemBase from "./NotificationListItemBase.js"; // Texts @@ -181,8 +182,6 @@ class NotificationListItem extends NotificationListItemBase { // the resize handler this.onResizeBind = this.onResize.bind(this); - - this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); } static get metadata() { @@ -206,6 +205,7 @@ class NotificationListItem extends NotificationListItemBase { Button.define(), Icon.define(), Link.define(), + Popover.define(), fetchI18nBundle("@ui5/webcomponents-fiori"), ]); } diff --git a/packages/fiori/src/NotificationListItemBase.js b/packages/fiori/src/NotificationListItemBase.js index 5a6bc88a652f..d55dc399e371 100644 --- a/packages/fiori/src/NotificationListItemBase.js +++ b/packages/fiori/src/NotificationListItemBase.js @@ -1,6 +1,7 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; import { isSpace } from "@ui5/webcomponents-base/dist/Keys.js"; import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; +import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; import ListItemBase from "@ui5/webcomponents/dist/ListItemBase.js"; import Priority from "@ui5/webcomponents/dist/types/Priority.js"; @@ -18,12 +19,6 @@ import NotifactionOverflowActionsPopoverTemplate from "./generated/templates/Not // Styles import NotifactionOverflowActionsPopoverCss from "./generated/themes/NotifactionOverflowActionsPopover.css.js"; -const PRIORITY_ICONS_MAP = { - "High": "message-error", - "Medium": "message-warning", - "Low": "message-success", -}; - /** * @public */ @@ -104,6 +99,12 @@ const metadata = { * @public */ class NotificationListItemBase extends ListItemBase { + constructor() { + super(); + + this.i18nBundle = getI18nBundle("@ui5/webcomponents-fiori"); + } + static get metadata() { return metadata; } @@ -120,6 +121,14 @@ class NotificationListItemBase extends ListItemBase { return NotifactionOverflowActionsPopoverCss; } + static priorityIconsMappings() { + return { + "High": "message-error", + "Medium": "message-warning", + "Low": "message-success", + }; + } + get hasHeading() { return !!this.heading.length; } @@ -129,11 +138,11 @@ class NotificationListItemBase extends ListItemBase { } get priorityIcon() { - return PRIORITY_ICONS_MAP[this.priority]; + return NotificationListItemBase.priorityIconsMappings()[this.priority]; } get overflowButtonDOM() { - return this.shadowRoot.querySelector("[overflow-btn]"); + return this.shadowRoot.querySelector(".ui5-nli-overflow-btn"); } get showOverflow() { diff --git a/packages/fiori/src/themes/NotificationListGroupItem.css b/packages/fiori/src/themes/NotificationListGroupItem.css index 2deecbeb150a..171bebd18557 100644 --- a/packages/fiori/src/themes/NotificationListGroupItem.css +++ b/packages/fiori/src/themes/NotificationListGroupItem.css @@ -53,23 +53,6 @@ font-family: var(--sapFontHeaderFamily); } -.ui5-nli-group-action { - flex-shrink: 0; - margin-right: 0.5rem; -} - -.ui5-nli-group-overflow-btn { - margin-right: 0.5rem; -} - -[dir="rtl"] .ui5-nli-group-action { - margin-left: 0.5rem; -} - -[dir="rtl"] .ui5-nli-group-overflow-btn { - margin-left: 0.5rem; -} - [dir="rtl"] .ui5-nli-group-toggle-btn { margin-left: 1rem; } diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index c6ce94baeccd..480340c59655 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -127,14 +127,6 @@ box-sizing: border-box; } -.ui5-nli-action { - margin-right: 0.5rem; -} - -.ui5-nli-overflow-btn { - margin-right: 0.5rem; -} - /* RTL */ [dir="rtl"] .ui5-nli-footer-divider { @@ -144,12 +136,4 @@ [dir="rtl"] .ui5-nli-footer-showMore { margin-right: 1rem; -} - -[dir="rtl"] .ui5-nli-action { - margin-left: 0.5rem; -} - -[dir="rtl"] .ui5-nli-overflow-btn { - margin-left: 0.5rem; } \ No newline at end of file diff --git a/packages/fiori/src/themes/NotificationListItemBase.css b/packages/fiori/src/themes/NotificationListItemBase.css index c300084fcf31..2f6a32ee5b1a 100644 --- a/packages/fiori/src/themes/NotificationListItemBase.css +++ b/packages/fiori/src/themes/NotificationListItemBase.css @@ -26,3 +26,20 @@ left: 0; pointer-events: none; } + +.ui5-nli-action { + flex-shrink: 0; + margin-right: 0.5rem; +} + +.ui5-nli-overflow-btn { + margin-right: 0.5rem; +} + +[dir="rtl"] .ui5-nli-group-action { + margin-left: 0.5rem; +} + +[dir="rtl"] .ui5-nli-overflow-btn { + margin-left: 0.5rem; +} \ No newline at end of file diff --git a/packages/fiori/test/specs/NotificationList.spec.js b/packages/fiori/test/specs/NotificationList.spec.js index 7742f930442a..9166b9e99c2d 100644 --- a/packages/fiori/test/specs/NotificationList.spec.js +++ b/packages/fiori/test/specs/NotificationList.spec.js @@ -45,7 +45,7 @@ describe("Notification List Item Tests", () => { it("tests click fired on custom actions", () => { const customActionInput = $("#customActionInput"); const secondItem = $("#nli2"); - const customAction = secondItem.shadow$("[custom-btn]"); + const customAction = secondItem.shadow$(".ui5-nli-action"); // act customAction.click(); @@ -59,7 +59,7 @@ describe("Notification List Item Tests", () => { const toggleInput = $("#toggleInput"); const EXPECTED_RESULT = "Orders"; const firstGroupItem = $("#nlgi1"); - const btnListGroupItemToggle = firstGroupItem.shadow$("[toggle-btn]"); + const btnListGroupItemToggle = firstGroupItem.shadow$(".ui5-nli-group-toggle-btn"); // act btnListGroupItemToggle.click(); @@ -99,7 +99,7 @@ describe("Notification List Item Tests", () => { it("tests no custom actions, when group item collapsed", () => { const fifthItem = $("#nlgi3"); - const overflow = fifthItem.shadow$("[overflow-btn]"); + const overflow = fifthItem.shadow$(".ui5-nli-overflow-btn"); assert.ok(!overflow.isExisting(), "The custom actions are hidden when the group is collapsed"); From dcd18b7e38413181d190c3f47dd88cf36f601d98 Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Tue, 12 May 2020 16:50:49 +0300 Subject: [PATCH 20/22] fix typo --- packages/fiori/src/NotificationListItem.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index d1479eb9b402..06c349bb0cf7 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -340,11 +340,11 @@ class NotificationListItem extends NotificationListItemBase { } get accInvisibleText() { - const notifcatationTxt = this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_TXT); + const notifcationTxt = this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_TXT); const readTxt = this.read ? this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_READ) : this.i18nBundle.getText(NOTIFICATION_LIST_ITEM_UNREAD); const priorityText = this.priorityText; - return `${notifcatationTxt} ${readTxt} ${priorityText}`; + return `${notifcationTxt} ${readTxt} ${priorityText}`; } get classes() { From a946d5b15254d5f79356261aa95257dbf8ea3fbd Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Wed, 13 May 2020 10:08:20 +0300 Subject: [PATCH 21/22] change truncate to wrap --- packages/fiori/src/NotificationListItem.js | 6 +- .../fiori/src/themes/NotificationListItem.css | 8 +-- .../test/pages/NotificationListGroupItem.html | 18 ++--- .../test/pages/NotificationListItem.html | 23 ++++--- .../pages/NotificationList_test_page.html | 5 +- .../NotificationListGroupItem.sample.html | 14 ---- .../samples/NotificationListItem.sample.html | 68 +------------------ 7 files changed, 30 insertions(+), 112 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 06c349bb0cf7..c73a58cd6e75 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -51,7 +51,7 @@ const metadata = { * @defaultvalue false * @public */ - truncate: { + wrap: { type: Boolean, }, @@ -243,7 +243,7 @@ class NotificationListItem extends NotificationListItemBase { } get hideShowMore() { - if (this.truncate && this._showMore) { + if (!this.wrap && this._showMore) { return undefined; } @@ -402,7 +402,7 @@ class NotificationListItem extends NotificationListItemBase { } onResize() { - if (!this.truncate) { + if (this.wrap) { this._showMore = false; return; } diff --git a/packages/fiori/src/themes/NotificationListItem.css b/packages/fiori/src/themes/NotificationListItem.css index 480340c59655..40bab105c6e9 100644 --- a/packages/fiori/src/themes/NotificationListItem.css +++ b/packages/fiori/src/themes/NotificationListItem.css @@ -1,14 +1,14 @@ @import "./NotificationListItemBase.css"; @import "./NotificationPrioIcon.css"; -:host([truncate]) .ui5-nli-title { +:host(:not([wrap])) .ui5-nli-title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } -:host([truncate]) .ui5-nli-description { +:host(:not([wrap])) .ui5-nli-description { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; @@ -28,11 +28,11 @@ } /* IE */ -:host([truncate]) .ui5-nli-content--ie .ui5-nli-description { +:host(:not([wrap])) .ui5-nli-content--ie .ui5-nli-description { max-height: 32px; } -:host([truncate]) .ui5-nli-content--ie .ui5-nli-title { +:host(:not([wrap])) .ui5-nli-content--ie .ui5-nli-title { max-height: 32px; } diff --git a/packages/fiori/test/pages/NotificationListGroupItem.html b/packages/fiori/test/pages/NotificationListGroupItem.html index 7b7e8abc37c9..430d6a7d3b9f 100644 --- a/packages/fiori/test/pages/NotificationListGroupItem.html +++ b/packages/fiori/test/pages/NotificationListGroupItem.html @@ -4,7 +4,7 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> - <title>NotificationGroup</title> + <title>NotificationListGroupItem</title> <script src="../../webcomponentsjs/webcomponents-loader.js"></script> <script src="../../resources/bundle.esm.js" type="module"></script> @@ -56,7 +56,6 @@ <h3>Events on ui5-list level</h3> > <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -72,7 +71,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -87,7 +85,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#252) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -112,7 +109,6 @@ <h3>Events on ui5-list level</h3> > <ui5-li-notification show-close - truncate heading="New order (#2900) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -127,7 +123,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#29001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -142,7 +137,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#29003) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -164,7 +158,6 @@ <h3>Events on ui5-list level</h3> > <ui5-li-notification show-close - truncate heading="New order (#35001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" read @@ -178,7 +171,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#35002) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" read @@ -192,7 +184,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#35003) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" read @@ -222,7 +213,6 @@ <h3>Events on ui5-list level</h3> > <ui5-li-notification show-close - truncate priority="Medium" heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > @@ -262,7 +252,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Low" - truncate > Short description <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> @@ -274,7 +263,10 @@ <h3>Events on ui5-list level</h3> <ui5-notification-overflow-action icon="message-error" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> - <ui5-li-notification heading="New order (#2523)" truncate priority="Low"> + <ui5-li-notification + heading="New order (#2523)" + priority="Low" + > <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> <span slot="footnotes">John SMith</span> diff --git a/packages/fiori/test/pages/NotificationListItem.html b/packages/fiori/test/pages/NotificationListItem.html index 4cc507e19f51..0604b9fb210a 100644 --- a/packages/fiori/test/pages/NotificationListItem.html +++ b/packages/fiori/test/pages/NotificationListItem.html @@ -23,7 +23,7 @@ <h3>Properties</h3> <ul> <li>heading</li> - <li>truncate (default: "false")</li> + <li>wrap (default: "false")</li> <li>priority (default: "None")</li> <li>read (default: "false")</li> <li>show-close (default: "false")</li> @@ -31,6 +31,7 @@ <h3>Properties</h3> <h3>Slots</h3> <ul> + <li>default (description)</li> <li>avatar</li> <li>actions</li> <li>footnotes</li> @@ -52,7 +53,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -73,7 +73,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -89,7 +88,7 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" - truncate> + > Short description <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> @@ -100,7 +99,7 @@ <h3>Events on ui5-list level</h3> <ui5-notification-overflow-action icon="decline" design="Negative" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> - <ui5-li-notification heading="New order (#2523)" truncate> + <ui5-li-notification heading="New order (#2523)"> <div>And with a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> <span slot="footnotes">John SMith</span> @@ -123,6 +122,7 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close + wrap heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -134,6 +134,7 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close + wrap heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -145,6 +146,7 @@ <h3>Events on ui5-list level</h3> </ui5-li-notification> <ui5-li-notification + wrap heading="New order (#2522)" priority="Low" > @@ -155,7 +157,10 @@ <h3>Events on ui5-list level</h3> <span slot="footnotes">3 Days</span> </ui5-li-notification> - <ui5-li-notification heading="New order (#2523)"> + <ui5-li-notification + heading="New order (#2523)" + wrap + > <div>With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> <span slot="footnotes">John SMith</span> @@ -169,7 +174,6 @@ <h3>Events on ui5-list level</h3> <ui5-list id="notificationListTop" header-text="Notifications heading and content 'truncates'"> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -190,7 +194,6 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -206,7 +209,7 @@ <h3>Events on ui5-list level</h3> <ui5-li-notification heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" - truncate> + > Short description <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> @@ -217,7 +220,7 @@ <h3>Events on ui5-list level</h3> <ui5-notification-overflow-action icon="decline" design="Negative" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> - <ui5-li-notification heading="New order (#2523)" truncate> + <ui5-li-notification heading="New order (#2523)"> <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> <span slot="footnotes">John SMith</span> diff --git a/packages/fiori/test/pages/NotificationList_test_page.html b/packages/fiori/test/pages/NotificationList_test_page.html index 2364efc81159..66e573490b95 100644 --- a/packages/fiori/test/pages/NotificationList_test_page.html +++ b/packages/fiori/test/pages/NotificationList_test_page.html @@ -67,7 +67,6 @@ <ui5-li-notification id="nli1" show-close - truncate heading="New order #2201" priority="High" > @@ -84,7 +83,6 @@ <ui5-li-notification id="nli2" show-close - truncate heading="New order #2202" priority="High" > @@ -110,6 +108,7 @@ <ui5-li-notification id="nli3" show-close + wrap heading="New payment #2900" priority="High" > @@ -125,6 +124,7 @@ <ui5-li-notification id="nli4" + wrap show-close heading="New payment #2901" priority="High" @@ -149,6 +149,7 @@ > <ui5-li-notification id="nli5" + wrap show-close heading="New payment #2900" priority="High" diff --git a/packages/fiori/test/samples/NotificationListGroupItem.sample.html b/packages/fiori/test/samples/NotificationListGroupItem.sample.html index 921aa046240a..4903d1e76e7e 100644 --- a/packages/fiori/test/samples/NotificationListGroupItem.sample.html +++ b/packages/fiori/test/samples/NotificationListGroupItem.sample.html @@ -22,7 +22,6 @@ <h3>NotificationListGroupItem</h3> > <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -38,7 +37,6 @@ <h3>NotificationListGroupItem</h3> <ui5-li-notification show-close - truncate heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -65,7 +63,6 @@ <h3>NotificationListGroupItem</h3> > <ui5-li-notification show-close - truncate heading="New Delivery (#2900) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" > @@ -80,7 +77,6 @@ <h3>NotificationListGroupItem</h3> <ui5-li-notification show-close - truncate heading="New Delivery (#29001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" > @@ -106,7 +102,6 @@ <h3>NotificationListGroupItem</h3> > <ui5-li-notification show-close - truncate heading="New meeting at Building (#35001)" priority="Low" read @@ -120,7 +115,6 @@ <h3>NotificationListGroupItem</h3> <ui5-li-notification show-close - truncate heading="New meeting at Building (#35001)" priority="Low" read @@ -151,7 +145,6 @@ <h3>NotificationListGroupItem</h3> > <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -197,7 +190,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> > <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -213,7 +205,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> <ui5-li-notification show-close - truncate heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -240,7 +231,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> > <ui5-li-notification show-close - truncate heading="New Delivery (#2900) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" > @@ -255,7 +245,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> <ui5-li-notification show-close - truncate heading="New Delivery (#29001) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" > @@ -281,7 +270,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> > <ui5-li-notification show-close - truncate heading="New meeting at Building (#35001)" priority="High" read @@ -295,7 +283,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> <ui5-li-notification show-close - truncate heading="New meeting at Building (#35001)" priority="High" read @@ -342,7 +329,6 @@ <h3>NotificationListGroupItem In ShellBar</h3> > <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. diff --git a/packages/fiori/test/samples/NotificationListItem.sample.html b/packages/fiori/test/samples/NotificationListItem.sample.html index 847840881e50..fef18c7d9215 100644 --- a/packages/fiori/test/samples/NotificationListItem.sample.html +++ b/packages/fiori/test/samples/NotificationListItem.sample.html @@ -88,66 +88,6 @@ <h3>NotificationListItem</h3> </xmp></pre> </section> -<section> - <h3>NotificationListItem - Show "more/less"</h3> - <div class="snippet"> - <ui5-list id="myList2" class="full-width" header-text="Notifications"> - <ui5-li-notification - truncate - show-close - priority="Medium" - heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." - > - And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. - <ui5-avatar initials="ML" size="XS" slot="avatar"></ui5-avatar> - <span slot="footnotes">Monique Legrand</span> - <span slot="footnotes">2 Days</span> - </ui5-li-notification> - - <ui5-li-notification - truncate - show-close - priority="Medium" - heading="New order (#2526) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." - > - And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. - <ui5-avatar initials="AC" size="XS" slot="avatar"></ui5-avatar> - <span slot="footnotes">Alain Chevalier</span> - <span slot="footnotes">2 Days</span> - </ui5-li-notification> - - <ui5-li-notification - show-close - priority="Medium" - truncate - heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." - > - And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. - <ui5-avatar initials="JD" size="XS" slot="avatar"></ui5-avatar> - <span slot="footnotes">John Doe</span> - <span slot="footnotes">2 Days</span> - </ui5-li-notification> - </ui5-list> - </div> - <pre class="prettyprint lang-html"><xmp> -<ui5-list header-text="Notifications"> - <ui5-li-notification - truncate - show-close - priority="Medium" - heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit." - > - And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. - <ui5-avatar initials="ML" size="XS" slot="avatar"></ui5-avatar> - <span slot="footnotes">Monique Legrand</span> - <span slot="footnotes">2 Days</span> - </ui5-li-notification> - - ... -</ui5-list> - </xmp></pre> -</section> - <section> <h3>NotificationListItem - Custom Actions</h3> <div class="snippet"> @@ -228,7 +168,6 @@ <h3>NotificationListItem In ShellBar</h3> <ui5-list id="notificationListTop" header-text="Notifications"> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -242,7 +181,6 @@ <h3>NotificationListItem In ShellBar</h3> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="High" > @@ -258,7 +196,7 @@ <h3>NotificationListItem In ShellBar</h3> <ui5-li-notification heading="New order (#2565) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." priority="Medium" - truncate> + > Short description <ui5-avatar initials="JS" size="XS" slot="avatar"></ui5-avatar> @@ -269,7 +207,7 @@ <h3>NotificationListItem In ShellBar</h3> <ui5-notification-overflow-action icon="decline" text="Reject All Requested Information" slot="actions"></ui5-notification-overflow-action> </ui5-li-notification> - <ui5-li-notification heading="New order (#2523)" truncate> + <ui5-li-notification heading="New order (#2523)"> <div>. With a very long description - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc.</div> <span slot="footnotes">John SMith</span> @@ -305,7 +243,6 @@ <h3>NotificationListItem In ShellBar</h3> <ui5-list header-text="Notifications"> <ui5-li-notification show-close - truncate heading="New order (#2525) With a very long title - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc." > And with a very long description and long labels of the action buttons - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent feugiat, turpis vel scelerisque pharetra, tellus odio vehicula dolor, nec elementum lectus turpis at nunc. @@ -329,5 +266,4 @@ <h3>NotificationListItem In ShellBar</h3> </xmp></pre> </section> - <!-- JSDoc marker --> From a507dc44bedb57f9829f7649141caa7360979e7c Mon Sep 17 00:00:00 2001 From: ilhan <ilhan.myumyun@sap.com> Date: Wed, 13 May 2020 10:08:58 +0300 Subject: [PATCH 22/22] update jsdoc --- packages/fiori/src/NotificationListItem.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index c73a58cd6e75..171da41a93c6 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -42,12 +42,12 @@ const metadata = { properties: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { /** - * Defines if the <code>heading</code> and <code>decription</code> should truncate, - * they wrap by default. + * Defines if the <code>heading</code> and <code>decription</code> should wrap, + * they truncate by default. * * <br><br> - * <b>Note:</b> when set to <code>true</code> - * a <code>ShowMore/Less</code> button would be displayed. + * <b>Note:</b> by default the <code>heading</code> and <code>decription</code>, + * and a <code>ShowMore/Less</code> button would be displayed. * @defaultvalue false * @public */