From dc7909d6b0f8ffe798125de43a7881e6ae3f26c7 Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Thu, 5 Nov 2020 14:37:04 +0100
Subject: [PATCH] Add a new LoadingButton component

Add anew one since this adds some default padding and I don't want to
break existing layouts by changing the normal button.

If we figure out a way to keep the layout the same without changing
the padding then we can merge things back.

Also align the mini spinner a bit better with text
---
 packages/common/index.js            |  4 +-
 packages/common/src/button.js       | 76 +++++++++++++++++++++++++++++
 packages/common/src/mini-spinner.js |  1 +
 3 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/packages/common/index.js b/packages/common/index.js
index c4e7bb02..ed77d0e4 100644
--- a/packages/common/index.js
+++ b/packages/common/index.js
@@ -2,11 +2,11 @@ import {EventBus} from './src/eventbus.js';
 import {createLinkedAbortController, createTimeoutAbortSignal} from './src/abort.js';
 import {getIconSVGURL, getIconCSS, Icon} from './src/icon.js';
 import {MiniSpinner} from './src/mini-spinner.js';
-import {Button} from './src/button.js';
+import {Button, LoadingButton} from './src/button.js';
 import {Spinner} from './src/spinner.js';
 
 export {EventBus, createLinkedAbortController, createTimeoutAbortSignal};
 export {getIconSVGURL, getIconCSS, Icon};
 export {MiniSpinner};
-export {Button};
+export {Button, LoadingButton};
 export {Spinner};
\ No newline at end of file
diff --git a/packages/common/src/button.js b/packages/common/src/button.js
index 26d192a9..26d22b7b 100644
--- a/packages/common/src/button.js
+++ b/packages/common/src/button.js
@@ -80,3 +80,79 @@ export class Button extends ScopedElementsMixin(LitElement) {
         `;
     }
 }
+
+export class LoadingButton extends ScopedElementsMixin(LitElement) {
+    constructor() {
+        super();
+        this.value = "";
+        this.type = "";
+        this.loading = false;
+        this.disabled = false;
+    }
+
+    static get scopedElements() {
+        return {
+            'dbp-mini-spinner': MiniSpinner,
+        };
+    }
+
+    static get properties() {
+        return {
+            value: { type: String },
+            type: { type: String },
+            loading: { type: Boolean },
+            disabled: { type: Boolean, reflect: true },
+        };
+    }
+
+    start() {
+        this.loading = true;
+        this.disabled = true;
+    }
+
+    stop() {
+        this.loading = false;
+        this.disabled = false;
+    }
+
+    static get styles() {
+        // language=css
+        return css`
+            ${commonStyles.getThemeCSS()}
+            ${commonStyles.getButtonCSS()}
+
+            .spinner {
+                padding-left: 0.5em;
+                min-width: 16px;
+            }
+
+            .loading-container {
+                display: flex;
+                align-items: baseline;
+            }
+
+            .label {
+                white-space: nowrap;
+                overflow: hidden;
+                text-overflow: ellipsis;
+            }
+
+            :host {
+                display: inline-block;
+            }
+
+            .is-not-loading .label {
+                padding-left: 12px;
+                padding-right: 12px;
+            }
+        `;
+    }
+
+    render() {
+        return html`
+            <button class="button ${this.type} loading-container  ${!this.loading ? "is-not-loading" : ""}" ?disabled="${this.disabled}">
+                <div class="label">${this.value}</div> <dbp-mini-spinner class="spinner" style="display: ${this.loading ? "inline" : "none"}"></dbp-mini-spinner>
+            </button>
+        `;
+    }
+}
diff --git a/packages/common/src/mini-spinner.js b/packages/common/src/mini-spinner.js
index 67e76999..f03d734d 100644
--- a/packages/common/src/mini-spinner.js
+++ b/packages/common/src/mini-spinner.js
@@ -17,6 +17,7 @@ export class MiniSpinner extends LitElement {
         return css`
         .outer {
             display: inline-block;
+            vertical-align: sub;
         }
         .inner {
             display: flex;
-- 
GitLab