Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 45a2743312 | |||
| c5b50f3eb0 | |||
| aedd4a041c | |||
| 1f37474d3f |
14
changelog.md
14
changelog.md
@@ -1,5 +1,19 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-12-29 - 3.6.1 - fix(readme)
|
||||||
|
document new App UI APIs to control main/secondary menu and content tabs visibility
|
||||||
|
|
||||||
|
- Added docs for setMainMenuCollapsed(), setMainMenuVisible(), setSecondaryMenuCollapsed(), setSecondaryMenuVisible(), and setContentTabsVisible() programmatic APIs.
|
||||||
|
- Included a TypeScript example showing how to hide secondary menu, hide content tabs, and collapse the main menu in a view's onActivate hook.
|
||||||
|
|
||||||
|
## 2025-12-29 - 3.6.0 - feat(dees-appui)
|
||||||
|
add visibility toggles for main/secondary menus and ability to show/hide content tabs; expose corresponding setters and appconfig entries
|
||||||
|
|
||||||
|
- ts_web/elements/00group-appui/dees-appui-base: added boolean properties mainmenuVisible, secondarymenuVisible, maincontentTabsVisible; render main and secondary menus conditionally; pass showTabs to dees-appui-maincontent; added setter methods: setMainMenuVisible, setSecondaryMenuCollapsed, setSecondaryMenuVisible, setContentTabsVisible.
|
||||||
|
- ts_web/elements/00group-appui/dees-appui-maincontent: added showTabs property, support for a notabs attribute via styles, updated() and firstUpdated() to apply notabs state so tabs can be hidden/shown dynamically.
|
||||||
|
- ts_web/elements/interfaces/appconfig.ts: expanded appconfig interface to include setMainMenuVisible, setSecondaryMenuCollapsed, setSecondaryMenuVisible, setContentTabsVisible so host app can control visibility programmatically.
|
||||||
|
- No breaking changes: defaults preserve existing behavior (menus and tabs remain visible by default).
|
||||||
|
|
||||||
## 2025-12-29 - 3.5.1 - fix(dees-appui-view)
|
## 2025-12-29 - 3.5.1 - fix(dees-appui-view)
|
||||||
remove DeesAppuiView component, its demo, documentation snippet, and related exports
|
remove DeesAppuiView component, its demo, documentation snippet, and related exports
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@design.estate/dees-catalog",
|
"name": "@design.estate/dees-catalog",
|
||||||
"version": "3.5.1",
|
"version": "3.6.1",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
|
"description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
|
||||||
"main": "dist_ts_web/index.js",
|
"main": "dist_ts_web/index.js",
|
||||||
|
|||||||
21
readme.md
21
readme.md
@@ -54,7 +54,7 @@ For developers working on this library, please refer to the [UI Components Playb
|
|||||||
|----------|------------|
|
|----------|------------|
|
||||||
| **Core UI** | [`DeesButton`](#deesbutton), [`DeesButtonExit`](#deesbuttonexit), [`DeesButtonGroup`](#deesbuttongroup), [`DeesBadge`](#deesbadge), [`DeesChips`](#deeschips), [`DeesHeading`](#deesheading), [`DeesHint`](#deeshint), [`DeesIcon`](#deesicon), [`DeesLabel`](#deeslabel), [`DeesPanel`](#deespanel), [`DeesSearchbar`](#deessearchbar), [`DeesSpinner`](#deesspinner), [`DeesToast`](#deestoast), [`DeesWindowcontrols`](#deeswindowcontrols) |
|
| **Core UI** | [`DeesButton`](#deesbutton), [`DeesButtonExit`](#deesbuttonexit), [`DeesButtonGroup`](#deesbuttongroup), [`DeesBadge`](#deesbadge), [`DeesChips`](#deeschips), [`DeesHeading`](#deesheading), [`DeesHint`](#deeshint), [`DeesIcon`](#deesicon), [`DeesLabel`](#deeslabel), [`DeesPanel`](#deespanel), [`DeesSearchbar`](#deessearchbar), [`DeesSpinner`](#deesspinner), [`DeesToast`](#deestoast), [`DeesWindowcontrols`](#deeswindowcontrols) |
|
||||||
| **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesFormSubmit`](#deesformsubmit) |
|
| **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesFormSubmit`](#deesformsubmit) |
|
||||||
| **Layout** | [`DeesAppuiBase`](#deesappuibase), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesAppuiView`](#deesappuiview), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) |
|
| **Layout** | [`DeesAppuiBase`](#deesappuibase), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) |
|
||||||
| **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination) |
|
| **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination) |
|
||||||
| **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) |
|
| **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) |
|
||||||
| **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) |
|
| **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) |
|
||||||
@@ -666,9 +666,26 @@ class MyApp extends DeesElement {
|
|||||||
- `navigateToView(viewId, params?)` - Navigate between views
|
- `navigateToView(viewId, params?)` - Navigate between views
|
||||||
- `setAppBarMenus()`, `setBreadcrumbs()`, `setUser()` - Control the app bar
|
- `setAppBarMenus()`, `setBreadcrumbs()`, `setUser()` - Control the app bar
|
||||||
- `setMainMenu()`, `setMainMenuSelection()`, `setMainMenuBadge()` - Control main navigation
|
- `setMainMenu()`, `setMainMenuSelection()`, `setMainMenuBadge()` - Control main navigation
|
||||||
- `setSecondaryMenu()`, `setContentTabs()` - Control view-specific UI
|
- `setMainMenuCollapsed()`, `setMainMenuVisible()` - Control main menu visibility
|
||||||
|
- `setSecondaryMenu()`, `setSecondaryMenuCollapsed()`, `setSecondaryMenuVisible()` - Control secondary menu
|
||||||
|
- `setContentTabs()`, `setContentTabsVisible()` - Control view-specific UI
|
||||||
- `activityLog.add()`, `activityLog.addMany()`, `activityLog.clear()` - Manage activity entries
|
- `activityLog.add()`, `activityLog.addMany()`, `activityLog.clear()` - Manage activity entries
|
||||||
|
|
||||||
|
**View Visibility Control:**
|
||||||
|
```typescript
|
||||||
|
// In your view's onActivate hook
|
||||||
|
onActivate(context: IViewActivationContext) {
|
||||||
|
// Hide secondary menu for a fullscreen view
|
||||||
|
context.appui.setSecondaryMenuVisible(false);
|
||||||
|
|
||||||
|
// Hide content tabs
|
||||||
|
context.appui.setContentTabsVisible(false);
|
||||||
|
|
||||||
|
// Collapse main menu to give more space
|
||||||
|
context.appui.setMainMenuCollapsed(true);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
#### `DeesAppuiMainmenu`
|
#### `DeesAppuiMainmenu`
|
||||||
Main navigation menu component for application-wide navigation.
|
Main navigation menu component for application-wide navigation.
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@design.estate/dees-catalog',
|
name: '@design.estate/dees-catalog',
|
||||||
version: '3.5.1',
|
version: '3.6.1',
|
||||||
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
|
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,6 +110,16 @@ export class DeesAppuiBase extends DeesElement {
|
|||||||
@property({ type: Boolean })
|
@property({ type: Boolean })
|
||||||
accessor secondarymenuCollapsed: boolean = false;
|
accessor secondarymenuCollapsed: boolean = false;
|
||||||
|
|
||||||
|
// Visibility states
|
||||||
|
@property({ type: Boolean })
|
||||||
|
accessor mainmenuVisible: boolean = true;
|
||||||
|
|
||||||
|
@property({ type: Boolean })
|
||||||
|
accessor secondarymenuVisible: boolean = true;
|
||||||
|
|
||||||
|
@property({ type: Boolean })
|
||||||
|
accessor maincontentTabsVisible: boolean = true;
|
||||||
|
|
||||||
// Properties for maincontent
|
// Properties for maincontent
|
||||||
@property({ type: Array })
|
@property({ type: Array })
|
||||||
accessor maincontentTabs: interfaces.IMenuItem[] = [];
|
accessor maincontentTabs: interfaces.IMenuItem[] = [];
|
||||||
@@ -213,28 +223,33 @@ export class DeesAppuiBase extends DeesElement {
|
|||||||
@profile-menu-select=${(e: CustomEvent) => this.handleAppbarProfileMenuSelect(e)}
|
@profile-menu-select=${(e: CustomEvent) => this.handleAppbarProfileMenuSelect(e)}
|
||||||
></dees-appui-appbar>
|
></dees-appui-appbar>
|
||||||
<div class="maingrid">
|
<div class="maingrid">
|
||||||
<dees-appui-mainmenu
|
${this.mainmenuVisible ? html`
|
||||||
.logoIcon=${this.mainmenuLogoIcon}
|
<dees-appui-mainmenu
|
||||||
.logoText=${this.mainmenuLogoText}
|
.logoIcon=${this.mainmenuLogoIcon}
|
||||||
.menuGroups=${this.mainmenuGroups}
|
.logoText=${this.mainmenuLogoText}
|
||||||
.bottomTabs=${this.mainmenuBottomTabs}
|
.menuGroups=${this.mainmenuGroups}
|
||||||
.tabs=${this.mainmenuTabs}
|
.bottomTabs=${this.mainmenuBottomTabs}
|
||||||
.selectedTab=${this.mainmenuSelectedTab}
|
.tabs=${this.mainmenuTabs}
|
||||||
.collapsed=${this.mainmenuCollapsed}
|
.selectedTab=${this.mainmenuSelectedTab}
|
||||||
@tab-select=${(e: CustomEvent) => this.handleMainmenuTabSelect(e)}
|
.collapsed=${this.mainmenuCollapsed}
|
||||||
@collapse-change=${(e: CustomEvent) => this.handleMainmenuCollapseChange(e)}
|
@tab-select=${(e: CustomEvent) => this.handleMainmenuTabSelect(e)}
|
||||||
></dees-appui-mainmenu>
|
@collapse-change=${(e: CustomEvent) => this.handleMainmenuCollapseChange(e)}
|
||||||
<dees-appui-secondarymenu
|
></dees-appui-mainmenu>
|
||||||
.heading=${this.secondarymenuHeading}
|
` : ''}
|
||||||
.groups=${this.secondarymenuGroups}
|
${this.secondarymenuVisible ? html`
|
||||||
.selectedItem=${this.secondarymenuSelectedItem}
|
<dees-appui-secondarymenu
|
||||||
.collapsed=${this.secondarymenuCollapsed}
|
.heading=${this.secondarymenuHeading}
|
||||||
@item-select=${(e: CustomEvent) => this.handleSecondarymenuItemSelect(e)}
|
.groups=${this.secondarymenuGroups}
|
||||||
@collapse-change=${(e: CustomEvent) => this.handleSecondarymenuCollapseChange(e)}
|
.selectedItem=${this.secondarymenuSelectedItem}
|
||||||
></dees-appui-secondarymenu>
|
.collapsed=${this.secondarymenuCollapsed}
|
||||||
|
@item-select=${(e: CustomEvent) => this.handleSecondarymenuItemSelect(e)}
|
||||||
|
@collapse-change=${(e: CustomEvent) => this.handleSecondarymenuCollapseChange(e)}
|
||||||
|
></dees-appui-secondarymenu>
|
||||||
|
` : ''}
|
||||||
<dees-appui-maincontent
|
<dees-appui-maincontent
|
||||||
.tabs=${this.maincontentTabs}
|
.tabs=${this.maincontentTabs}
|
||||||
.selectedTab=${this.maincontentSelectedTab}
|
.selectedTab=${this.maincontentSelectedTab}
|
||||||
|
.showTabs=${this.maincontentTabsVisible}
|
||||||
@tab-select=${(e: CustomEvent) => this.handleContentTabSelect(e)}
|
@tab-select=${(e: CustomEvent) => this.handleContentTabSelect(e)}
|
||||||
>
|
>
|
||||||
<div class="view-container"></div>
|
<div class="view-container"></div>
|
||||||
@@ -425,6 +440,34 @@ export class DeesAppuiBase extends DeesElement {
|
|||||||
this.mainmenuCollapsed = collapsed;
|
this.mainmenuCollapsed = collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set main menu visibility
|
||||||
|
*/
|
||||||
|
public setMainMenuVisible(visible: boolean): void {
|
||||||
|
this.mainmenuVisible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set secondary menu collapsed state
|
||||||
|
*/
|
||||||
|
public setSecondaryMenuCollapsed(collapsed: boolean): void {
|
||||||
|
this.secondarymenuCollapsed = collapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set secondary menu visibility
|
||||||
|
*/
|
||||||
|
public setSecondaryMenuVisible(visible: boolean): void {
|
||||||
|
this.secondarymenuVisible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set content tabs visibility
|
||||||
|
*/
|
||||||
|
public setContentTabsVisible(visible: boolean): void {
|
||||||
|
this.maincontentTabsVisible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a badge on a main menu item
|
* Set a badge on a main menu item
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ export class DeesAppuiMaincontent extends DeesElement {
|
|||||||
@property({ type: Object })
|
@property({ type: Object })
|
||||||
accessor selectedTab: interfaces.IMenuItem | null = null;
|
accessor selectedTab: interfaces.IMenuItem | null = null;
|
||||||
|
|
||||||
|
@property({ type: Boolean })
|
||||||
|
accessor showTabs: boolean = true;
|
||||||
|
|
||||||
public static styles = [
|
public static styles = [
|
||||||
themeDefaultStyles,
|
themeDefaultStyles,
|
||||||
cssManager.defaultStyles,
|
cssManager.defaultStyles,
|
||||||
@@ -78,6 +81,14 @@ export class DeesAppuiMaincontent extends DeesElement {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:host([notabs]) .topbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
:host([notabs]) .content-area {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
`,
|
`,
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -112,8 +123,23 @@ export class DeesAppuiMaincontent extends DeesElement {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updated(changedProperties: Map<string | number | symbol, unknown>) {
|
||||||
|
super.updated(changedProperties);
|
||||||
|
if (changedProperties.has('showTabs')) {
|
||||||
|
if (this.showTabs) {
|
||||||
|
this.removeAttribute('notabs');
|
||||||
|
} else {
|
||||||
|
this.setAttribute('notabs', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async firstUpdated(_changedProperties: Map<string | number | symbol, unknown>) {
|
async firstUpdated(_changedProperties: Map<string | number | symbol, unknown>) {
|
||||||
await super.firstUpdated(_changedProperties);
|
await super.firstUpdated(_changedProperties);
|
||||||
|
// Apply initial notabs state
|
||||||
|
if (!this.showTabs) {
|
||||||
|
this.setAttribute('notabs', '');
|
||||||
|
}
|
||||||
// Tab selection is now handled by the dees-appui-tabs component
|
// Tab selection is now handled by the dees-appui-tabs component
|
||||||
// But we need to ensure the tabs component is ready
|
// But we need to ensure the tabs component is ready
|
||||||
const tabsComponent = this.shadowRoot.querySelector('dees-appui-tabs') as DeesAppuiTabs;
|
const tabsComponent = this.shadowRoot.querySelector('dees-appui-tabs') as DeesAppuiTabs;
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ export type TDeesAppuiBase = HTMLElement & {
|
|||||||
removeMainMenuItem: (groupName: string, tabKey: string) => void;
|
removeMainMenuItem: (groupName: string, tabKey: string) => void;
|
||||||
setMainMenuSelection: (tabKey: string) => void;
|
setMainMenuSelection: (tabKey: string) => void;
|
||||||
setMainMenuCollapsed: (collapsed: boolean) => void;
|
setMainMenuCollapsed: (collapsed: boolean) => void;
|
||||||
|
setMainMenuVisible: (visible: boolean) => void;
|
||||||
|
setSecondaryMenuCollapsed: (collapsed: boolean) => void;
|
||||||
|
setSecondaryMenuVisible: (visible: boolean) => void;
|
||||||
|
setContentTabsVisible: (visible: boolean) => void;
|
||||||
setMainMenuBadge: (tabKey: string, badge: string | number) => void;
|
setMainMenuBadge: (tabKey: string, badge: string | number) => void;
|
||||||
clearMainMenuBadge: (tabKey: string) => void;
|
clearMainMenuBadge: (tabKey: string) => void;
|
||||||
setSecondaryMenu: (config: { heading?: string; groups: IMenuGroup[] }) => void;
|
setSecondaryMenu: (config: { heading?: string; groups: IMenuGroup[] }) => void;
|
||||||
|
|||||||
Reference in New Issue
Block a user