semantic-ui-riot
Version:
Semantic UI for Riot
293 lines (249 loc) • 8.49 kB
JavaScript
// ===================================================================================
// Lifecycle
// =========
function onMounted() {
this.update({
pages: []
});
}
function onBeforeUpdate(props, state) {
let needsRegenerate = false;
if (props.activePage != this.lastpropsActivePage) {
state.activePage = parseInt(props.activePage || 1);
this.lastpropsActivePage = state.activePage;
needsRegenerate = true;
}
if (state.activePage != this.lastActivePage) {
this.lastActivePage = state.activePage;
needsRegenerate = true;
}
if (props.totalPage != this.lastpropsTotalPage) {
state.totalPage = parseInt(props.totalPage || 1);
this.lastpropsTotalPage = state.totalPage;
needsRegenerate = true;
}
if (needsRegenerate) {
generatePagination(this);
}
}
// ===================================================================================
// Event
// =====
function onClickPage(e, pageNum) {
e.preventDefault();
if (pageNum < 1 || pageNum > this.state.totalPage) {
return
}
this.update({
activePage: pageNum
});
this.dispatch('change', pageNum);
}
// ===================================================================================
// Logic
// =====
function generatePagination(tag) {
tag.state.pages = [];
const activePage = tag.state.activePage;
const totalPage = tag.state.totalPage;
const pageSize = calcPageSize(tag.props.pageSize, totalPage);
const index = calcIndex(activePage, totalPage, pageSize);
if (pageSize < 1) {
tag.update();
return
}
for (let i = 0; i < pageSize; i++) {
tag.state.pages.push({
number: i + index,
active: i + index == activePage,
});
}
tag.state.pages[0].number = 1;
tag.state.pages[pageSize - 1].number = totalPage;
if (pageSize > 1) {
tag.state.pages[1].disabled = index != 1;
}
if (pageSize > 2) {
tag.state.pages[pageSize - 2].disabled = index != totalPage - pageSize + 1;
}
tag.update();
}
function calcPageSize(pageSize = 7, totalPage = 1) {
pageSize = parseInt(pageSize);
return pageSize < totalPage ? pageSize : totalPage
}
function calcIndex(activePage, totalPage, pageSize) {
const prevPageSize = (pageSize - pageSize % 2) / 2;
if (activePage + prevPageSize > totalPage) {
return totalPage - pageSize + 1
}
if (activePage > prevPageSize) {
return activePage - prevPageSize
}
return 1
}
var suPagination = {
'css': null,
'exports': {
state: {
activePage: 1,
pages: [],
totalPage: 1,
},
lastpropsTotalPage: null,
lastpropsActivePage: null,
lastActivePage: null,
onMounted,
onBeforeUpdate,
onClickPage
},
'template': function(template, expressionTypes, bindingTypes, getComponent) {
return template(
'<div expr92="expr92"><a expr93="expr93"><i aria-hidden="true" class="angle double left icon"></i></a><a expr94="expr94"><i class="angle left icon"></i></a><template expr95="expr95"></template><a expr99="expr99"><i class="angle right icon"></i></a><a expr100="expr100"><i aria-hidden="true" class="angle double right icon"></i></a></div>',
[{
'redundantAttribute': 'expr92',
'selector': '[expr92]',
'expressions': [{
'type': expressionTypes.ATTRIBUTE,
'name': 'class',
'evaluate': function(scope) {
return ['ui pagination menu ', scope.props.class].join('');
}
}]
}, {
'redundantAttribute': 'expr93',
'selector': '[expr93]',
'expressions': [{
'type': expressionTypes.ATTRIBUTE,
'name': 'class',
'evaluate': function(scope) {
return ['angle icon item ', scope.state.activePage <= 1 ? 'disabled' : ''].join('');
}
}, {
'type': expressionTypes.EVENT,
'name': 'onclick',
'evaluate': function(scope) {
return event => scope.onClickPage(event,1);
}
}]
}, {
'redundantAttribute': 'expr94',
'selector': '[expr94]',
'expressions': [{
'type': expressionTypes.ATTRIBUTE,
'name': 'class',
'evaluate': function(scope) {
return ['angle icon item ', scope.state.activePage <= 1 ? 'disabled' : ''].join('');
}
}, {
'type': expressionTypes.EVENT,
'name': 'onclick',
'evaluate': function(scope) {
return event => scope.onClickPage(event,scope.state.activePage - 1);
}
}]
}, {
'type': bindingTypes.EACH,
'getKey': null,
'condition': null,
'template': template(
'<a expr96="expr96" class="item"></a><a expr97="expr97" class="active item"></a><div expr98="expr98" class="disabled icon item"></div>',
[{
'type': bindingTypes.IF,
'evaluate': function(scope) {
return !scope.page.active && !scope.page.disabled;
},
'redundantAttribute': 'expr96',
'selector': '[expr96]',
'template': template(' ', [{
'expressions': [{
'type': expressionTypes.TEXT,
'childNodeIndex': 0,
'evaluate': function(scope) {
return [scope.page.number].join('');
}
}, {
'type': expressionTypes.EVENT,
'name': 'onclick',
'evaluate': function(scope) {
return event => scope.onClickPage(event,scope.page.number);
}
}]
}])
}, {
'type': bindingTypes.IF,
'evaluate': function(scope) {
return scope.page.active;
},
'redundantAttribute': 'expr97',
'selector': '[expr97]',
'template': template(' ', [{
'expressions': [{
'type': expressionTypes.TEXT,
'childNodeIndex': 0,
'evaluate': function(scope) {
return scope.page.number;
}
}]
}])
}, {
'type': bindingTypes.IF,
'evaluate': function(scope) {
return scope.page.disabled;
},
'redundantAttribute': 'expr98',
'selector': '[expr98]',
'template': template('<i class="ellipsis horizontal icon"></i>', [])
}]
),
'redundantAttribute': 'expr95',
'selector': '[expr95]',
'itemName': 'page',
'indexName': null,
'evaluate': function(scope) {
return scope.state.pages;
}
}, {
'redundantAttribute': 'expr99',
'selector': '[expr99]',
'expressions': [{
'type': expressionTypes.ATTRIBUTE,
'name': 'class',
'evaluate': function(scope) {
return [
'angle icon item ',
scope.state.activePage >= scope.state.totalPage ? 'disabled' : ''
].join('');
}
}, {
'type': expressionTypes.EVENT,
'name': 'onclick',
'evaluate': function(scope) {
return event => scope.onClickPage(event,scope.state.activePage + 1);
}
}]
}, {
'redundantAttribute': 'expr100',
'selector': '[expr100]',
'expressions': [{
'type': expressionTypes.ATTRIBUTE,
'name': 'class',
'evaluate': function(scope) {
return [
'angle icon item ',
scope.state.activePage >= scope.state.totalPage ? 'disabled' : ''
].join('');
}
}, {
'type': expressionTypes.EVENT,
'name': 'onclick',
'evaluate': function(scope) {
return event => scope.onClickPage(event,scope.state.totalPage );
}
}]
}]
);
},
'name': 'su-pagination'
};
export default suPagination;