diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e034008..d4888c11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## >= 7.1.1 + +- Add an onPageActive callback (see: https://github.com/AdeleD/react-paginate/pull/349). + ## >= 7.1.0 - Compatibility with React v17.0 diff --git a/README.md b/README.md index 4cbcc3e7..e01c3aff 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Open your browser and go to [http://localhost:3000/](http://localhost:3000/) | `breakClassName` | `String` | The classname on tag `li` of the ellipsis element. | | `breakLinkClassName` | `String` | The classname on tag `a` of the ellipsis element. | | `onPageChange` | `Function` | The method to call when a page is clicked. Exposes the current page object as an argument. | +| `onPageActive` | `Function` | The method to call when an active page is clicked. Exposes the active page object as an argument. | | `initialPage` | `Number` | The initial page selected. | | `forcePage` | `Number` | To override selected page with parent prop. | | `disableInitialCallback` | `boolean` | Disable `onPageChange` callback with initial page. Default: `false` | diff --git a/__tests__/PaginationBoxView-test.js b/__tests__/PaginationBoxView-test.js index 558afc2a..555f87ab 100755 --- a/__tests__/PaginationBoxView-test.js +++ b/__tests__/PaginationBoxView-test.js @@ -836,6 +836,25 @@ describe('Test custom props', () => { }); }); + describe('onPageActive', () => { + it('should use the onPageActive prop when defined', () => { + const myOnPageActiveMethod = jest.fn(); + const myOnPageChangeMethod = jest.fn(); + const pagination = ReactTestUtils.renderIntoDocument( + + ); + const activeItem = ReactDOM.findDOMNode(pagination).querySelector( + '.selected a' + ); + ReactTestUtils.Simulate.click(activeItem); + + expect(myOnPageActiveMethod).toHaveBeenCalledWith({ selected: 0 }); + expect(myOnPageChangeMethod).not.toHaveBeenCalled(); + }); + }); + describe('initialPage', () => { it('should use the initialPage prop when defined', () => { const pagination = ReactTestUtils.renderIntoDocument( diff --git a/dist/react-paginate.js b/dist/react-paginate.js index d61e1947..f1d484a9 100644 --- a/dist/react-paginate.js +++ b/dist/react-paginate.js @@ -1,2 +1,2 @@ -!function(e,a){"object"==typeof exports&&"object"==typeof module?module.exports=a(require("react")):"function"==typeof define&&define.amd?define(["react"],a):"object"==typeof exports?exports.ReactPaginate=a(require("react")):e.ReactPaginate=a(e.React)}(global,(function(e){return function(e){var a={};function t(r){if(a[r])return a[r].exports;var n=a[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}return t.m=e,t.c=a,t.d=function(e,a,r){t.o(e,a)||Object.defineProperty(e,a,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,a){if(1&a&&(e=t(e)),8&a)return e;if(4&a&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&a&&"string"!=typeof e)for(var n in e)t.d(r,n,function(a){return e[a]}.bind(null,n));return r},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="",t(t.s=4)}([function(e,a,t){e.exports=t(2)()},function(a,t){a.exports=e},function(e,a,t){"use strict";var r=t(3);function n(){}function i(){}i.resetWarningCache=n,e.exports=function(){function e(e,a,t,n,i,o){if(o!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function a(){return e}e.isRequired=e;var t={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:a,element:e,elementType:e,instanceOf:a,node:e,objectOf:a,oneOf:a,oneOfType:a,shape:a,exact:a,checkPropTypes:i,resetWarningCache:n};return t.PropTypes=t,t}},function(e,a,t){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,a,t){"use strict";t.r(a);var r=t(1),n=t.n(r),i=t(0),o=t.n(i);function s(){return(s=Object.assign||function(e){for(var a=1;a0&&a.handlePageSelected(t-1,e)})),k(y(a),"handleNextPage",(function(e){var t=a.state.selected,r=a.props.pageCount;e.preventDefault?e.preventDefault():e.returnValue=!1,ti-r/2?v=r-(m=i-u):ui-o||d>=u-v&&d<=u+m?e.push(h(d)):s&&e[e.length-1]!==b&&(b=n.a.createElement(f,{key:d,breakLabel:s,breakClassName:l,breakLinkClassName:c,breakHandler:a.handleBreakClick.bind(null,d),getEventListener:a.getEventListener}),e.push(b))}return e})),t=e.initialPage?e.initialPage:e.forcePage?e.forcePage:0,a.state={selected:t},a}return a=o,(t=[{key:"componentDidMount",value:function(){var e=this.props,a=e.initialPage,t=e.disableInitialCallback,r=e.extraAriaContext;void 0===a||t||this.callCallback(a),r&&console.warn("DEPRECATED (react-paginate): The extraAriaContext prop is deprecated. You should now use the ariaLabelBuilder instead.")}},{key:"componentDidUpdate",value:function(e){void 0!==this.props.forcePage&&this.props.forcePage!==e.forcePage&&this.setState({selected:this.props.forcePage})}},{key:"getForwardJump",value:function(){var e=this.state.selected,a=this.props,t=a.pageCount,r=e+a.pageRangeDisplayed;return r>=t?t-1:r}},{key:"getBackwardJump",value:function(){var e=this.state.selected-this.props.pageRangeDisplayed;return e<0?0:e}},{key:"hrefBuilder",value:function(e){var a=this.props,t=a.hrefBuilder,r=a.pageCount;if(t&&e!==this.state.selected&&e>=0&&e=0&&e0&&a.handlePageSelected(t-1,e)})),P(h(a),"handleNextPage",(function(e){var t=a.state.selected,r=a.props.pageCount;e.preventDefault?e.preventDefault():e.returnValue=!1,ti-r/2?b=r-(m=i-u):ui-o||d>=u-b&&d<=u+m?e.push(y(d)):s&&e[e.length-1]!==v&&(v=n.a.createElement(f,{key:d,breakLabel:s,breakClassName:l,breakLinkClassName:c,breakHandler:a.handleBreakClick.bind(null,d),getEventListener:a.getEventListener}),e.push(v))}return e})),t=e.initialPage?e.initialPage:e.forcePage?e.forcePage:0,a.state={selected:t},a}return a=o,(t=[{key:"componentDidMount",value:function(){var e=this.props,a=e.initialPage,t=e.disableInitialCallback,r=e.extraAriaContext;void 0===a||t||this.callCallback(a),r&&console.warn("DEPRECATED (react-paginate): The extraAriaContext prop is deprecated. You should now use the ariaLabelBuilder instead.")}},{key:"componentDidUpdate",value:function(e){void 0!==this.props.forcePage&&this.props.forcePage!==e.forcePage&&this.setState({selected:this.props.forcePage})}},{key:"getForwardJump",value:function(){var e=this.state.selected,a=this.props,t=a.pageCount,r=e+a.pageRangeDisplayed;return r>=t?t-1:r}},{key:"getBackwardJump",value:function(){var e=this.state.selected-this.props.pageRangeDisplayed;return e<0?0:e}},{key:"hrefBuilder",value:function(e){var a=this.props,t=a.hrefBuilder,r=a.pageCount;if(t&&e!==this.state.selected&&e>=0&&e=0&&e {\n let { pageClassName, pageLinkClassName } = props;\n const {\n page,\n selected,\n activeClassName,\n activeLinkClassName,\n getEventListener,\n pageSelectedHandler,\n href,\n extraAriaContext\n } = props;\n\n let ariaLabel =\n props.ariaLabel ||\n 'Page ' +\n page +\n (extraAriaContext ? ' ' + extraAriaContext : '');\n let ariaCurrent = null;\n\n if (selected) {\n ariaCurrent = 'page';\n\n ariaLabel =\n props.ariaLabel || 'Page ' + page + ' is your current page';\n\n if (typeof pageClassName !== 'undefined') {\n pageClassName = pageClassName + ' ' + activeClassName;\n } else {\n pageClassName = activeClassName;\n }\n\n if (typeof pageLinkClassName !== 'undefined') {\n if (typeof activeLinkClassName !== 'undefined') {\n pageLinkClassName = pageLinkClassName + ' ' + activeLinkClassName;\n }\n } else {\n pageLinkClassName = activeLinkClassName;\n }\n }\n\n return (\n
  • \n \n {page}\n \n
  • \n );\n};\n\nPageView.propTypes = {\n pageSelectedHandler: PropTypes.func.isRequired,\n selected: PropTypes.bool.isRequired,\n pageClassName: PropTypes.string,\n pageLinkClassName: PropTypes.string,\n activeClassName: PropTypes.string,\n activeLinkClassName: PropTypes.string,\n extraAriaContext: PropTypes.string,\n href: PropTypes.string,\n ariaLabel: PropTypes.string,\n page: PropTypes.number.isRequired,\n getEventListener: PropTypes.func.isRequired,\n};\n\nexport default PageView;\n","'use strict';\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nconst BreakView = (props) => {\n const { breakLabel, breakClassName, breakLinkClassName, breakHandler, getEventListener } = props;\n const className = breakClassName || 'break';\n\n return (\n
  • \n \n {breakLabel}\n \n
  • \n );\n};\n\nBreakView.propTypes = {\n breakLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n breakClassName: PropTypes.string,\n breakLinkClassName: PropTypes.string,\n breakHandler: PropTypes.func.isRequired,\n getEventListener: PropTypes.func.isRequired,\n};\n\nexport default BreakView;\n","'use strict';\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport PageView from './PageView';\nimport BreakView from './BreakView';\n\nexport default class PaginationBoxView extends Component {\n static propTypes = {\n pageCount: PropTypes.number.isRequired,\n pageRangeDisplayed: PropTypes.number.isRequired,\n marginPagesDisplayed: PropTypes.number.isRequired,\n previousLabel: PropTypes.node,\n previousAriaLabel: PropTypes.string,\n prevRel: PropTypes.string,\n nextLabel: PropTypes.node,\n nextAriaLabel: PropTypes.string,\n nextRel: PropTypes.string,\n breakLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n hrefBuilder: PropTypes.func,\n onPageChange: PropTypes.func,\n initialPage: PropTypes.number,\n forcePage: PropTypes.number,\n disableInitialCallback: PropTypes.bool,\n containerClassName: PropTypes.string,\n pageClassName: PropTypes.string,\n pageLinkClassName: PropTypes.string,\n activeClassName: PropTypes.string,\n activeLinkClassName: PropTypes.string,\n previousClassName: PropTypes.string,\n nextClassName: PropTypes.string,\n previousLinkClassName: PropTypes.string,\n nextLinkClassName: PropTypes.string,\n disabledClassName: PropTypes.string,\n breakClassName: PropTypes.string,\n breakLinkClassName: PropTypes.string,\n extraAriaContext: PropTypes.string,\n ariaLabelBuilder: PropTypes.func,\n eventListener: PropTypes.string,\n };\n\n static defaultProps = {\n pageCount: 10,\n pageRangeDisplayed: 2,\n marginPagesDisplayed: 3,\n activeClassName: 'selected',\n previousLabel: 'Previous',\n previousClassName: 'previous',\n previousAriaLabel: 'Previous page',\n prevRel: 'prev',\n nextLabel: 'Next',\n nextClassName: 'next',\n nextAriaLabel: 'Next page',\n nextRel: 'next',\n breakLabel: '...',\n disabledClassName: 'disabled',\n disableInitialCallback: false,\n eventListener: 'onClick',\n };\n\n constructor(props) {\n super(props);\n\n let initialSelected;\n if (props.initialPage) {\n initialSelected = props.initialPage;\n } else if (props.forcePage) {\n initialSelected = props.forcePage;\n } else {\n initialSelected = 0;\n }\n\n this.state = {\n selected: initialSelected,\n };\n }\n\n componentDidMount() {\n const {\n initialPage,\n disableInitialCallback,\n extraAriaContext,\n } = this.props;\n // Call the callback with the initialPage item:\n if (typeof initialPage !== 'undefined' && !disableInitialCallback) {\n this.callCallback(initialPage);\n }\n\n if (extraAriaContext) {\n console.warn(\n 'DEPRECATED (react-paginate): The extraAriaContext prop is deprecated. You should now use the ariaLabelBuilder instead.'\n );\n }\n }\n\n componentDidUpdate(prevProps) {\n if (\n typeof this.props.forcePage !== 'undefined' &&\n this.props.forcePage !== prevProps.forcePage\n ) {\n this.setState({ selected: this.props.forcePage });\n }\n }\n\n handlePreviousPage = (evt) => {\n const { selected } = this.state;\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n if (selected > 0) {\n this.handlePageSelected(selected - 1, evt);\n }\n };\n\n handleNextPage = (evt) => {\n const { selected } = this.state;\n const { pageCount } = this.props;\n\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n if (selected < pageCount - 1) {\n this.handlePageSelected(selected + 1, evt);\n }\n };\n\n handlePageSelected = (selected, evt) => {\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n\n if (this.state.selected === selected) return;\n\n this.setState({ selected: selected });\n\n // Call the callback with the new selected item:\n this.callCallback(selected);\n };\n\n getEventListener = (handlerFunction) => {\n const { eventListener } = this.props;\n return {\n [eventListener]: handlerFunction,\n };\n }\n\n getForwardJump() {\n const { selected } = this.state;\n const { pageCount, pageRangeDisplayed } = this.props;\n\n const forwardJump = selected + pageRangeDisplayed;\n return forwardJump >= pageCount ? pageCount - 1 : forwardJump;\n }\n\n getBackwardJump() {\n const { selected } = this.state;\n const { pageRangeDisplayed } = this.props;\n\n const backwardJump = selected - pageRangeDisplayed;\n return backwardJump < 0 ? 0 : backwardJump;\n }\n\n handleBreakClick = (index, evt) => {\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n\n const { selected } = this.state;\n\n this.handlePageSelected(\n selected < index ? this.getForwardJump() : this.getBackwardJump(),\n evt\n );\n };\n\n hrefBuilder(pageIndex) {\n const { hrefBuilder, pageCount } = this.props;\n if (\n hrefBuilder &&\n pageIndex !== this.state.selected &&\n pageIndex >= 0 &&\n pageIndex < pageCount\n ) {\n return hrefBuilder(pageIndex + 1);\n }\n }\n\n ariaLabelBuilder(pageIndex) {\n const selected = pageIndex === this.state.selected;\n if (\n this.props.ariaLabelBuilder &&\n pageIndex >= 0 &&\n pageIndex < this.props.pageCount\n ) {\n let label = this.props.ariaLabelBuilder(pageIndex + 1, selected);\n // DEPRECATED: The extraAriaContext prop was used to add additional context\n // to the aria-label. Users should now use the ariaLabelBuilder instead.\n if (this.props.extraAriaContext && !selected) {\n label = label + ' ' + this.props.extraAriaContext;\n }\n return label;\n }\n }\n\n callCallback = (selectedItem) => {\n if (\n typeof this.props.onPageChange !== 'undefined' &&\n typeof this.props.onPageChange === 'function'\n ) {\n this.props.onPageChange({ selected: selectedItem });\n }\n };\n\n getPageElement(index) {\n const { selected } = this.state;\n const {\n pageClassName,\n pageLinkClassName,\n activeClassName,\n activeLinkClassName,\n extraAriaContext,\n } = this.props;\n\n return (\n \n );\n }\n\n pagination = () => {\n const items = [];\n const {\n pageRangeDisplayed,\n pageCount,\n marginPagesDisplayed,\n breakLabel,\n breakClassName,\n breakLinkClassName,\n } = this.props;\n\n const { selected } = this.state;\n\n if (pageCount <= pageRangeDisplayed) {\n for (let index = 0; index < pageCount; index++) {\n items.push(this.getPageElement(index));\n }\n } else {\n let leftSide = pageRangeDisplayed / 2;\n let rightSide = pageRangeDisplayed - leftSide;\n\n // If the selected page index is on the default right side of the pagination,\n // we consider that the new right side is made up of it (= only one break element).\n // If the selected page index is on the default left side of the pagination,\n // we consider that the new left side is made up of it (= only one break element).\n if (selected > pageCount - pageRangeDisplayed / 2) {\n rightSide = pageCount - selected;\n leftSide = pageRangeDisplayed - rightSide;\n } else if (selected < pageRangeDisplayed / 2) {\n leftSide = selected;\n rightSide = pageRangeDisplayed - leftSide;\n }\n\n let index;\n let page;\n let breakView;\n let createPageView = (index) => this.getPageElement(index);\n\n for (index = 0; index < pageCount; index++) {\n page = index + 1;\n\n // If the page index is lower than the margin defined,\n // the page has to be displayed on the left side of\n // the pagination.\n if (page <= marginPagesDisplayed) {\n items.push(createPageView(index));\n continue;\n }\n\n // If the page index is greater than the page count\n // minus the margin defined, the page has to be\n // displayed on the right side of the pagination.\n if (page > pageCount - marginPagesDisplayed) {\n items.push(createPageView(index));\n continue;\n }\n\n // If the page index is near the selected page index\n // and inside the defined range (pageRangeDisplayed)\n // we have to display it (it will create the center\n // part of the pagination).\n if (index >= selected - leftSide && index <= selected + rightSide) {\n items.push(createPageView(index));\n continue;\n }\n\n // If the page index doesn't meet any of the conditions above,\n // we check if the last item of the current \"items\" array\n // is a break element. If not, we add a break element, else,\n // we do nothing (because we don't want to display the page).\n if (breakLabel && items[items.length - 1] !== breakView) {\n breakView = (\n \n );\n items.push(breakView);\n }\n }\n }\n\n return items;\n };\n\n render() {\n const {\n disabledClassName,\n pageCount,\n containerClassName,\n previousLabel,\n previousClassName,\n previousLinkClassName,\n previousAriaLabel,\n prevRel,\n nextLabel,\n nextClassName,\n nextLinkClassName,\n nextAriaLabel,\n nextRel,\n } = this.props;\n\n const { selected } = this.state;\n\n const previousClasses =\n previousClassName + (selected === 0 ? ` ${disabledClassName}` : '');\n const nextClasses =\n nextClassName +\n (selected === pageCount - 1 ? ` ${disabledClassName}` : '');\n\n const previousAriaDisabled = selected === 0 ? 'true' : 'false';\n const nextAriaDisabled = selected === pageCount - 1 ? 'true' : 'false';\n\n return (\n
      \n
    • \n \n {previousLabel}\n \n
    • \n\n {this.pagination()}\n\n
    • \n \n {nextLabel}\n \n
    • \n
    \n );\n }\n}\n","import PaginationBoxView from './PaginationBoxView';\n\nexport default PaginationBoxView;\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://ReactPaginate/webpack/universalModuleDefinition","webpack://ReactPaginate/webpack/bootstrap","webpack://ReactPaginate/./node_modules/prop-types/index.js","webpack://ReactPaginate/external {\"root\":\"React\",\"amd\":\"react\",\"commonjs\":\"react\",\"commonjs2\":\"react\"}","webpack://ReactPaginate/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://ReactPaginate/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://ReactPaginate/./react_components/PageView.js","webpack://ReactPaginate/./react_components/BreakView.js","webpack://ReactPaginate/./react_components/PaginationBoxView.js","webpack://ReactPaginate/./react_components/index.js"],"names":["root","factory","exports","module","require","define","amd","global","__WEBPACK_EXTERNAL_MODULE__1__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","getShim","isRequired","ReactPropTypes","array","bool","func","number","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","PageView","pageClassName","pageLinkClassName","page","selected","activeClassName","activeLinkClassName","getEventListener","pageSelectedHandler","href","extraAriaContext","ariaLabel","ariaCurrent","className","role","tabIndex","aria-label","aria-current","onKeyPress","propTypes","BreakView","breakLabel","breakClassName","breakLinkClassName","breakHandler","PaginationBoxView","initialSelected","evt","state","preventDefault","returnValue","handlePageSelected","pageCount","setState","callCallback","callActiveCallback","handlerFunction","eventListener","index","getForwardJump","getBackwardJump","selectedItem","onPageChange","onPageActive","items","pageRangeDisplayed","marginPagesDisplayed","push","getPageElement","breakView","leftSide","rightSide","createPageView","length","handleBreakClick","initialPage","forcePage","this","disableInitialCallback","console","warn","prevProps","forwardJump","backwardJump","pageIndex","hrefBuilder","ariaLabelBuilder","label","disabledClassName","containerClassName","previousLabel","previousClassName","previousLinkClassName","previousAriaLabel","prevRel","nextLabel","nextClassName","nextLinkClassName","nextAriaLabel","nextRel","previousClasses","nextClasses","previousAriaDisabled","nextAriaDisabled","handlePreviousPage","aria-disabled","rel","pagination","handleNextPage","Component"],"mappings":"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","file":"react-paginate.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactPaginate\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"ReactPaginate\"] = factory(root[\"React\"]);\n})(global, function(__WEBPACK_EXTERNAL_MODULE__1__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1__;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","'use strict';\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nconst PageView = (props) => {\n let { pageClassName, pageLinkClassName } = props;\n const {\n page,\n selected,\n activeClassName,\n activeLinkClassName,\n getEventListener,\n pageSelectedHandler,\n href,\n extraAriaContext\n } = props;\n\n let ariaLabel =\n props.ariaLabel ||\n 'Page ' +\n page +\n (extraAriaContext ? ' ' + extraAriaContext : '');\n let ariaCurrent = null;\n\n if (selected) {\n ariaCurrent = 'page';\n\n ariaLabel =\n props.ariaLabel || 'Page ' + page + ' is your current page';\n\n if (typeof pageClassName !== 'undefined') {\n pageClassName = pageClassName + ' ' + activeClassName;\n } else {\n pageClassName = activeClassName;\n }\n\n if (typeof pageLinkClassName !== 'undefined') {\n if (typeof activeLinkClassName !== 'undefined') {\n pageLinkClassName = pageLinkClassName + ' ' + activeLinkClassName;\n }\n } else {\n pageLinkClassName = activeLinkClassName;\n }\n }\n\n return (\n
  • \n \n {page}\n \n
  • \n );\n};\n\nPageView.propTypes = {\n pageSelectedHandler: PropTypes.func.isRequired,\n selected: PropTypes.bool.isRequired,\n pageClassName: PropTypes.string,\n pageLinkClassName: PropTypes.string,\n activeClassName: PropTypes.string,\n activeLinkClassName: PropTypes.string,\n extraAriaContext: PropTypes.string,\n href: PropTypes.string,\n ariaLabel: PropTypes.string,\n page: PropTypes.number.isRequired,\n getEventListener: PropTypes.func.isRequired,\n};\n\nexport default PageView;\n","'use strict';\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nconst BreakView = (props) => {\n const { breakLabel, breakClassName, breakLinkClassName, breakHandler, getEventListener } = props;\n const className = breakClassName || 'break';\n\n return (\n
  • \n \n {breakLabel}\n \n
  • \n );\n};\n\nBreakView.propTypes = {\n breakLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n breakClassName: PropTypes.string,\n breakLinkClassName: PropTypes.string,\n breakHandler: PropTypes.func.isRequired,\n getEventListener: PropTypes.func.isRequired,\n};\n\nexport default BreakView;\n","'use strict';\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport PageView from './PageView';\nimport BreakView from './BreakView';\n\nexport default class PaginationBoxView extends Component {\n static propTypes = {\n pageCount: PropTypes.number.isRequired,\n pageRangeDisplayed: PropTypes.number.isRequired,\n marginPagesDisplayed: PropTypes.number.isRequired,\n previousLabel: PropTypes.node,\n previousAriaLabel: PropTypes.string,\n prevRel: PropTypes.string,\n nextLabel: PropTypes.node,\n nextAriaLabel: PropTypes.string,\n nextRel: PropTypes.string,\n breakLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n hrefBuilder: PropTypes.func,\n onPageChange: PropTypes.func,\n onPageActive: PropTypes.func,\n initialPage: PropTypes.number,\n forcePage: PropTypes.number,\n disableInitialCallback: PropTypes.bool,\n containerClassName: PropTypes.string,\n pageClassName: PropTypes.string,\n pageLinkClassName: PropTypes.string,\n activeClassName: PropTypes.string,\n activeLinkClassName: PropTypes.string,\n previousClassName: PropTypes.string,\n nextClassName: PropTypes.string,\n previousLinkClassName: PropTypes.string,\n nextLinkClassName: PropTypes.string,\n disabledClassName: PropTypes.string,\n breakClassName: PropTypes.string,\n breakLinkClassName: PropTypes.string,\n extraAriaContext: PropTypes.string,\n ariaLabelBuilder: PropTypes.func,\n eventListener: PropTypes.string,\n };\n\n static defaultProps = {\n pageCount: 10,\n pageRangeDisplayed: 2,\n marginPagesDisplayed: 3,\n activeClassName: 'selected',\n previousLabel: 'Previous',\n previousClassName: 'previous',\n previousAriaLabel: 'Previous page',\n prevRel: 'prev',\n nextLabel: 'Next',\n nextClassName: 'next',\n nextAriaLabel: 'Next page',\n nextRel: 'next',\n breakLabel: '...',\n disabledClassName: 'disabled',\n disableInitialCallback: false,\n eventListener: 'onClick',\n };\n\n constructor(props) {\n super(props);\n\n let initialSelected;\n if (props.initialPage) {\n initialSelected = props.initialPage;\n } else if (props.forcePage) {\n initialSelected = props.forcePage;\n } else {\n initialSelected = 0;\n }\n\n this.state = {\n selected: initialSelected,\n };\n }\n\n componentDidMount() {\n const {\n initialPage,\n disableInitialCallback,\n extraAriaContext,\n } = this.props;\n // Call the callback with the initialPage item:\n if (typeof initialPage !== 'undefined' && !disableInitialCallback) {\n this.callCallback(initialPage);\n }\n\n if (extraAriaContext) {\n console.warn(\n 'DEPRECATED (react-paginate): The extraAriaContext prop is deprecated. You should now use the ariaLabelBuilder instead.'\n );\n }\n }\n\n componentDidUpdate(prevProps) {\n if (\n typeof this.props.forcePage !== 'undefined' &&\n this.props.forcePage !== prevProps.forcePage\n ) {\n this.setState({ selected: this.props.forcePage });\n }\n }\n\n handlePreviousPage = (evt) => {\n const { selected } = this.state;\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n if (selected > 0) {\n this.handlePageSelected(selected - 1, evt);\n }\n };\n\n handleNextPage = (evt) => {\n const { selected } = this.state;\n const { pageCount } = this.props;\n\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n if (selected < pageCount - 1) {\n this.handlePageSelected(selected + 1, evt);\n }\n };\n\n handlePageSelected = (selected, evt) => {\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n\n if (this.state.selected === selected) {\n this.callActiveCallback(selected);\n return;\n }\n\n this.setState({ selected: selected });\n\n // Call the callback with the new selected item:\n this.callCallback(selected);\n };\n\n getEventListener = (handlerFunction) => {\n const { eventListener } = this.props;\n return {\n [eventListener]: handlerFunction,\n };\n }\n\n getForwardJump() {\n const { selected } = this.state;\n const { pageCount, pageRangeDisplayed } = this.props;\n\n const forwardJump = selected + pageRangeDisplayed;\n return forwardJump >= pageCount ? pageCount - 1 : forwardJump;\n }\n\n getBackwardJump() {\n const { selected } = this.state;\n const { pageRangeDisplayed } = this.props;\n\n const backwardJump = selected - pageRangeDisplayed;\n return backwardJump < 0 ? 0 : backwardJump;\n }\n\n handleBreakClick = (index, evt) => {\n evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n\n const { selected } = this.state;\n\n this.handlePageSelected(\n selected < index ? this.getForwardJump() : this.getBackwardJump(),\n evt\n );\n };\n\n hrefBuilder(pageIndex) {\n const { hrefBuilder, pageCount } = this.props;\n if (\n hrefBuilder &&\n pageIndex !== this.state.selected &&\n pageIndex >= 0 &&\n pageIndex < pageCount\n ) {\n return hrefBuilder(pageIndex + 1);\n }\n }\n\n ariaLabelBuilder(pageIndex) {\n const selected = pageIndex === this.state.selected;\n if (\n this.props.ariaLabelBuilder &&\n pageIndex >= 0 &&\n pageIndex < this.props.pageCount\n ) {\n let label = this.props.ariaLabelBuilder(pageIndex + 1, selected);\n // DEPRECATED: The extraAriaContext prop was used to add additional context\n // to the aria-label. Users should now use the ariaLabelBuilder instead.\n if (this.props.extraAriaContext && !selected) {\n label = label + ' ' + this.props.extraAriaContext;\n }\n return label;\n }\n }\n\n callCallback = (selectedItem) => {\n if (\n typeof this.props.onPageChange !== 'undefined' &&\n typeof this.props.onPageChange === 'function'\n ) {\n this.props.onPageChange({ selected: selectedItem });\n }\n };\n\n callActiveCallback = (selectedItem) => {\n if (\n typeof this.props.onPageActive !== 'undefined' &&\n typeof this.props.onPageActive === 'function'\n ) {\n this.props.onPageActive({ selected: selectedItem });\n }\n };\n\n getPageElement(index) {\n const { selected } = this.state;\n const {\n pageClassName,\n pageLinkClassName,\n activeClassName,\n activeLinkClassName,\n extraAriaContext,\n } = this.props;\n\n return (\n \n );\n }\n\n pagination = () => {\n const items = [];\n const {\n pageRangeDisplayed,\n pageCount,\n marginPagesDisplayed,\n breakLabel,\n breakClassName,\n breakLinkClassName,\n } = this.props;\n\n const { selected } = this.state;\n\n if (pageCount <= pageRangeDisplayed) {\n for (let index = 0; index < pageCount; index++) {\n items.push(this.getPageElement(index));\n }\n } else {\n let leftSide = pageRangeDisplayed / 2;\n let rightSide = pageRangeDisplayed - leftSide;\n\n // If the selected page index is on the default right side of the pagination,\n // we consider that the new right side is made up of it (= only one break element).\n // If the selected page index is on the default left side of the pagination,\n // we consider that the new left side is made up of it (= only one break element).\n if (selected > pageCount - pageRangeDisplayed / 2) {\n rightSide = pageCount - selected;\n leftSide = pageRangeDisplayed - rightSide;\n } else if (selected < pageRangeDisplayed / 2) {\n leftSide = selected;\n rightSide = pageRangeDisplayed - leftSide;\n }\n\n let index;\n let page;\n let breakView;\n let createPageView = (index) => this.getPageElement(index);\n\n for (index = 0; index < pageCount; index++) {\n page = index + 1;\n\n // If the page index is lower than the margin defined,\n // the page has to be displayed on the left side of\n // the pagination.\n if (page <= marginPagesDisplayed) {\n items.push(createPageView(index));\n continue;\n }\n\n // If the page index is greater than the page count\n // minus the margin defined, the page has to be\n // displayed on the right side of the pagination.\n if (page > pageCount - marginPagesDisplayed) {\n items.push(createPageView(index));\n continue;\n }\n\n // If the page index is near the selected page index\n // and inside the defined range (pageRangeDisplayed)\n // we have to display it (it will create the center\n // part of the pagination).\n if (index >= selected - leftSide && index <= selected + rightSide) {\n items.push(createPageView(index));\n continue;\n }\n\n // If the page index doesn't meet any of the conditions above,\n // we check if the last item of the current \"items\" array\n // is a break element. If not, we add a break element, else,\n // we do nothing (because we don't want to display the page).\n if (breakLabel && items[items.length - 1] !== breakView) {\n breakView = (\n \n );\n items.push(breakView);\n }\n }\n }\n\n return items;\n };\n\n render() {\n const {\n disabledClassName,\n pageCount,\n containerClassName,\n previousLabel,\n previousClassName,\n previousLinkClassName,\n previousAriaLabel,\n prevRel,\n nextLabel,\n nextClassName,\n nextLinkClassName,\n nextAriaLabel,\n nextRel,\n } = this.props;\n\n const { selected } = this.state;\n\n const previousClasses =\n previousClassName + (selected === 0 ? ` ${disabledClassName}` : '');\n const nextClasses =\n nextClassName +\n (selected === pageCount - 1 ? ` ${disabledClassName}` : '');\n\n const previousAriaDisabled = selected === 0 ? 'true' : 'false';\n const nextAriaDisabled = selected === pageCount - 1 ? 'true' : 'false';\n\n return (\n
      \n
    • \n \n {previousLabel}\n \n
    • \n\n {this.pagination()}\n\n
    • \n \n {nextLabel}\n \n
    • \n
    \n );\n }\n}\n","import PaginationBoxView from './PaginationBoxView';\n\nexport default PaginationBoxView;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 50bfe225..50932050 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-paginate", - "version": "7.1.0", + "version": "7.1.1", "description": "A ReactJS component that creates a pagination.", "main": "./dist/react-paginate.js", "repository": { diff --git a/react_components/PaginationBoxView.js b/react_components/PaginationBoxView.js index 0dd56648..c37f83f1 100755 --- a/react_components/PaginationBoxView.js +++ b/react_components/PaginationBoxView.js @@ -19,6 +19,7 @@ export default class PaginationBoxView extends Component { breakLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), hrefBuilder: PropTypes.func, onPageChange: PropTypes.func, + onPageActive: PropTypes.func, initialPage: PropTypes.number, forcePage: PropTypes.number, disableInitialCallback: PropTypes.bool, @@ -123,7 +124,10 @@ export default class PaginationBoxView extends Component { handlePageSelected = (selected, evt) => { evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - if (this.state.selected === selected) return; + if (this.state.selected === selected) { + this.callActiveCallback(selected); + return; + } this.setState({ selected: selected }); @@ -203,6 +207,15 @@ export default class PaginationBoxView extends Component { } }; + callActiveCallback = (selectedItem) => { + if ( + typeof this.props.onPageActive !== 'undefined' && + typeof this.props.onPageActive === 'function' + ) { + this.props.onPageActive({ selected: selectedItem }); + } + }; + getPageElement(index) { const { selected } = this.state; const {