Show all bar when editing commit message

- Moving show all bar to gr-editable-content
- Adding Save, Cancel buttons to show all bar
- textarea to block, so no space between textarea and show all bar
- Set min-height for editor to 160px same as viewer

The code will be cleaned up, when feature flag will be removed.

Change-Id: I303e57672c88c29bce757365e2b48722458f7695
This commit is contained in:
Milutin Kristofic
2021-02-08 08:53:33 +01:00
parent 41623da45e
commit c24dc5fb1d
5 changed files with 181 additions and 89 deletions

View File

@@ -367,13 +367,6 @@ export class GrChangeView extends KeyboardShortcutMixin(
}) })
_hideEditCommitMessage?: boolean; _hideEditCommitMessage?: boolean;
@property({
type: Boolean,
computed:
'_computeHideShowAllContainer(_hideEditCommitMessage, _commitCollapsible)',
})
_hideShowAllContainer = false;
@property({type: String}) @property({type: String})
_diffAgainst?: string; _diffAgainst?: string;
@@ -918,13 +911,6 @@ export class GrChangeView extends KeyboardShortcutMixin(
return changeStatuses(change, options); return changeStatuses(change, options);
} }
_computeHideShowAllContainer(
_hideEditCommitMessage?: boolean,
_commitCollapsible?: boolean
) {
return !_commitCollapsible && _hideEditCommitMessage;
}
_computeHideEditCommitMessage( _computeHideEditCommitMessage(
loggedIn: boolean, loggedIn: boolean,
editing: boolean, editing: boolean,
@@ -2363,6 +2349,9 @@ export class GrChangeView extends KeyboardShortcutMixin(
} }
_computeCommitMessageCollapsed(collapsed?: boolean, collapsible?: boolean) { _computeCommitMessageCollapsed(collapsed?: boolean, collapsible?: boolean) {
if (this._isNewChangeSummaryUiEnabled) {
return false;
}
return collapsible && collapsed; return collapsible && collapsed;
} }
@@ -2371,9 +2360,6 @@ export class GrChangeView extends KeyboardShortcutMixin(
} }
_computeCollapseText(collapsed: boolean) { _computeCollapseText(collapsed: boolean) {
if (this._isNewChangeSummaryUiEnabled) {
return collapsed ? 'Show all' : 'Show less';
}
// Symbols are up and down triangles. // Symbols are up and down triangles.
return collapsed ? '\u25bc Show more' : '\u25b2 Show less'; return collapsed ? '\u25bc Show more' : '\u25b2 Show less';
} }

View File

@@ -109,25 +109,6 @@ export const htmlTemplate = html`
/* Account for border and padding and rounding errors. */ /* Account for border and padding and rounding errors. */
max-width: calc(72ch + 2px + 2 * var(--spacing-m) + 0.4px); max-width: calc(72ch + 2px + 2 * var(--spacing-m) + 0.4px);
} }
.show-all-container {
background-color: var(--view-background-color);
display: flex;
justify-content: flex-end;
margin-bottom: 8px;
border-top-width: 1px;
border-top-style: solid;
border-radius: 0 0 4px 4px;
border-color: var(--border-color);
box-shadow: var(--elevation-level-1);
}
.show-all-container .show-all-button {
margin-right: auto;
}
.show-all-container iron-icon {
color: inherit;
--iron-icon-height: 18px;
--iron-icon-width: 18px;
}
.commitMessage gr-linked-text { .commitMessage gr-linked-text {
word-break: break-word; word-break: break-word;
} }
@@ -139,9 +120,6 @@ export const htmlTemplate = html`
.new-change-summary-true #commitMessageEditor { .new-change-summary-true #commitMessageEditor {
--collapsed-max-height: 300px; --collapsed-max-height: 300px;
} }
.new-change-summary-true gr-linked-text {
min-height: 160px;
}
.editCommitMessage { .editCommitMessage {
margin-top: var(--spacing-l); margin-top: var(--spacing-l);
@@ -492,9 +470,11 @@ export const htmlTemplate = html`
> >
<gr-editable-content <gr-editable-content
id="commitMessageEditor" id="commitMessageEditor"
editing="[[_editingCommitMessage]]" editing="{{_editingCommitMessage}}"
content="{{_latestCommitMessage}}" content="{{_latestCommitMessage}}"
storage-key="[[_computeCommitMessageKey(_change._number, _change.current_revision)]]" storage-key="[[_computeCommitMessageKey(_change._number, _change.current_revision)]]"
hide-edit-commit-message="[[_hideEditCommitMessage]]"
commit-collapsible="[[_commitCollapsible]]"
remove-zero-width-space="" remove-zero-width-space=""
collapsed$="[[_computeCommitMessageCollapsed(_commitCollapsed, _commitCollapsible)]]" collapsed$="[[_computeCommitMessageCollapsed(_commitCollapsed, _commitCollapsible)]]"
> >
@@ -505,37 +485,6 @@ export const htmlTemplate = html`
remove-zero-width-space="" remove-zero-width-space=""
></gr-linked-text> ></gr-linked-text>
</gr-editable-content> </gr-editable-content>
<template is="dom-if" if="[[_isNewChangeSummaryUiEnabled]]">
<div
class="show-all-container"
hidden$="[[_hideShowAllContainer]]"
>
<gr-button
link=""
class="show-all-button"
on-click="_toggleCommitCollapsed"
hidden$="[[!_commitCollapsible]]"
><iron-icon
icon="gr-icons:expand-more"
hidden$="[[!_commitCollapsed]]"
></iron-icon
><iron-icon
icon="gr-icons:expand-less"
hidden$="[[_commitCollapsed]]"
></iron-icon>
[[_computeCollapseText(_commitCollapsed)]]
</gr-button>
<gr-button
link=""
class="edit-commit-message"
title="Edit commit message"
on-click="_handleEditCommitMessage"
hidden$="[[_hideEditCommitMessage]]"
><iron-icon icon="gr-icons:edit"></iron-icon>
Edit</gr-button
>
</div>
</template>
<template is="dom-if" if="[[!_isNewChangeSummaryUiEnabled]]"> <template is="dom-if" if="[[!_isNewChangeSummaryUiEnabled]]">
<gr-button <gr-button
link="" link=""

View File

@@ -25,6 +25,8 @@ import {PolymerElement} from '@polymer/polymer/polymer-element';
import {customElement, property} from '@polymer/decorators'; import {customElement, property} from '@polymer/decorators';
import {htmlTemplate} from './gr-editable-content_html'; import {htmlTemplate} from './gr-editable-content_html';
import {fireAlert, fireEvent} from '../../../utils/event-util'; import {fireAlert, fireEvent} from '../../../utils/event-util';
import {appContext} from '../../../services/app-context';
import {KnownExperimentId} from '../../../services/flags/flags';
const RESTORED_MESSAGE = 'Content restored from a previous edit.'; const RESTORED_MESSAGE = 'Content restored from a previous edit.';
const STORAGE_DEBOUNCE_INTERVAL_MS = 400; const STORAGE_DEBOUNCE_INTERVAL_MS = 400;
@@ -67,7 +69,7 @@ export class GrEditableContent extends GestureEventListeners(
@property({type: Boolean, reflectToAttribute: true}) @property({type: Boolean, reflectToAttribute: true})
disabled = false; disabled = false;
@property({type: Boolean, observer: '_editingChanged'}) @property({type: Boolean, observer: '_editingChanged', notify: true})
editing = false; editing = false;
@property({type: Boolean}) @property({type: Boolean})
@@ -77,6 +79,29 @@ export class GrEditableContent extends GestureEventListeners(
@property({type: String}) @property({type: String})
storageKey?: string; storageKey?: string;
/** If false, then the "Show more" button was used to expand. */
@property({type: Boolean})
_commitCollapsed = true;
@property({type: Boolean})
commitCollapsible = true;
@property({
type: Boolean,
computed:
'_computeHideShowAllContainer(hideEditCommitMessage, _hideShowAllButton, editing)',
})
_hideShowAllContainer = false;
@property({
type: Boolean,
computed: '_computeHideShowAllButton(commitCollapsible, editing)',
})
_hideShowAllButton = false;
@property({type: Boolean})
hideEditCommitMessage?: boolean;
@property({ @property({
type: Boolean, type: Boolean,
computed: '_computeSaveDisabled(disabled, content, _newContent)', computed: '_computeSaveDisabled(disabled, content, _newContent)',
@@ -86,8 +111,21 @@ export class GrEditableContent extends GestureEventListeners(
@property({type: String, observer: '_newContentChanged'}) @property({type: String, observer: '_newContentChanged'})
_newContent?: string; _newContent?: string;
@property({type: Boolean})
_isNewChangeSummaryUiEnabled = false;
private readonly storage = new GrStorage(); private readonly storage = new GrStorage();
private readonly flagsService = appContext.flagsService;
/** @override */
ready() {
super.ready();
this._isNewChangeSummaryUiEnabled = this.flagsService.isEnabled(
KnownExperimentId.NEW_CHANGE_SUMMARY_UI
);
}
_contentChanged() { _contentChanged() {
/* A changed content means that either a different change has been loaded /* A changed content means that either a different change has been loaded
* or new content was saved. Either way, let's reset the component. * or new content was saved. Either way, let's reset the component.
@@ -186,4 +224,37 @@ export class GrEditableContent extends GestureEventListeners(
this.editing = false; this.editing = false;
fireEvent(this, 'editable-content-cancel'); fireEvent(this, 'editable-content-cancel');
} }
_computeCollapseText(collapsed: boolean) {
return collapsed ? 'Show all' : 'Show less';
}
_toggleCommitCollapsed() {
this._commitCollapsed = !this._commitCollapsed;
if (this._commitCollapsed) {
window.scrollTo(0, 0);
}
}
_computeHideShowAllContainer(
hideEditCommitMessage?: boolean,
_hideShowAllButton?: boolean,
editing?: boolean
) {
if (editing) return false;
return _hideShowAllButton && hideEditCommitMessage;
}
_computeHideShowAllButton(commitCollapsible?: boolean, editing?: boolean) {
return !commitCollapsible || editing;
}
_computeCommitMessageCollapsed(collapsed?: boolean, collapsible?: boolean) {
return collapsible && collapsed;
}
_handleEditCommitMessage() {
this.editing = true;
this.focusTextarea();
}
} }

View File

@@ -31,13 +31,19 @@ export const htmlTemplate = html`
box-shadow: var(--elevation-level-1); box-shadow: var(--elevation-level-1);
padding: var(--spacing-m); padding: var(--spacing-m);
} }
:host([collapsed]) .viewer { :host([collapsed]) .viewer,
.viewer[collapsed] {
max-height: var(--collapsed-max-height, 300px); max-height: var(--collapsed-max-height, 300px);
overflow: hidden; overflow: hidden;
} }
.editor.new-change-summary-true iron-autogrow-textarea,
.viewer.new-change-summary-true {
min-height: 160px;
}
.editor iron-autogrow-textarea { .editor iron-autogrow-textarea {
background-color: var(--view-background-color); background-color: var(--view-background-color);
width: 100%; width: 100%;
display: block;
/* You have to also repeat everything from shared-styles here, because /* You have to also repeat everything from shared-styles here, because
you can only *replace* --iron-autogrow-textarea vars as a whole. */ you can only *replace* --iron-autogrow-textarea vars as a whole. */
@@ -52,23 +58,103 @@ export const htmlTemplate = html`
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.show-all-container {
background-color: var(--view-background-color);
display: flex;
justify-content: flex-end;
margin-bottom: 8px;
border-top-width: 1px;
border-top-style: solid;
border-radius: 0 0 4px 4px;
border-color: var(--border-color);
box-shadow: var(--elevation-level-1);
}
.show-all-container .show-all-button {
margin-right: auto;
}
.show-all-container iron-icon {
color: inherit;
--iron-icon-height: 18px;
--iron-icon-width: 18px;
}
.cancel-button {
margin-right: var(--spacing-l);
}
.save-button {
margin-right: var(--spacing-xs);
}
</style> </style>
<div class="viewer" hidden$="[[editing]]"> <div
class$="viewer new-change-summary-[[_isNewChangeSummaryUiEnabled]]"
hidden$="[[editing]]"
collapsed$="[[_computeCommitMessageCollapsed(_commitCollapsed, commitCollapsible)]]"
>
<slot></slot> <slot></slot>
</div> </div>
<div class="editor" hidden$="[[!editing]]"> <div
<iron-autogrow-textarea class$="editor new-change-summary-[[_isNewChangeSummaryUiEnabled]]"
autocomplete="on" hidden$="[[!editing]]"
bind-value="{{_newContent}}" >
disabled="[[disabled]]" <div>
></iron-autogrow-textarea> <iron-autogrow-textarea
<div class="editButtons"> autocomplete="on"
<gr-button primary="" on-click="_handleSave" disabled="[[_saveDisabled]]" bind-value="{{_newContent}}"
>Save</gr-button disabled="[[disabled]]"
> ></iron-autogrow-textarea>
<gr-button on-click="_handleCancel" disabled="[[disabled]]" <div class="editButtons" hidden$="[[_isNewChangeSummaryUiEnabled]]">
>Cancel</gr-button <gr-button
> primary=""
on-click="_handleSave"
disabled="[[_saveDisabled]]"
>Save</gr-button
>
<gr-button on-click="_handleCancel" disabled="[[disabled]]"
>Cancel</gr-button
>
</div>
</div> </div>
</div> </div>
<template is="dom-if" if="[[_isNewChangeSummaryUiEnabled]]">
<div class="show-all-container" hidden$="[[_hideShowAllContainer]]">
<gr-button
link=""
class="show-all-button"
on-click="_toggleCommitCollapsed"
hidden$="[[_hideShowAllButton]]"
><iron-icon
icon="gr-icons:expand-more"
hidden$="[[!_commitCollapsed]]"
></iron-icon
><iron-icon
icon="gr-icons:expand-less"
hidden$="[[_commitCollapsed]]"
></iron-icon>
[[_computeCollapseText(_commitCollapsed)]]
</gr-button>
<gr-button
link=""
class="edit-commit-message"
title="Edit commit message"
on-click="_handleEditCommitMessage"
hidden$="[[hideEditCommitMessage]]"
><iron-icon icon="gr-icons:edit"></iron-icon> Edit</gr-button
>
<div class="editButtons" hidden$="[[!editing]]">
<gr-button
link=""
class="cancel-button"
on-click="_handleCancel"
disabled="[[disabled]]"
>Cancel</gr-button
>
<gr-button
class="save-button"
primary=""
on-click="_handleSave"
disabled="[[_saveDisabled]]"
>Save</gr-button
>
</div>
</div>
</template>
`; `;

View File

@@ -105,7 +105,7 @@ suite('gr-editable-content tests', () => {
assert.equal(element._newContent, 'stored content'); assert.equal(element._newContent, 'stored content');
assert.isTrue(dispatchSpy.called); assert.isTrue(dispatchSpy.called);
assert.equal(dispatchSpy.lastCall.args[0].type, 'show-alert'); assert.equal(dispatchSpy.firstCall.args[0].type, 'show-alert');
}); });
test('editing toggled to true, has no stored data', () => { test('editing toggled to true, has no stored data', () => {
@@ -114,7 +114,7 @@ suite('gr-editable-content tests', () => {
element.editing = true; element.editing = true;
assert.equal(element._newContent, 'current content'); assert.equal(element._newContent, 'current content');
assert.isFalse(dispatchSpy.called); assert.equal(dispatchSpy.firstCall.args[0].type, 'editing-changed');
}); });
test('edits are cached', () => { test('edits are cached', () => {