2024-01-18 02:08:19 +01:00
|
|
|
import * as colors from './00colors.js';
|
|
|
|
import * as plugins from './00plugins.js';
|
|
|
|
|
2023-09-07 18:34:38 +02:00
|
|
|
import { demoFunc } from './dees-dataview-statusobject.demo.js';
|
2023-04-05 14:46:20 +02:00
|
|
|
import {
|
|
|
|
DeesElement,
|
|
|
|
html,
|
|
|
|
customElement,
|
2023-08-07 20:02:18 +02:00
|
|
|
type TemplateResult,
|
2023-04-05 14:46:20 +02:00
|
|
|
property,
|
|
|
|
state,
|
|
|
|
cssManager,
|
|
|
|
css,
|
2023-08-07 20:02:18 +02:00
|
|
|
type CSSResult,
|
2023-08-07 19:13:29 +02:00
|
|
|
} from '@design.estate/dees-element';
|
2023-04-05 14:46:20 +02:00
|
|
|
|
|
|
|
import * as tsclass from '@tsclass/tsclass';
|
2025-06-27 15:58:26 +00:00
|
|
|
import { DeesContextmenu } from './dees-contextmenu.js';
|
2023-04-05 14:46:20 +02:00
|
|
|
|
|
|
|
declare global {
|
|
|
|
interface HTMLElementTagNameMap {
|
|
|
|
'dees-dataview-statusobject': DeesDataviewStatusobject;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@customElement('dees-dataview-statusobject')
|
|
|
|
export class DeesDataviewStatusobject extends DeesElement {
|
2023-09-07 18:34:38 +02:00
|
|
|
public static demo = demoFunc;
|
2023-04-05 14:46:20 +02:00
|
|
|
|
|
|
|
@property({ type: Object }) statusObject: tsclass.code.IStatusObject;
|
|
|
|
|
|
|
|
public static styles = [
|
|
|
|
cssManager.defaultStyles,
|
|
|
|
css`
|
2025-06-27 15:58:26 +00:00
|
|
|
:host {
|
|
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
|
|
|
|
}
|
|
|
|
|
2023-04-05 14:46:20 +02:00
|
|
|
.mainbox {
|
2023-10-05 22:42:33 +02:00
|
|
|
border-radius: 8px;
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 3.9%)')};
|
|
|
|
border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
|
|
|
|
box-shadow: 0 1px 3px 0 hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
|
2023-04-05 14:46:20 +02:00
|
|
|
min-height: 48px;
|
2025-06-27 15:58:26 +00:00
|
|
|
color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 98%)')};
|
2024-01-18 02:08:19 +01:00
|
|
|
cursor: default;
|
2025-06-27 15:58:26 +00:00
|
|
|
overflow: hidden;
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.heading {
|
|
|
|
display: grid;
|
|
|
|
align-items: center;
|
2025-06-27 15:58:26 +00:00
|
|
|
grid-template-columns: 48px auto 100px;
|
|
|
|
height: 56px;
|
|
|
|
padding: 0 16px;
|
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')};
|
|
|
|
border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
h1 {
|
|
|
|
display: block;
|
|
|
|
margin: 0px;
|
2025-06-27 15:58:26 +00:00
|
|
|
padding: 0px 12px;
|
|
|
|
font-size: 14px;
|
|
|
|
font-weight: 500;
|
|
|
|
letter-spacing: -0.01em;
|
|
|
|
color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 93.9%)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.statusdot {
|
2025-06-27 15:58:26 +00:00
|
|
|
height: 10px;
|
|
|
|
width: 10px;
|
|
|
|
border-radius: 50%;
|
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 63.9%)', 'hsl(0 0% 45.1%)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
margin: auto;
|
2025-06-27 15:58:26 +00:00
|
|
|
box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(0 0% 63.9% / 0.2)', 'hsl(0 0% 45.1% / 0.2)')};
|
|
|
|
transition: all 0.2s ease;
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.copyMain {
|
2025-06-27 15:58:26 +00:00
|
|
|
font-size: 12px;
|
|
|
|
font-weight: 500;
|
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 14.9%)')};
|
|
|
|
border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
text-align: center;
|
2025-06-27 15:58:26 +00:00
|
|
|
padding: 6px 12px;
|
|
|
|
border-radius: 6px;
|
|
|
|
color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')};
|
2024-01-18 02:08:19 +01:00
|
|
|
user-select: none;
|
2025-06-27 15:58:26 +00:00
|
|
|
cursor: pointer;
|
|
|
|
transition: all 0.15s ease;
|
2024-01-18 02:08:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
.copyMain:hover {
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 95.1%)', 'hsl(0 0% 14.9%)')};
|
|
|
|
border-color: ${cssManager.bdTheme('hsl(0 0% 79.8%)', 'hsl(0 0% 20.9%)')};
|
|
|
|
color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 93.9%)')};
|
2024-01-18 02:08:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
.copyMain:active {
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 91%)', 'hsl(0 0% 14.9%)')};
|
|
|
|
transform: scale(0.98);
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.statusdot.ok {
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(142.1 76.2% 36.3%)', 'hsl(142.1 70.6% 45.3%)')};
|
|
|
|
box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(142.1 76.2% 36.3% / 0.2)', 'hsl(142.1 70.6% 45.3% / 0.2)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
2025-06-27 15:58:26 +00:00
|
|
|
.statusdot.not_ok {
|
|
|
|
background: ${cssManager.bdTheme('hsl(0 84.2% 60.2%)', 'hsl(0 72.2% 50.6%)')};
|
|
|
|
box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(0 84.2% 60.2% / 0.2)', 'hsl(0 72.2% 50.6% / 0.2)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.statusdot.partly_ok {
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(25 95% 53%)', 'hsl(25 95% 63%)')};
|
|
|
|
box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(25 95% 53% / 0.2)', 'hsl(25 95% 63% / 0.2)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.detail {
|
2024-01-18 02:08:19 +01:00
|
|
|
min-height: 60px;
|
2023-04-05 14:46:20 +02:00
|
|
|
align-items: center;
|
|
|
|
display: grid;
|
2025-06-27 15:58:26 +00:00
|
|
|
grid-template-columns: 48px auto;
|
|
|
|
border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(0 0% 14.9%)')};
|
|
|
|
transition: background-color 0.15s ease;
|
|
|
|
padding-right: 16px;
|
|
|
|
cursor: context-menu;
|
2024-01-18 02:08:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
.detail:hover {
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')};
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
2024-01-21 01:12:57 +01:00
|
|
|
.detail:active {
|
2025-06-27 15:58:26 +00:00
|
|
|
background: ${cssManager.bdTheme('hsl(0 0% 95%)', 'hsl(0 0% 9%)')};
|
2024-01-21 01:12:57 +01:00
|
|
|
}
|
|
|
|
|
2023-04-07 23:55:55 +02:00
|
|
|
.detail .detailsText {
|
2025-06-27 15:58:26 +00:00
|
|
|
padding: 12px;
|
2023-04-10 00:26:55 +02:00
|
|
|
word-break: break-all;
|
2023-04-07 23:55:55 +02:00
|
|
|
}
|
|
|
|
|
2023-04-05 14:46:20 +02:00
|
|
|
.detail .detailsText .label {
|
|
|
|
font-size: 12px;
|
2025-06-27 15:58:26 +00:00
|
|
|
font-weight: 500;
|
|
|
|
color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')}
|
|
|
|
margin-bottom: 2px;
|
|
|
|
letter-spacing: -0.01em;
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.detail .detailsText .value {
|
2023-09-07 18:34:38 +02:00
|
|
|
font-size: 14px;
|
2025-06-27 15:58:26 +00:00
|
|
|
font-family: 'Intel One Mono', 'Geist Mono', monospace;
|
|
|
|
color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')};
|
|
|
|
line-height: 1.5;
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|
|
|
|
`,
|
|
|
|
];
|
|
|
|
|
|
|
|
render(): TemplateResult {
|
|
|
|
return html`
|
|
|
|
<div class="mainbox">
|
|
|
|
<div class="heading">
|
2023-04-05 17:17:02 +02:00
|
|
|
<div class="statusdot ${this.statusObject?.combinedStatus}"></div>
|
2025-06-27 15:58:26 +00:00
|
|
|
<h1>${this.statusObject?.name || 'No status object assigned'}</h1>
|
|
|
|
<div class="copyMain" @click=${this.handleCopyAsJson}>Copy JSON</div>
|
2023-04-05 14:46:20 +02:00
|
|
|
</div>
|
2023-04-05 17:00:44 +02:00
|
|
|
${this.statusObject?.details?.map((detailArg) => {
|
2023-04-05 14:46:20 +02:00
|
|
|
return html`
|
2025-06-27 15:58:26 +00:00
|
|
|
<div
|
|
|
|
class="detail"
|
|
|
|
@contextmenu=${(event: MouseEvent) => {
|
|
|
|
event.preventDefault();
|
|
|
|
DeesContextmenu.openContextMenuWithOptions(event, [
|
|
|
|
{
|
|
|
|
name: 'Copy Value',
|
|
|
|
iconName: 'lucideCopy',
|
|
|
|
action: async () => {
|
|
|
|
await this.copyToClipboard(detailArg.value, 'Value');
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'Copy Key',
|
|
|
|
iconName: 'lucideKey',
|
|
|
|
action: async () => {
|
|
|
|
await this.copyToClipboard(detailArg.name, 'Key');
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'Copy Key:Value',
|
|
|
|
iconName: 'lucideCopyPlus',
|
|
|
|
action: async () => {
|
|
|
|
await this.copyToClipboard(`${detailArg.name}: ${detailArg.value}`, 'Key:Value');
|
|
|
|
},
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
}}
|
|
|
|
>
|
2023-04-05 14:46:20 +02:00
|
|
|
<div class="statusdot ${detailArg.status}"></div>
|
|
|
|
<div class="detailsText">
|
|
|
|
<div class="label">${detailArg.name}</div>
|
|
|
|
<div class="value">${detailArg.value}</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
`;
|
|
|
|
})}
|
|
|
|
</div>
|
|
|
|
`;
|
|
|
|
}
|
|
|
|
|
|
|
|
async firstUpdated() {}
|
2025-06-27 15:58:26 +00:00
|
|
|
|
|
|
|
private async copyToClipboard(text: string, type: string = 'Text') {
|
|
|
|
try {
|
|
|
|
await navigator.clipboard.writeText(text);
|
|
|
|
console.log(`${type} copied to clipboard`);
|
|
|
|
// You could add visual feedback here if needed
|
|
|
|
} catch (err) {
|
|
|
|
console.error(`Failed to copy ${type}:`, err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async handleCopyAsJson() {
|
|
|
|
if (!this.statusObject) return;
|
|
|
|
|
|
|
|
try {
|
|
|
|
await navigator.clipboard.writeText(JSON.stringify(this.statusObject, null, 2));
|
|
|
|
|
|
|
|
// Show feedback
|
|
|
|
const button = this.shadowRoot.querySelector('.copyMain') as HTMLElement;
|
|
|
|
const originalText = button.textContent;
|
|
|
|
button.textContent = 'Copied!';
|
|
|
|
|
|
|
|
// Apply success styles based on theme
|
|
|
|
const isDark = !this.goBright;
|
|
|
|
button.style.background = isDark ? 'hsl(142.1 70.6% 45.3% / 0.1)' : 'hsl(142.1 76.2% 36.3% / 0.1)';
|
|
|
|
button.style.borderColor = isDark ? 'hsl(142.1 70.6% 45.3%)' : 'hsl(142.1 76.2% 36.3%)';
|
|
|
|
button.style.color = isDark ? 'hsl(142.1 70.6% 45.3%)' : 'hsl(142.1 76.2% 36.3%)';
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
button.textContent = originalText;
|
|
|
|
button.style.background = '';
|
|
|
|
button.style.borderColor = '';
|
|
|
|
button.style.color = '';
|
|
|
|
}, 1500);
|
|
|
|
} catch (err) {
|
|
|
|
console.error('Failed to copy:', err);
|
|
|
|
}
|
|
|
|
}
|
2023-04-05 14:46:20 +02:00
|
|
|
}
|