Skip to content

Instantly share code, notes, and snippets.

@onechiporenko
Last active May 5, 2021 20:32
Show Gist options
  • Save onechiporenko/99e1630b806bd4bd6edb5682429079a8 to your computer and use it in GitHub Desktop.
Save onechiporenko/99e1630b806bd4bd6edb5682429079a8 to your computer and use it in GitHub Desktop.
Inline edit and columns summary (v2.3.0)
import DS from 'ember-data';
import Ember from 'ember';
export default DS.RESTAdapter.extend({
host: 'https://api.github.com',
namespace: 'repos/emberjs/ember.js/issues/13071/comments',
token: '',
username: '',
query(store, b, query) {
const url = `${this.get('host')}/${this.get('namespace')}`;
const token = this.get('token');
const username = this.get('username');
return this.ajax(url, 'GET', {
beforeSend (xhr) {
if (username && token) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(`${username}:${token}`));
}
},
data: query
});
},
updateRecord() {
return Ember.RSVP.Promise.resolve({meta: {}});
}
});
import Ember from 'ember';
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
host: 'https://api.github.com',
namespace: 'repos/emberjs/ember.js/issues',
token: '',
username: '',
query(store, b, query) {
const url = `${this.get('host')}/${this.get('namespace')}`;
const token = this.get('token');
const username = this.get('username');
return this.ajax(url, 'GET', {
beforeSend (xhr) {
if (username && token) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(`${username}:${token}`));
}
},
data: query
});
},
updateRecord() {
return Ember.RSVP.Promise.resolve({meta: {}});
}
});
import Ember from 'ember';
export default Ember.Component.extend({
actions: {
updateCommentsCount(newVal) {
this.set('record.comments', Number(newVal));
}
}
});
import CellColumnSummary from './models-table/cell-column-summary';
export default CellColumnSummary.extend({
});
import Ember from 'ember';
import layout from '../templates/components/select-toggle';
export default Ember.Component.extend({
layout,
actions: {
clickOnRow(index, record, event) {
this.get('clickOnRow')(index, record);
event.stopPropagation();
}
}
});
import Ember from 'ember';
export default Ember.Component.extend({
init() {
this._super(...arguments);
this.set('options', ['open', 'closed']);
}
});
import Ember from 'ember';
function group(collection) {
return Ember.computed(`${collection}.[]`, function() {
const c = this.get(collection);
return c ? c.reduce((result, item) => {
if (!result[item]) {
result[item] = 0;
}
result[item]++;
return result;
}, {}) : {};
});
}
export default Ember.Component.extend({
tagName: 'td',
selectedGrouped: group('mappedSelectedItems'),
dataGrouped: group('mappedData')
});
import Ember from 'ember';
const {set} = Ember;
export default Ember.Component.extend({
options: Ember.computed('users.[]', function () {
const users = this.get('users');
return users ? users.map(u => {
return {label: u.get('login'), value: u.get()};
}) : [];
}),
});
import Ember from 'ember';
export default Ember.Controller.extend({
appName: 'Inline edit and columns summary',
token: Ember.computed.alias('commentsAdapter.token'),
username: Ember.computed.alias('commentsAdapter.username')
});
import Ember from 'ember';
import Theme from '../themes/bootstrap3';
export default Ember.Controller.extend({
allUsers: Ember.computed.mapBy('model', 'user'),
users: Ember.computed.uniqBy('allUsers', 'id'),
columns: [
{
component: 'select-toggle',
useFilter: false,
editable: false,
mayBeHidden: false
},
{propertyName: 'type', editable: false, componentForFooterCell: 'type-summary'},
{propertyName: 'user.login', title: 'Author', componentForEdit: 'user-edit'},
{propertyName: 'state', componentForEdit: 'state-edit'},
{propertyName: 'comments', componentForFooterCell: 'comments-summary', componentForEdit: 'comments-edit'},
{propertyName: 'created_at', editable: false, disableFiltering: true},
{propertyName: 'updated_at', editable: false, disableFiltering: true},
{
"title": "Edit",
"component": "edit-row",
"editable": false
}
],
actions: {
onSaveRow(param) {
return param.record.save();
},
onCancelRow( { record } ) {
record.rollback();
return true;
}
}
});
export function initialize(application) {
application.inject('controller:application', 'commentsAdapter', 'adapter:comment');
};
export default {
initialize,
after: 'ember-data'
};
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
number: attr('number'),
title: attr('string'),
state: attr('string'),
comments: attr('number'),
user: belongsTo('user'),
type: attr('string'),
labels: hasMany('label'),
locked: attr('boolean'),
assignee: belongsTo('user'),
assignees: hasMany('user'),
created_at: attr('date'),
updated_at: attr('date'),
closed_at: attr('date'),
author_association: attr('string'),
body: attr('string'),
html_url: attr('string'),
init() {
this._super(...arguments);
this.startTrack();
}
});
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
url: attr('string'),
name: attr('string'),
color: attr('string'),
default: attr('boolean')
});
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
login: attr('string'),
avatar_url: attr('string'),
url: attr('string'),
html_url: attr('string'),
type: attr('string'),
site_admin: attr('boolean')
});
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return this.get('store').query('issue', {per_page: 100});
}
});
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
pageSize: 10,
_mapIncluded(data, type) {
const clb = item => ({id: item.id, type, attributes: item});
return Ember.isArray(data) ? data.map(clb) : clb(data);
},
normalizeQueryResponse(a, b, payload) {
const included = [];
const newPayload = {
data: payload.map(item => {
const itemData = {
id: item.id,
type: 'issue',
attributes: item,
relationships: {
labels: {
data: item.labels.map(label => ({type: 'label', id: label.id}))
},
user: {
data: { id: item.user.id, type: 'user' }
}
}
};
included.pushObjects(this._mapIncluded(item.labels, 'label'));
included.pushObject(this._mapIncluded(item.user, 'user'));
itemData.attributes.type = item.pull_request ? 'Pull Request' : 'Issue';
return itemData;
})
};
newPayload.included = included;
console.log(newPayload);
return newPayload;
}
});
<div class="container">
<h1>{{appName}}</h1>
<form class="form-inline">
<div class="form-group">
<label>Username:</label>
{{input value=username class="form-control"}}
</div>
<div class="form-group">
<label>Token:</label>
{{input value=token class="form-control"}}
</div>
</form>
<p>Use your own token (<a href="https://github.com/settings/tokens">settings.tokens</a>) if API-requests limit is reached.</p>
{{outlet}}
</div>
<div id="ember-basic-dropdown-wormhole"></div>
{{one-way-input record.comments update=(action "updateCommentsCount") class=themeInstance.input}}
<p>All:</p>
<ul>
<li>Sum: {{sumData}}</li>
<li>Min: {{minData}}</li>
<li>Max: {{maxData}}</li>
<li>Avg: {{avgData}}</li>
</ul>
<p>Selected:</p>
<ul>
<li>Sum: {{sumSelected}}</li>
<li>Min: {{minSelected}}</li>
<li>Max: {{maxSelected}}</li>
<li>Avg: {{avgSelected}}</li>
</ul>
<span class="{{if isSelected themeInstance.select-row themeInstance.deselect-row}}" onclick={{action "clickOnRow" index record}}></span>
{{#power-select
options=options
selected=record.state
onchange=(action (mut record.state))
as |state|}}
{{state}}
{{/power-select}}
<p>All:</p>
<ul>
{{#each-in dataGrouped as |val count|}}
<li>{{val}}: {{count}}</li>
{{/each-in}}
</ul>
<p>Selected:</p>
<ul>
{{#each-in selectedGrouped as |val count|}}
<li>{{val}}: {{count}}</li>
{{/each-in}}
</ul>
{{yield}}
{{#power-select
options=users
selected=record.user
selectedItemComponent="selected-user"
searchField="login"
onchange=(action (mut record.user))
as |user term|}}
{{user.login}}
{{/power-select}}
<p class="alert alert-danger">Rate-limit error appears. Use your own token.</p>
{{models-table
data=model
columns=columns
multipleSelect=true
showGlobalFilter=false
showColumnsDropdown=false
columnComponents=(hash
user-edit=(component
"user-edit"
users=users
)
edit-row=(component
"models-table/cell-edit-toggle"
saveRowAction=(action "onSaveRow")
cancelRowAction=(action "onCancelRow")
)
)
}}
{
"version": "0.12.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js",
"ember": "2.12.0",
"ember-template-compiler": "2.12.0",
"ember-testing": "2.12.0",
"bs3css": "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css",
"bs3js": "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"
},
"addons": {
"ember-data": "2.12.1",
"ember-models-table": "2.3.0",
"ember-cli-showdown": "4.1.0",
"ember-power-select": "2.0.0-beta.0",
"ember-data-change-tracker": "0.7.2",
"ember-one-way-controls": "3.0.1"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment