Skip to content
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
3 changes: 2 additions & 1 deletion addon/components/filters-picker.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@
{{#unless filter.noFilterLabel}}
<label class="filter-component-label">{{or filter.filterLabel filter.label}}</label>
{{/unless}}
{{! An ExtensionComponent filter comes from an extension's own engine. }}
{{component
filter.filterComponent
(if (is-object filter.filterComponent) (lazy-engine-component filter.filterComponent) filter.filterComponent)
value=filter.filterValue
filter=filter
param=(or filter.filterParam filter.valuePath)
Expand Down
95 changes: 95 additions & 0 deletions addon/components/layout/resource/action-buttons.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{{#each @buttons as |actionButton|}}
{{#if actionButton.items}}
<DropdownButton
@text={{or actionButton.text actionButton.label}}
@textClass={{actionButton.textClass}}
@type={{actionButton.type}}
@icon={{or actionButton.icon @dropdownIcon}}
@size={{or actionButton.size @dropdownSize}}
@iconPrefix={{actionButton.prefix}}
@buttonClass={{actionButton.buttonClass}}
@buttonWrapperClass={{actionButton.wrapperClass}}
@triggerClass={{actionButton.triggerClass}}
@renderInPlace={{or actionButton.renderInPlace @renderInPlace}}
@isLoading={{actionButton.isLoading}}
@disabled={{actionButton.disabled}}
@helpText={{actionButton.helpText}}
@tooltipPlacement={{actionButton.tooltipPlacement}}
as |dd|
>
<div class="next-dd-menu mt-1 mx-0" aria-labelledby="user-menu">
{{#each actionButton.items as |item|}}
{{#if item.separator}}
<div class="next-dd-menu-seperator"></div>
{{else}}
<div class="px-1 {{item.wrapperClass}}">
<a
href="javascript:;"
class="next-dd-item {{item.class}} {{if item.disabled 'disabled'}}"
disabled={{item.disabled}}
{{on "click" (dropdown-fn dd (or item.fn item.onClick (noop)))}}
>
{{#if item.icon}}
<div class="w-7 flex-grow-0 flex-shrink-0">
<FaIcon @icon={{item.icon}} />
</div>
{{/if}}
<span>{{or item.text item.label}}</span>
</a>
</div>
{{/if}}
{{/each}}
</div>
</DropdownButton>
{{else if actionButton.component}}
{{#let (if (is-object actionButton.component) (lazy-engine-component actionButton.component) actionButton.component) as |buttonComponent|}}
{{#if buttonComponent}}
{{component
buttonComponent
icon=actionButton.icon
iconPrefix=actionButton.iconPrefix
iconComponent=actionButton.iconComponent
size=actionButton.size
text=actionButton.text
options=actionButton.options
items=actionButton.items
permission=actionButton.permission
isLoading=actionButton.isLoading
renderInPlace=actionButton.renderInPlace
triggerClass=actionButton.triggerClass
disabled=actionButton.disabled
onClick=actionButton.onClick
fn=actionButton.fn
perform=actionButton.perform
onSelect=actionButton.onSelect
onChange=actionButton.onChange
}}
{{/if}}
{{/let}}
{{else}}
<Button
@type={{actionButton.type}}
@text={{actionButton.text}}
@onClick={{if actionButton.perform (perform actionButton.perform) (or actionButton.onClick actionButton.fn)}}
@size={{actionButton.size}}
@buttonType={{actionButton.buttonType}}
@disabled={{actionButton.disabled}}
@exampleText={{actionButton.exampleText}}
@helpText={{actionButton.helpText}}
@icon={{actionButton.icon}}
@iconClass={{actionButton.iconClass}}
@iconFlip={{actionButton.iconFlip}}
@iconPrefix={{actionButton.iconPrefix}}
@iconRotation={{actionButton.iconRotation}}
@iconSize={{actionButton.iconSize}}
@isLoading={{actionButton.isLoading}}
@outline={{actionButton.outline}}
@permission={{actionButton.permission}}
@wrapperClass={{actionButton.wrapperClass}}
@textClass={{actionButton.textClass}}
@tooltipPlacement={{actionButton.tooltipPlacement}}
@visible={{actionButton.visible}}
class={{actionButton.class}}
/>
{{/if}}
{{/each}}
40 changes: 40 additions & 0 deletions addon/components/layout/resource/bulk-actions.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<DropdownButton
@icon="layer-group"
@text={{unless @iconOnly (t "common.bulk-actions") ""}}
@type="magic"
@size="sm"
@buttonWrapperClass={{@buttonWrapperClass}}
@contentClass="dropdown-menu mt-0i"
@renderInPlace={{true}}
as |dd|
>
<div class="next-dd-menu mx-0">
{{#each @actions as |bulkAction|}}
{{#if bulkAction.separator}}
<div class="next-dd-menu-seperator"></div>
{{else if (and bulkAction.permission (cannot bulkAction.permission))}}
{{! Same convention as action buttons: shown but disabled, with the unauthorized hint, and not clickable. }}
<div class="px-1">
<a href="javascript:;" class="next-dd-item {{bulkAction.class}} disabled" disabled={{true}} aria-disabled="true" {{on "click" (noop)}}>
{{#if bulkAction.icon}}
<div class="w-{{or bulkAction.iconWidth '6'}}"><FaIcon @icon={{bulkAction.icon}} @size={{or bulkAction.iconSize "sm"}} /></div>
{{/if}}
<div>{{or bulkAction.text bulkAction.label}}</div>
<Attach::Tooltip @class="clean" @animation="scale" @placement="right">
<InputInfo @text={{t "common.unauthorized"}} />
</Attach::Tooltip>
</a>
</div>
{{else}}
<div class="px-1">
<a href="#" class="next-dd-item {{bulkAction.class}}" {{on "click" (dropdown-fn dd (or bulkAction.fn (noop)))}}>
{{#if bulkAction.icon}}
<div class="w-{{or bulkAction.iconWidth '6'}}"><FaIcon @icon={{bulkAction.icon}} @size={{or bulkAction.iconSize "sm"}} /></div>
{{/if}}
<div>{{or bulkAction.text bulkAction.label}}</div>
</a>
</div>
{{/if}}
{{/each}}
</div>
</DropdownButton>
4 changes: 2 additions & 2 deletions addon/components/layout/resource/panel.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
@saveDisabled={{@saveDisabled}}
@pojoResource={{@pojoResource}}
@onPressCancel={{@onPressCancel}}
@actionButtons={{@actionButtons}}
@actionButtons={{this.actionButtons}}
@headerClass={{@headerClass}}
@modelName={{@modelName}}
@saveOptions={{@saveOptions}}
Expand All @@ -46,7 +46,7 @@
@pojoResource={{@pojoResource}}
@saveOptions={{@saveOptions}}
@onPressCancel={{this.onPressCancel}}
@actionButtons={{@actionButtons}}
@actionButtons={{this.actionButtons}}
@modelName={{@modelName}}
@headerLeftClass={{@headerLeftClass}}
@headerLeftInnerClass={{@headerLeftInnerClass}}
Expand Down
19 changes: 19 additions & 0 deletions addon/components/layout/resource/panel.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { getOwner } from '@ember/application';
import contextComponentCallback from '@fleetbase/ember-core/utils/context-component-callback';
import applyContextComponentArguments from '@fleetbase/ember-core/utils/apply-context-component-arguments';
import lookupResourceView, { mergeHeaderButtons } from '../../../utils/resource-view';

export default class LayoutResourcePanelComponent extends Component {
@service store;
Expand Down Expand Up @@ -32,6 +34,23 @@ export default class LayoutResourcePanelComponent extends Component {
return this.args.authSchema ?? 'fleet-ops';
}

/**
* `@actionButtons` with what extensions registered under `@registry`
* (a details prefix such as `ledger:details:invoice`) merged in: header
* buttons from its `actions` slot and dropdown items from its `menu` slot.
*/
get actionButtons() {
const component = this;
const context = {
resource: this.resource,
get panel() {
return component.context;
},
};

return mergeHeaderButtons(lookupResourceView(getOwner(this)), this.args.registry, this.args.actionButtons, context, { withMenu: true });
}

constructor() {
super(...arguments);
applyContextComponentArguments(this);
Expand Down
85 changes: 1 addition & 84 deletions addon/components/layout/resource/panel/header-actions.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -21,90 +21,7 @@
/>
{{/if}}
{{/if}}
{{#each @actionButtons as |actionButton|}}
{{#if actionButton.items}}
<DropdownButton
@text={{or actionButton.text actionButton.label}}
@textClass={{actionButton.textClass}}
@type={{actionButton.type}}
@icon={{or actionButton.icon "ellipsis"}}
@size={{or actionButton.size "sm"}}
@iconPrefix={{actionButton.prefix}}
@triggerClass={{actionButton.triggerClass}}
@renderInPlace={{or actionButton.renderInPlace true}}
as |dd|
>
<div class="next-dd-menu mt-1 mx-0" aria-labelledby="user-menu">
{{#each actionButton.items as |item|}}
{{#if item.separator}}
<div class="next-dd-menu-seperator"></div>
{{else}}
<div class="px-1 {{item.wrapperClass}}">
<a
href="javascript:;"
class="next-dd-item {{item.class}} {{if item.disabled 'disabled'}}"
disabled={{item.disabled}}
{{on "click" (dropdown-fn dd (or item.fn item.onClick))}}
>
{{#if item.icon}}
<div class="w-7 flex-grow-0 flex-shrink-0">
<FaIcon @icon={{item.icon}} />
</div>
{{/if}}
<span>{{or item.text item.label}}</span>
</a>
</div>
{{/if}}
{{/each}}
</div>
</DropdownButton>
{{else if actionButton.component}}
{{component
actionButton.component
icon=actionButton.icon
iconPrefix=actionButton.iconPrefix
iconComponent=actionButton.iconComponent
size=actionButton.size
text=actionButton.text
options=actionButton.options
items=actionButton.items
permission=actionButton.permission
isLoading=actionButton.isLoading
renderInPlace=actionButton.renderInPlace
triggerClass=actionButton.triggerClass
disabled=actionButton.disabled
onClick=actionButton.onClick
fn=actionButton.fn
perform=actionButton.perform
onSelect=actionButton.onSelect
onChange=actionButton.onChange
}}
{{else}}
<Button
@type={{actionButton.type}}
@text={{actionButton.text}}
@onClick={{if actionButton.perform (perform actionButton.perform) (or actionButton.onClick actionButton.fn)}}
@size={{actionButton.size}}
@buttonType={{actionButton.buttonType}}
@disabled={{actionButton.disabled}}
@exampleText={{actionButton.exampleText}}
@helpText={{actionButton.helpText}}
@icon={{actionButton.icon}}
@iconClass={{actionButton.iconClass}}
@iconFlip={{actionButton.iconFlip}}
@iconPrefix={{actionButton.iconPrefix}}
@iconRotation={{actionButton.iconRotation}}
@iconSize={{actionButton.iconSize}}
@isLoading={{actionButton.isLoading}}
@outline={{actionButton.outline}}
@permission={{actionButton.permission}}
@wrapperClass={{actionButton.wrapperClass}}
@textClass={{actionButton.textClass}}
@tooltipPlacement={{actionButton.tooltipPlacement}}
@visible={{actionButton.visible}}
/>
{{/if}}
{{/each}}
<Layout::Resource::ActionButtons @buttons={{@actionButtons}} @dropdownIcon="ellipsis" @dropdownSize="sm" @renderInPlace={{true}} />
{{#if @onPressCancel}}
<button
type="button"
Expand Down
Loading
Loading