From d9bdd360739f5f9217ce9f552cd7c90830295f0e Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Fri, 15 Apr 2016 09:17:04 +0900 Subject: [PATCH] fix category edition/creation --- .meteor/versions | 5 +- .../lib/categories/CategoriesEditForm.jsx | 3 + .../lib/categories/CategoriesList.jsx | 103 +++++++++++++++--- .../lib/categories/Category.jsx | 12 +- packages/nova-base-components/package.js | 4 +- .../lib/components/ContextPasser.jsx | 28 +++++ .../nova-core/lib/components/ModalTrigger.jsx | 20 +--- packages/nova-core/lib/core.js | 3 +- packages/nova-forms/package.js | 2 +- packages/nova-i18n/package.js | 4 +- 10 files changed, 134 insertions(+), 50 deletions(-) create mode 100644 packages/nova-core/lib/components/ContextPasser.jsx diff --git a/.meteor/versions b/.meteor/versions index 81251f732..3a9d2606e 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -21,7 +21,6 @@ boilerplate-generator@1.0.7 caching-compiler@1.0.3 caching-html-compiler@1.0.5 callback-hook@1.0.7 -cfs:http-methods@0.0.32 check@1.1.3 chuangbo:cookie@1.1.0 chuangbo:marked@0.3.5_1 @@ -74,7 +73,6 @@ meteorhacks:meteorx@1.4.1 meteorhacks:picker@1.0.3 meteorhacks:subs-manager@1.6.4 meteorhacks:unblock@1.1.0 -meteorspark:util@0.2.0 minifier-css@1.1.10 minifier-js@1.1.10 minimongo@1.0.13 @@ -145,10 +143,9 @@ standard-minifier-css@1.0.5 standard-minifier-js@1.0.5 standard-minifiers@1.0.5 std:accounts-ui@1.1.12 -tap:i18n@1.8.0 templating@1.1.8 templating-tools@1.0.3 -tmeasday:check-npm-versions@0.3.0 +tmeasday:check-npm-versions@0.3.1 tmeasday:publish-counts@0.7.3 tracker@1.0.12 twitter@1.1.8 diff --git a/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx b/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx index c87ad7949..522b6cd1a 100644 --- a/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx +++ b/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx @@ -38,6 +38,9 @@ class CategoriesEditForm extends Component{ collection={Categories} currentUser={this.context.currentUser} methodName="categories.edit" + successCallback={(category)=>{ + Messages.flash("Category edited.", "success"); + }} labelFunction={fieldName => Telescope.utils.getFieldLabel(fieldName, Categories)} />
diff --git a/packages/nova-base-components/lib/categories/CategoriesList.jsx b/packages/nova-base-components/lib/categories/CategoriesList.jsx index 2b012793d..12aac482f 100644 --- a/packages/nova-base-components/lib/categories/CategoriesList.jsx +++ b/packages/nova-base-components/lib/categories/CategoriesList.jsx @@ -1,20 +1,84 @@ import React, { PropTypes, Component } from 'react'; -import { Button, DropdownButton, MenuItem } from 'react-bootstrap'; +import { Button, DropdownButton, MenuItem, Modal } from 'react-bootstrap'; import Router from "../router.js" import Core from "meteor/nova:core"; const ModalTrigger = Core.ModalTrigger; +const ContextPasser = Core.ContextPasser; + +// note: cannot use ModalTrigger component because of https://github.com/react-bootstrap/react-bootstrap/issues/1808 class CategoriesList extends Component { - renderNew() { - const CategoriesNewForm = Telescope.components.CategoriesNewForm; + constructor() { + super(); + this.openCategoryEditModal = this.openCategoryEditModal.bind(this); + this.openCategoryNewModal = this.openCategoryNewModal.bind(this); + this.closeModal = this.closeModal.bind(this); + this.state = { + openModal: false + } + } + + openCategoryNewModal() { + // new category modal has number 0 + this.setState({openModal: 0}); + } + + openCategoryEditModal(index) { + // edit category modals are numbered from 1 to n + this.setState({openModal: index+1}); + } + + closeModal() { + this.setState({openModal: false}); + } + + renderCategoryEditModal(category, index) { + + const CategoriesEditForm = Telescope.components.CategoriesEditForm; + return ( - }> - - + + + Edit Category + + + + + + + ) } + renderCategoryNewModal() { + + const CategoriesNewForm = Telescope.components.CategoriesNewForm; + + return ( + + + New Category + + + + + + + + ) + } + + renderCategoryNewButton() { + return ; + // const CategoriesNewForm = Telescope.components.CategoriesNewForm; + // return ( + // }> + // + // + // ) + } + render() { const Category = Telescope.components.Category; @@ -26,16 +90,23 @@ class CategoriesList extends Component { const currentCategorySlug = currentRoute.queryParams.cat; return ( - - All Categories - {categories && categories.length > 0 ? categories.map((category, index) => ) : null} - {Users.is.admin(this.context.currentUser) ? this.renderNew() : null} - +
+ + All Categories + {categories && categories.length > 0 ? categories.map((category, index) => ) : null} + {Users.is.admin(this.context.currentUser) ? this.renderCategoryNewButton() : null} + +
+ {/* modals cannot be inside DropdownButton component (see GH issue) */} + {categories && categories.length > 0 ? categories.map((category, index) => this.renderCategoryEditModal(category, index)) : null} + {this.renderCategoryNewModal()} +
+
) } diff --git a/packages/nova-base-components/lib/categories/Category.jsx b/packages/nova-base-components/lib/categories/Category.jsx index 262d45fb7..080ed3958 100644 --- a/packages/nova-base-components/lib/categories/Category.jsx +++ b/packages/nova-base-components/lib/categories/Category.jsx @@ -10,11 +10,12 @@ class Category extends Component { renderEdit() { const {Icon, CategoriesEditForm} = Telescope.components; - return ( - }> - - - ) + return ; + // return ( + // }> + // + // + // ) } render() { @@ -43,6 +44,7 @@ Category.propTypes = { category: React.PropTypes.object, index: React.PropTypes.number, currentCategorySlug: React.PropTypes.string, + openModal: React.PropTypes.func } Category.contextTypes = { diff --git a/packages/nova-base-components/package.js b/packages/nova-base-components/package.js index 9de6f5646..1717d4880 100644 --- a/packages/nova-base-components/package.js +++ b/packages/nova-base-components/package.js @@ -21,8 +21,8 @@ Package.onUse(function (api) { // third-party packages - 'tmeasday:check-npm-versions@0.3.0', - 'std:accounts-ui@1.1.19', + 'tmeasday:check-npm-versions@0.3.1', + 'std:accounts-ui@1.1.12', 'utilities:react-list-container@0.1.8', 'kadira:dochead@1.4.0' ]); diff --git a/packages/nova-core/lib/components/ContextPasser.jsx b/packages/nova-core/lib/components/ContextPasser.jsx new file mode 100644 index 000000000..ba87af0e2 --- /dev/null +++ b/packages/nova-core/lib/components/ContextPasser.jsx @@ -0,0 +1,28 @@ +import React, { PropTypes, Component } from 'react'; + +class ContextPasser extends Component { + + getChildContext() { + return { + closeCallback: this.props.closeCallback, + currentUser: this.props.currentUser // pass on currentUser + }; + } + + render() { + return this.props.children; + } +} + +ContextPasser.propTypes = { + closeCallback: React.PropTypes.func, + currentUser: React.PropTypes.object +}; + +ContextPasser.childContextTypes = { + closeCallback: React.PropTypes.func, + currentUser: React.PropTypes.object +}; + +export default ContextPasser; +module.exports = ContextPasser; \ No newline at end of file diff --git a/packages/nova-core/lib/components/ModalTrigger.jsx b/packages/nova-core/lib/components/ModalTrigger.jsx index 2eff12dc7..7575faad4 100644 --- a/packages/nova-core/lib/components/ModalTrigger.jsx +++ b/packages/nova-core/lib/components/ModalTrigger.jsx @@ -1,26 +1,8 @@ import React, { PropTypes, Component } from 'react'; +import ContextPasser from './ContextPasser.jsx' import { Modal } from 'react-bootstrap'; // import Modal from 'react-modal'; -class ContextPasser extends Component { - - getChildContext() { - return { - closeCallback: this.props.closeCallback, - currentUser: this.props.currentUser // pass on currentUser - }; - } - - render() { - return this.props.children; - } -} - -ContextPasser.childContextTypes = { - closeCallback: React.PropTypes.func, - currentUser: React.PropTypes.object -}; - class ModalTrigger extends Component { constructor() { diff --git a/packages/nova-core/lib/core.js b/packages/nova-core/lib/core.js index cca5ee444..06c29dc2d 100644 --- a/packages/nova-core/lib/core.js +++ b/packages/nova-core/lib/core.js @@ -1,7 +1,8 @@ import Messages from "./messages.js"; import ModalTrigger from "./components/ModalTrigger.jsx"; +import ContextPasser from "./components/ContextPasser.jsx"; import FlashContainer from "./containers/FlashContainer.jsx"; import AppComposer from "./containers/AppComposer.jsx"; import CurrentUserContainer from "./containers/CurrentUserContainer.jsx"; -export default {Messages, ModalTrigger, AppComposer, FlashContainer, CurrentUserContainer}; \ No newline at end of file +export default {Messages, ModalTrigger, ContextPasser, AppComposer, FlashContainer, CurrentUserContainer}; \ No newline at end of file diff --git a/packages/nova-forms/package.js b/packages/nova-forms/package.js index ab9e4de61..9ae968bbe 100644 --- a/packages/nova-forms/package.js +++ b/packages/nova-forms/package.js @@ -12,7 +12,7 @@ Package.onUse(function(api) { api.use([ 'ecmascript', 'check', - 'tmeasday:check-npm-versions@0.3.0', + 'tmeasday:check-npm-versions@0.3.1', 'aldeed:simple-schema@1.5.3', 'aldeed:collection2@2.8.0', 'utilities:smart-methods@0.1.3' diff --git a/packages/nova-i18n/package.js b/packages/nova-i18n/package.js index 315a85b18..d65ff47b0 100644 --- a/packages/nova-i18n/package.js +++ b/packages/nova-i18n/package.js @@ -10,8 +10,8 @@ Package.onUse(function (api) { api.versionsFrom(['METEOR@1.0']); api.use([ - 'nova:lib@0.26.0-nova', - 'tap:i18n@1.8.0' + 'nova:lib@0.26.0-nova' + // 'tap:i18n@1.8.0' ]); api.use(["session"], "client");