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

web: provide simple tables for API-less displays #11028

Merged
merged 32 commits into from
Oct 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d208dc3
web: fix Flash of Unstructured Content while SearchSelect is loading …
kensternberg-authentik Aug 20, 2024
f2f4d09
web: comment on state management in API layer, move file to point to …
kensternberg-authentik Aug 21, 2024
014f43b
web: test for flash of unstructured content
kensternberg-authentik Aug 21, 2024
5a8bffa
web: interim commit of the basic sortable & selectable table.
kensternberg-authentik Aug 21, 2024
05443e8
Merge branch 'web/bug/search-select-flouc-issue' into web/element/ak-…
kensternberg-authentik Aug 21, 2024
8cb0381
web: added basic unit testing to API-free tables
kensternberg-authentik Aug 22, 2024
a551c76
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Aug 22, 2024
198dc69
web: finalize testing for tables
kensternberg-authentik Aug 22, 2024
484ebe9
Provide unit test accessibility to Firefox and Safari; wrap calls to …
kensternberg-authentik Aug 22, 2024
a83bc34
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Aug 26, 2024
32e7c5f
web: repeat is needed to make sure sub-elements move around correctly…
kensternberg-authentik Aug 26, 2024
e780182
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Sep 6, 2024
55c6e24
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Sep 25, 2024
741c051
web: update api-less tables
kensternberg-authentik Sep 25, 2024
bbff6f0
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Sep 26, 2024
0c75209
web: rollback dependabot "upgrade" that broke testing
kensternberg-authentik Sep 26, 2024
705f096
web: small fixes for wdio and lint
kensternberg-authentik Sep 26, 2024
b95d3d3
Merge branch 'web/bug/fix-wdio-and-lint' into web/element/ak-select-t…
kensternberg-authentik Sep 26, 2024
325b1df
web: not sure where all these getElement() additions come from; did I…
kensternberg-authentik Sep 26, 2024
e71e875
Merge branch 'main' into web/bug/fix-wdio-and-lint
kensternberg-authentik Sep 27, 2024
ed7c1b9
package-lock.json update
kensternberg-authentik Sep 27, 2024
0fcf1eb
web: small fixes for wdio and lint
kensternberg-authentik Sep 27, 2024
2aad79b
Forgot to run prettier.
kensternberg-authentik Sep 27, 2024
4302787
Merge branch 'main' into web/bug/fix-wdio-and-lint
kensternberg-authentik Sep 27, 2024
5101689
web: small fixes for elements and forms
kensternberg-authentik Sep 27, 2024
a9bb71a
Merge branch 'web/bug/fix-wdio-and-lint' into web/element/ak-select-t…
kensternberg-authentik Sep 27, 2024
2b34e26
Merge branch 'web/update/small-upgrades' into web/element/ak-select-t…
kensternberg-authentik Sep 27, 2024
9e1731d
Prettier had opinions
kensternberg-authentik Sep 27, 2024
0e91519
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Oct 3, 2024
931798d
Some lint over-eagerness.
kensternberg-authentik Oct 4, 2024
ac6984f
Merge branch 'main' into web/element/ak-select-table
kensternberg-authentik Oct 4, 2024
dbcf778
Updated after build.
kensternberg-authentik Oct 4, 2024
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
3 changes: 3 additions & 0 deletions web/.storybook/css-import-maps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
// and we'll have one unified way of doing this. I can only hope.

const rawCssImportMaps = [
'import AKGlobal from "../../../common/styles/authentik.css";',
'import AKGlobal from "../../common/styles/authentik.css";',
'import AKGlobal from "../common/styles/authentik.css";',
'import AKGlobal from "@goauthentik/common/styles/authentik.css";',
'import PFAlert from "@patternfly/patternfly/components/Alert/alert.css";',
'import PFAlertGroup from "@patternfly/patternfly/components/AlertGroup/alert-group.css";',
Expand Down
4 changes: 4 additions & 0 deletions web/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ export default [
},
files: ["src/**"],
rules: {
// "lit/attribute-names": "error",
"lit/no-private-properties": "error",
// "lit/prefer-nothing": "warn",
"lit/no-template-bind": "error",
"no-unused-vars": "off",
"no-console": ["error", { allow: ["debug", "warn", "error"] }],
"@typescript-eslint/ban-ts-comment": "off",
Expand Down
339 changes: 169 additions & 170 deletions web/package-lock.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@
"lint:types",
"lint:components",
"lint:spelling",
"lint:package",
Copy link
Contributor Author

Choose a reason for hiding this comment

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

The linter for package.json itself was somehow missed.

"lint:lockfile",
"lint:lockfiles",
"lint:precommit",
Expand Down Expand Up @@ -316,7 +317,7 @@
"command": "node scripts/build-storybook-import-maps.mjs"
},
"test": {
"command": "wdio run ./wdio.conf.ts --logLevel=warn",
"command": "wdio ./wdio.conf.ts --logLevel=warn",
"env": {
"CI": "true",
"TS_NODE_PROJECT": "tsconfig.test.json"
Expand Down
4 changes: 2 additions & 2 deletions web/src/admin/enterprise/EnterpriseStatusCard.test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { ensureCSSStyleSheet } from "@goauthentik/elements/utils/ensureCSSStyleSheet.js";
import { $, expect } from "@wdio/globals";

import { msg } from "@lit/localize";
import { TemplateResult, html, render as litRender } from "lit";

import AKGlobal from "@goauthentik/common/styles/authentik.css";
import AKGlobal from "../../common/styles/authentik.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css";

import { LicenseForecast, LicenseSummary, LicenseSummaryStatusEnum } from "@goauthentik/api";

import { ensureCSSStyleSheet } from "../../elements/utils/ensureCSSStyleSheet.js";
import "./EnterpriseStatusCard.js";

const render = (body: TemplateResult) => {
Expand Down
4 changes: 3 additions & 1 deletion web/src/components/ak-wizard-main/AkWizard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ export class AkWizard<D, Step extends WizardStep = WizardStep>
}

render() {
const step = this.step.render.bind(this.step);

return html`
<ak-wizard-frame
${ref(this.frame)}
Expand All @@ -112,7 +114,7 @@ export class AkWizard<D, Step extends WizardStep = WizardStep>
prompt=${this.prompt}
.buttons=${this.step.buttons}
.stepLabels=${this.stepLabels}
.form=${this.step.render.bind(this.step)}
.form=${step}
>
<button slot="trigger" class="pf-c-button pf-m-primary">${this.prompt}</button>
</ak-wizard-frame>
Expand Down
4 changes: 2 additions & 2 deletions web/src/elements/EmptyState.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { ensureCSSStyleSheet } from "@goauthentik/elements/utils/ensureCSSStyleSheet.js";
import { $, expect } from "@wdio/globals";

import { msg } from "@lit/localize";
import { TemplateResult, html, render as litRender } from "lit";

import AKGlobal from "@goauthentik/common/styles/authentik.css";
import AKGlobal from "../common/styles/authentik.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css";

import "./EmptyState.js";
import { ensureCSSStyleSheet } from "./utils/ensureCSSStyleSheet.js";

const render = (body: TemplateResult) => {
document.adoptedStyleSheets = [
Expand Down
103 changes: 103 additions & 0 deletions web/src/elements/ak-table/TableColumn.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import { bound } from "@goauthentik/elements/decorators/bound";

import { html } from "lit";
import { classMap } from "lit/directives/class-map.js";

// Because TableColumn isn't a component, it won't be the dispatch target and it won't have an
// identity beyond the host passed in, so we must include with the event a payload that identifies
// the source TableColumn in some way.
//
export class TableSortEvent extends Event {
static readonly eventName = "tablesort";
public value: string;
constructor(value: string) {
super(TableSortEvent.eventName, { composed: true, bubbles: true });
this.value = value;
}
}

/**
* class TableColumn
*
* This is a helper class for rendering the contents of a table column header.
*
* ## Events
*
* - @fires tablesort: when the header is clicked, if the host is not undefined
*
*/
export class TableColumn {
/**
* The text to show in the column header
*/
value: string;

/**
* If not undefined, the element that will first receive the `tablesort` event
*/
host?: HTMLElement;

/**
* If not undefined, show the sort indicator, and indicate the sort state
*/
orderBy?: string;

constructor(value: string, orderBy?: string, host?: HTMLElement) {
this.value = value;
this.orderBy = orderBy;
if (host) {
this.host = host;
}
}

@bound
private onSort() {
if (this.host && this.orderBy) {
this.host.dispatchEvent(new TableSortEvent(this.orderBy));
}
}

private sortIndicator(orderBy: string) {
// prettier-ignore
switch(orderBy) {
case this.orderBy: return "fa-long-arrow-alt-down";
case `-${this.orderBy}`: return "fa-long-arrow-alt-up";
default: return "fa-arrows-alt-v";
}
}

private sortButton(orderBy: string) {
return html` <button class="pf-c-table__button" @click=${this.onSort}>
<div class="pf-c-table__button-content">
<span part="column-text" class="pf-c-table__text">${this.value}</span>
<span part="column-sort" class="pf-c-table__sort-indicator">
<i class="fas ${this.sortIndicator(orderBy)}"></i>
</span>
</div>
</button>`;
}

public render(orderBy?: string) {
const isSelected = orderBy === this.orderBy || orderBy === `-${this.orderBy}`;

const classes = {
"pf-c-table__sort": Boolean(this.host && this.orderBy),
"pf-m-selected": Boolean(this.host && isSelected),
};

return html`<td
part="column-item"
role="columnheader"
scope="col"
class="${classMap(classes)}"
>
${orderBy && this.orderBy ? this.sortButton(orderBy) : html`${this.value}`}
</td>`;
}
}

declare global {
interface GlobalEventHandlersEventMap {
[TableSortEvent.eventName]: TableSortEvent;
}
}
Loading
Loading