Skip to content
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

feat: templates framework #4254

Open
wants to merge 177 commits into
base: main
Choose a base branch
from
Open

Conversation

Schwehn42
Copy link
Member

@Schwehn42 Schwehn42 commented Jun 21, 2024

Description

Resolves #4201
Resolves #4253

Adds the framework for the new template page. This includes both the layout and some functionality (like routing).
After logging into scrumlr, users will now be redirected to the templates page.

Important

To see the changes, make sure the env var REACT_APP_LEGACY_CREATE_BOARD is set to false.
Right now, they default to false in dev env, and true in prod env.
This is so the different changes can be merged into main without affecting current use.

The page consists of the header and main section

Header section

  • User Pill with avatar and name, which when clicked redirects to settings (blocked by refactor: settings dialog #4265)
  • Switch to switch between Templates and Sessions (when they exist in the future)
  • Search bar to filter templates or sessions (in the future)
  • In mobile view, the search bar can be toggled using a button.

Main section

  • Two sections for saved and recommended templates.
  • Only non-anonymous users can see the saved section.
  • In mobile view, the sections are full width but scrollable horizontally.

Changelog

  • Add new child routes templates and sessions to route new
  • add new views ´Templates´ and Sessions accordingly
  • new components:
    • UserPill
    • Switch
    • SearchBar
  • change view NewBoard to a grid including the new components in header, and the views as Outlet
  • all components and the Template view have a light and dark theme.
  • all components and the Template view are responsive and have a separate mobile view
  • components also have states for hover, focus, active, and disabled and are styled respectively.
  • states are streamlined in new SCSS helper function in style.scss

TODO

Checklist

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • The light- and dark-theme are both supported and tested
  • The design was implemented and is responsive for all devices and screen sizes
  • The application was tested in the most commonly used browsers (e.g. Chrome, Firefox, Safari)

(Optional) Visual Changes

Show media templates-light-mobile templates-light-desktop templates-dark-desktop templates-dark-mobile

This comment has been minimized.

src/components/SearchBar/SearchBar.tsx Outdated Show resolved Hide resolved
src/components/SearchBar/SearchBar.tsx Outdated Show resolved Hide resolved
src/components/SearchBar/SearchBar.tsx Outdated Show resolved Hide resolved
src/components/SearchBar/SearchBar.tsx Outdated Show resolved Hide resolved
@Schwehn42 Schwehn42 added Changes Requested Changes requested by the reviewer and removed Review Needed This pull request is ready for review labels Jan 9, 2025
@Schwehn42 Schwehn42 added Review Needed This pull request is ready for review and removed Changes Requested Changes requested by the reviewer labels Jan 10, 2025
This reverts commit 004bde4.

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

Copy link

The deployment to the dev cluster was successful. You can find the deployment here: https://4254.development.scrumlr.fra.ics.inovex.io
This deployment is only for testing purposes and will be deleted after 1 week.
To redeploy rerun the workflow.
DO NOT STORE IMPORTANT DATA ON THIS DEPLOYMENT

Deployed Images
  • ghcr.io/inovex/scrumlr.io/scrumlr-frontend:sha-4dd0f37

  • ghcr.io/inovex/scrumlr.io/scrumlr-server:sha-4dd0f37

Copy link

octomind-dev bot commented Jan 27, 2025

🐙 Octomind

Test Report: 3/14 successful.

description status details
About Section Visibility Test Passed ✅ click
change avatar Failed ❌ click
check Privacy Policy Failed ❌ click
check terms & conditions Passed ✅ click
close cookie banner - front page Passed ✅ click
close cookie banner - sign-in Failed ❌ click
create and delete board columns Failed ❌ click
create_and_delete_notes_and_actions_v2 Failed ❌ click
create lean coffee board Failed ❌ click
edit_notes_and_actions_v5 Failed ❌ click
get started Failed ❌ click
share_session Failed ❌ click
sign-in Failed ❌ click
test all ways to open the setup flow Failed ❌ click

commit sha: 4dd0f37

display: flex;
flex-direction: row;
align-items: center;
gap: 0;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There should be a small gap imo

const clearInput = () => props.handleValueChange("");

return (
<div className={classNames(props.className, "search-bar", {"search-bar--disabled": props.disabled})}>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clicking on the search bar should always focus the input. Right now, the input is only focused if you actually click on the input within the container.

@brandstetterm
Copy link
Collaborator

image These should be aligned

* stateless search bar component.
* if the input is not empty, it's clearable using the X button
*/
export const SearchBar = (props: SearchBarProps) => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should probably use debounce

Comment on lines 42 to +66
<Route
path="/new"
path="/boards"
element={
<RequireAuthentication>
<NewBoard />
<Boards />
</RequireAuthentication>
}
/>
>
<Route index element={<Navigate to="templates" />} />
<Route path="templates" element={<Templates />}>
{/* TODO extract settings routes to avoid repetition */}
<Route path="settings" element={<SettingsDialog enabledMenuItems={{appearance: true, feedback: feedbackEnabled, profile: true}} />}>
<Route path="appearance" element={<Appearance />} />
<Route path="feedback" element={<Feedback />} />
<Route path="profile" element={<ProfileSettings />} />
</Route>
</Route>
<Route path="sessions" element={<Sessions />}>
<Route path="settings" element={<SettingsDialog enabledMenuItems={{appearance: true, feedback: feedbackEnabled, profile: true}} />}>
<Route path="appearance" element={<Appearance />} />
<Route path="feedback" element={<Feedback />} />
<Route path="profile" element={<ProfileSettings />} />
</Route>
</Route>
</Route>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These routes should be /templates and /sessions instead of /board/templates and /board/sessions

Comment on lines +53 to +56
<Route path="settings" element={<SettingsDialog enabledMenuItems={{appearance: true, feedback: feedbackEnabled, profile: true}} />}>
<Route path="appearance" element={<Appearance />} />
<Route path="feedback" element={<Feedback />} />
<Route path="profile" element={<ProfileSettings />} />
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both the appearance and profile menu item have the same background-color on hover

Comment on lines +59 to +66
<Route path="sessions" element={<Sessions />}>
<Route path="settings" element={<SettingsDialog enabledMenuItems={{appearance: true, feedback: feedbackEnabled, profile: true}} />}>
<Route path="appearance" element={<Appearance />} />
<Route path="feedback" element={<Feedback />} />
<Route path="profile" element={<ProfileSettings />} />
</Route>
</Route>
</Route>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we hide the sessions for anonymous users?

* it is completely stateless, which means the logic to actually flip the switch resides in the parent component.
* the component itself only emits whenever the switch is interacted with.
*/
export const Switch = (props: SwitchProps) => (
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: I wouldn't highlight the currently selected tab with the background color. It would be cool if the indicator is animated and you see it moving from left to right / right to left. The way to do it is to have a separate 'indicator' div, which you can position absolute and move around on change. With Chrome and some other browser, you could even use the new anchor positioning for that.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@import "constants/style";

$padding--default: $spacing--xs;
$padding--mobile: 6px;

.switch {
  all: unset;
  user-select: none;
  position: relative;

  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 4px;

  width: fit-content;
  padding: $padding--default;
  border-radius: $rounded--large;

  background-color: $gray--000;

  &:enabled {
    cursor: pointer;

    @include default-states($padding: $padding--default);
  }

  &:disabled {
    background-color: $gray--000;

    .switch__item {
      color: $gray--800;
      background-color: $gray--000;

      &--active {
        background-color: $gray--400;
      }
    }
  }
}

.switch__item {
  position: relative;
  z-index: 20;

  box-sizing: border-box;
  width: 120px;
  height: 48px;

  padding: 14.5px $spacing--base;
  border-radius: $rounded--full;
  text-align: center;

  font-size: $text--base;
  font-weight: 600;

  color: #292f3b;

  transition:
    background-color 0.3s,
    color 0.3s;

  &--active {
    color: $gray--000;

    font-weight: 700;
  }
}

@media screen and (max-width: $breakpoint--smartphone) {
  .switch {
    padding: $padding--mobile;
    margin-left: $spacing--sm;

    &:enabled {
      @include default-states($padding: $padding--mobile);
    }
  }

  .switch__item {
    font-size: $text--sm;
  }
}

[theme="dark"] {
  .switch {
    background-color: $navy--600;

    &:disabled {
      background-color: $navy--700;

      .switch__item {
        color: $navy--300;
        background-color: $navy--700;

        &--active {
          color: $navy--300;
          background-color: $gray--400;
        }
      }
    }
  }

  .switch__item {
    color: $gray--000;
    background-color: $navy--400;

    &--active {
      color: $navy--600;
      background-color: $gray--000;
    }
  }
}



@supports (anchor-name: --selected-option) {
  .switch::before {
    content: '';
    position: absolute;
    width: 120px;
    height: 48px;
    border-radius: $rounded--full;
    background-color: $navy--600;
    color: $gray--000;
    font-weight: 700;

    z-index: 10;
  }

  .switch__item--active {
    anchor-name: --selected-option;
  }

  .switch::before {
    position-anchor: --selected-option;
    top: anchor(top);
    left: anchor(left);
    transition: all 120ms linear;
  }
}
@supports (anchor-name: --selected-option) {
  .switch__item--active {
    background-color: $navy--600;
  }
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Screen.Recording.2025-02-02.at.14.29.19.mov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Review Needed This pull request is ready for review Template + Session Page Goal 2024
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Header section (Templatepage) Basic Framework (Templatepage)
3 participants