Skip to content

FUI - Redesign toggle #2500

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions src/admin/leftPanel.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import * as React from 'react';
import { Resolve } from '@paperbits/react/decorators';
import { ISiteService } from '@paperbits/common/sites';
import { EventManager } from '@paperbits/common/events';
import { ViewManager } from '@paperbits/common/ui';
import { Router } from '@paperbits/common/routing';
import { initializeIcons } from '@fluentui/font-icons-mdl2';
import { CommandBarButton, Icon, IIconProps, Separator, Stack, Text } from '@fluentui/react';
import { CommandBarButton, Icon, IIconProps, Separator, Stack, Text, Toggle } from '@fluentui/react';
import { Pages } from './pages/pages';
import { Navigation } from './navigation/navigation';
import { Urls } from './urls/urls';
Expand All @@ -14,7 +16,7 @@ import { MediaModal } from './media/mediaModal';
import { CustomWidgets } from './custom-widgets/customWidgets';
import { OnboardingModal } from './onboardingModal';
import { lightTheme } from './utils/themes';
import { mobileBreakpoint } from '../constants';
import { isRedesignEnabledSetting, mobileBreakpoint } from '../constants';
initializeIcons();

const enum NavItem {
Expand All @@ -35,7 +37,8 @@ const enum NavItem {
interface LeftPanelState {
selectedNavItem: NavItem,
isMobile: boolean,
showOnboardingModal: boolean
showOnboardingModal: boolean,
isRedesignEnabled: boolean
}

const pageIcon: IIconProps = { iconName: 'Page' };
Expand All @@ -53,6 +56,12 @@ const helpIcon: IIconProps = { iconName: 'Help' };
const iconStyles = { root: { color: lightTheme.palette.themePrimary, fontSize: 20 } };

export class LeftPanel extends React.Component<{}, LeftPanelState> {
@Resolve('siteService')
public siteService: ISiteService;

@Resolve('eventManager')
public eventManager: EventManager;

@Resolve('viewManager')
public viewManager: ViewManager;

Expand All @@ -65,12 +74,14 @@ export class LeftPanel extends React.Component<{}, LeftPanelState> {
this.state = {
selectedNavItem: NavItem.Main,
isMobile: window.innerWidth < mobileBreakpoint,
showOnboardingModal: false
showOnboardingModal: false,
isRedesignEnabled: false
};
}

componentDidMount(): void {
if (!localStorage.getItem('isOnboardingSeen')) this.setState({ showOnboardingModal: true });
this.loadSettings();

window.addEventListener('resize', this.checkScreenSize.bind(this));
}
Expand All @@ -79,6 +90,11 @@ export class LeftPanel extends React.Component<{}, LeftPanelState> {
window.removeEventListener('resize', this.checkScreenSize.bind(this));
}

loadSettings = async (): Promise<void> => {
const redesignSetting = await this.siteService.getSetting(isRedesignEnabledSetting);
this.setState({ isRedesignEnabled: !!redesignSetting });
}

checkScreenSize = (): void => {
if (window.innerWidth < mobileBreakpoint) {
this.setState({ isMobile: true });
Expand Down Expand Up @@ -217,6 +233,18 @@ export class LeftPanel extends React.Component<{}, LeftPanelState> {
{ this.state.selectedNavItem === NavItem.Media && <MediaModal onDismiss={this.handleBackButtonClick.bind(this)} /> }
{ this.state.selectedNavItem === NavItem.Settings && <SettingsModal onDismiss={this.handleBackButtonClick.bind(this)} /> }
{ this.state.selectedNavItem === NavItem.Help && <HelpModal onDismiss={this.handleBackButtonClick.bind(this)} /> }
<Toggle
label={"Preview new UI design"}
onText={"On"}
offText={"Off"}
checked={this.state.isRedesignEnabled}
onChange={async (ev, checked) => {
this.setState({ isRedesignEnabled: checked });
await this.siteService.setSetting(isRedesignEnabledSetting, checked);
this.eventManager.dispatchEvent('onSaveChanges');
this.eventManager.dispatchEvent('onDataPush'); // Needed to reload the runtime part
}}
/>
</div>
</>
)
Expand Down
7 changes: 6 additions & 1 deletion src/components/apis/details-of-api/ko/detailsOfApi.html
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
<fui-api-details data-bind="attr: { props: runtimeConfig }"></fui-api-details>
<!-- ko if: isRedesignEnabled -->
<fui-api-details data-bind="attr: { props: runtimeConfig }"></fui-api-details>
<!-- /ko -->
<!-- ko ifnot: isRedesignEnabled -->
<api-details data-bind="attr: { params: runtimeConfig }"></api-details>
<!-- /ko -->
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import { StyleModel } from "@paperbits/common/styles";
export class DetailsOfApiViewModel {
public readonly runtimeConfig: ko.Observable<string>;
public readonly styles: ko.Observable<StyleModel>;
public readonly isRedesignEnabled: ko.Observable<boolean>;

constructor() {
this.runtimeConfig = ko.observable();
this.styles = ko.observable<StyleModel>();
this.isRedesignEnabled = ko.observable<boolean>();
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
import { StyleCompiler } from "@paperbits/common/styles";
import { ViewModelBinder, WidgetState } from "@paperbits/common/widgets";
import { ISiteService } from "@paperbits/common/sites";
import { DetailsOfApiModel } from "../detailsOfApiModel";
import { DetailsOfApiViewModel } from "./detailsOfApiViewModel";
import { isRedesignEnabledSetting } from "../../../../constants";


export class DetailsOfApiViewModelBinder implements ViewModelBinder<DetailsOfApiModel, DetailsOfApiViewModel> {
constructor(private readonly styleCompiler: StyleCompiler) { }
constructor(
private readonly styleCompiler: StyleCompiler,
private readonly siteService: ISiteService
) { }

public stateToInstance(state: WidgetState, componentInstance: DetailsOfApiViewModel): void {
componentInstance.styles(state.styles);
componentInstance.isRedesignEnabled(state.isRedesignEnabled);

componentInstance.runtimeConfig(JSON.stringify({
changeLogPageUrl: state.changeLogPageHyperlink
Expand All @@ -23,5 +29,7 @@ export class DetailsOfApiViewModelBinder implements ViewModelBinder<DetailsOfApi
if (model.styles) {
state.styles = await this.styleCompiler.getStyleModelAsync(model.styles);
}

state.isRedesignEnabled = !!(await this.siteService.getSetting(isRedesignEnabledSetting));
}
}
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
<fui-operation-list class="d-block" data-bind="attr: { props: runtimeConfig }"></fui-operation-list>
<!-- ko if: isRedesignEnabled -->
<fui-operation-list class="d-block" data-bind="attr: { props: runtimeConfig }"></fui-operation-list>
<!-- /ko -->
<!-- ko ifnot: isRedesignEnabled -->
<operation-list class="d-block" data-bind="attr: { params: runtimeConfig }"></operation-list>
<!-- /ko -->
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import { StyleModel } from "@paperbits/common/styles";
export class OperationListViewModel {
public readonly runtimeConfig: ko.Observable<string>;
public readonly styles: ko.Observable<StyleModel>;
public readonly isRedesignEnabled: ko.Observable<boolean>;

constructor() {
this.runtimeConfig = ko.observable();
this.styles = ko.observable<StyleModel>();
this.isRedesignEnabled = ko.observable<boolean>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@ import { ViewModelBinder, WidgetState } from "@paperbits/common/widgets";
import { OperationListViewModel } from "./operationListViewModel";
import { OperationListModel } from "../operationListModel";
import { StyleCompiler } from "@paperbits/common/styles";
import { ISiteService } from "@paperbits/common/sites";
import { isRedesignEnabledSetting } from "../../../../constants";


export class OperationListViewModelBinder implements ViewModelBinder<OperationListModel, OperationListViewModel> {
constructor(private readonly styleCompiler: StyleCompiler) { }
constructor(
private readonly styleCompiler: StyleCompiler,
private readonly siteService: ISiteService
) { }

public stateToInstance(state: WidgetState, componentInstance: OperationListViewModel): void {
componentInstance.styles(state.styles);
componentInstance.isRedesignEnabled(state.isRedesignEnabled);

componentInstance.runtimeConfig(JSON.stringify({
allowSelection: state.allowSelection,
Expand All @@ -35,5 +41,7 @@ export class OperationListViewModelBinder implements ViewModelBinder<OperationLi
if (model.styles) {
state.styles = await this.styleCompiler.getStyleModelAsync(model.styles);
}

state.isRedesignEnabled = !!(await this.siteService.getSetting(isRedesignEnabledSetting));
}
}
5 changes: 5 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -358,3 +358,8 @@ export const fuiTheme: Theme = {
fontFamilyMonospace: "inherit",
fontFamilyNumeric: "inherit",
};

/**
* Key for the setting that enables the runtime redesign of the portal
*/
export const isRedesignEnabledSetting = "isRedesignEnabled";
7 changes: 7 additions & 0 deletions src/themes/designer/styles/admin.scss
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@

.side-panel {
padding: 12px;
display: flex;
flex-direction: column;
height: 100%;

.navigation {
flex: 1;
}
}

.admin-side-panel-opener {
Expand Down