Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ganapathyHf/746a204624f3fbd0b6b8aea6b52bf68b to your computer and use it in GitHub Desktop.
Save ganapathyHf/746a204624f3fbd0b6b8aea6b52bf68b to your computer and use it in GitHub Desktop.
Collapse panel
import Component from '@ember/component';
export default Component.extend({
classNames: ['panel-body'],
classNameBindings: ['isOpen:is-open']
});
import Component from '@ember/component';
import { inject as service } from '@ember/service';
export default Component.extend({
panelActionsService: service('panel-actions'),
group: null,
disabled: false,
classNames: ['panel-header'],
toggleAllPanels: false,
actions: {
expandAllPanels() {
if (this.get("disabled")) {
return;
}
this.get('panelActionsService').openAllPanels(this.get('group'));
},
collapseAllPanels() {
if (this.get("disabled")) {
return;
}
this.get('panelActionsService').closeAllPanels(this.get('group'));
}
}
});
import Component from '@ember/component';
export default Component.extend({
classNames: ['panel-toggle', 'u-cursor-pointer'],
classNameBindings: ['isOpen:is-open'],
click(e) {
e.preventDefault();
this.get('onClick')();
}
});
import EmberObject, { computed } from '@ember/object';
import { reads, not } from '@ember/object/computed';
import Component from '@ember/component';
import { inject as service } from '@ember/service';
import { run } from '@ember/runloop';
export default Component.extend({
classNames: ['panel'],
classNameBindings: ['isOpen:is-open:is-closed', 'disabled:is-disabled'],
panelActionsService: service('panel-actions'),
panelId: null,
disabled: false,
panelState: computed('panelActionsService.panels.[]', 'panelId', {
get() {
let panelActionsService = this.get('panelActionsService');
let currentPanel = panelActionsService.getPanelById(this.get('panelId'));
return currentPanel;
}
}),
isOpen: reads('panelState.isOpen'),
isClosed: not('isOpen'),
init() {
this._super(...arguments);
run.next(() => {
let panels = this.get('panelActionsService.panels');
panels.addObject(EmberObject.create({
id: this.get('panelId'),
isOpen: true,
group: this.get('group')
}));
});
},
actions: {
toggleIsOpen() {
if (this.get("disabled")) {
return;
}
this.get('panelActionsService').togglePanel(this.get('panelId'));
}
}
});
import Component from '@ember/component';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';
export default Component.extend({
panelActionsService: service('panel-actions'),
classNames: ['panels'],
group: null,
canExpandAllPanels:computed('panelActionsService.panels.@each.isOpen', {
get() {
return this.get('panelActionsService.panels').isEvery('isOpen', false);
}
})
});
import Ember from 'ember';
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
reports: [{
"id": 1,
"name": "Report 1",
"pages":[{
"id": "11",
"name": "Page 1"
}, {
"id": "12",
"name": "Page 2"
}]
}, {
"id": 2,
"name": "Report 2",
"pages":[{
"id": "13",
"name": "Page 3 - Report 2"
}]
}]
});
import Service from '@ember/service';
import { A } from '@ember/array';
export default Service.extend({
panels: A(),
getPanelById(panelId) {
return this.get('panels').findBy('id', panelId);
},
getPanelsForGroup(group) {
return this.get('panels').filterBy('group', group);
},
togglePanel(panelId) {
let panel = this.getPanelById(panelId);
panel.toggleProperty('isOpen');
},
openAllPanels(group) {
let panels = this.getPanelsForGroup(group);
panels.forEach((panel) => {
panel.set('isOpen', true);
});
},
closeAllPanels(group) {
let panels = this.getPanelsForGroup(group);
panels.forEach((panel) => {
panel.set('isOpen', false);
});
}
});
body {
margin: 12px 16px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 12pt;
}
.panel {
margin-bottom: 5px;
}
.panel-toggle {
.u-vertically-centered-container;
width: 100%;
padding: 5px;
border-radius: 4px;
background-color: green;
font-size: 14px;
font-weight: bold;
&::before {
content: '';
background-image: url(svgs/chevron-right.svg);
width: 17px;
height: 17px;
background-size: 17px 17px;
}
}
.panel-toggle.is-open {
&::before {
background-image: url(svgs/chevron-down.svg);
}
}
.panel-body {
&.is-open {
padding: 10px 5px 5px;
}
.field:last-of-type {
margin-bottom: 0px;
}
}
.navigation-pane_reports_panel {
margin-right: 20px;
.panel {
margin-bottom: 10px;
}
.panel.is-open {
margin-bottom: 0;
}
.panel-toggle {
padding: 0 0 0 5px;
}
.panel-body.is-open {
padding: 5px 0;
}
}
<h1>Welcome to {{appName}}</h1>
<br>
<br>
{{outlet}}
<br>
{{#collapsible-panels class="navigation-pane_reports_panel" group="reports-sidebar" as |panels|}}
{{#panels.header toggleAllPanels=true as |header|}}{{/panels.header}}
{{#each reports as |report|}}
{{#panels.panel panelId=report.id as |panel|}}
{{#panel.toggle}}
<div class="navigation-pane_reports_panel_header">
<div class="navigation-pane_reports_panel_header_title">
{{report.name}}
</div>
</div>
{{/panel.toggle}}
{{#panel.body}}
{{#each report.pages as |page|}}
<div>{{page.name}}</div>
{{/each}}
{{/panel.body}}
{{/panels.panel}}
{{/each}}
{{/collapsible-panels}}
<br>
{{#if isOpen}}
<div class="panel-body">
{{yield}}
</div>
{{/if}}
{{yield}}
{{#if toggleAllPanels}}
<div>
{{#if canExpandAllPanels}}
<div class="" {{action "expandAllPanels"}} role="button"> <h3>expand-all</h3></div>
{{else}}
<div class="" {{action "collapseAllPanels"}} role="button"><h3>Collapse All</h3></div>
{{/if}}
</div>
{{/if}}
{{yield (hash
toggle=(component 'collapsible-panels/collapsible-panel-toggle' onClick=(action 'toggleIsOpen') isOpen=isOpen)
body=(component 'collapsible-panels/collapsible-panel-body' isOpen=isOpen)
isOpen=isOpen
)}}
{{yield (hash header=(component 'collapsible-panels/collapsible-panel-header' group=group canExpandAllPanels=canExpandAllPanels) panel=(component 'collapsible-panels/collapsible-panel' group=group))}}
{
"version": "0.15.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js",
"ember": "3.4.3",
"ember-template-compiler": "3.4.3",
"ember-testing": "3.4.3"
},
"addons": {
"ember-data": "3.4.2"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment