From eaad5aae21d68076903415ef155c7293d1bd45bc Mon Sep 17 00:00:00 2001 From: Matthew McNaney Date: Fri, 27 Oct 2017 09:15:30 -0400 Subject: [PATCH] Adding Feature administration Still working through it. Not functional yet. --- Module.php | 1 + boost/install.php | 6 ++ class/Controller/Feature/Admin.php | 57 ++++++++++++ class/Factory/FeatureFactory.php | 64 ++++++++++++++ class/Resource/FeatureResource.php | 58 ++++++++++++ img/landscape.png | Bin 0 -> 5714 bytes img/left-right.png | Bin 0 -> 5691 bytes img/sample.jpg | Bin 0 -> 42216 bytes img/top-bottom.png | Bin 0 -> 5710 bytes javascript/Feature/DisplayColumn.js | 38 ++++++++ javascript/Feature/Feature.jsx | 126 +++++++++++++++++++++++++++ javascript/Feature/FeatureDisplay.js | 52 +++++++++++ javascript/Feature/FeatureForm.js | 110 +++++++++++++++++++++++ javascript/Feature/FeatureList.js | 39 +++++++++ javascript/Feature/FeatureObj.js | 11 +++ javascript/Feature/index.jsx | 6 ++ javascript/Feature/style.css | 17 ++++ templates/Feature/Landscape.html | 4 +- 18 files changed, 587 insertions(+), 2 deletions(-) create mode 100644 class/Controller/Feature/Admin.php create mode 100644 class/Factory/FeatureFactory.php create mode 100644 class/Resource/FeatureResource.php create mode 100644 img/landscape.png create mode 100644 img/left-right.png create mode 100644 img/sample.jpg create mode 100644 img/top-bottom.png create mode 100644 javascript/Feature/DisplayColumn.js create mode 100644 javascript/Feature/Feature.jsx create mode 100644 javascript/Feature/FeatureDisplay.js create mode 100644 javascript/Feature/FeatureForm.js create mode 100644 javascript/Feature/FeatureList.js create mode 100644 javascript/Feature/FeatureObj.js create mode 100644 javascript/Feature/index.jsx create mode 100644 javascript/Feature/style.css diff --git a/Module.php b/Module.php index 6d08fb0..4abbdd9 100644 --- a/Module.php +++ b/Module.php @@ -89,6 +89,7 @@ public function runTime(Request $request) { if (\Current_User::allow('stories')) { \stories\Factory\StoryMenu::addStoryLink(); + \stories\Factory\StoryMenu::featureLink(); \stories\Factory\StoryMenu::listStoryLink(); \stories\Factory\StoryMenu::adminDisplayLink(); } diff --git a/boost/install.php b/boost/install.php index f8164ba..5069201 100644 --- a/boost/install.php +++ b/boost/install.php @@ -31,6 +31,10 @@ function stories_install(&$content) $author = new \stories\Resource\AuthorResource; $author->createTable($db); $db->clearTables(); + + $feature = new \stories\Resource\FeatureResource; + $feature->createTable($db); + $db->clearTables(); $tag = new \stories\Resource\TagResource; $tag->createTable($db); @@ -41,6 +45,8 @@ function stories_install(&$content) $tagToEntry->addDataType('tagId', 'int'); $tagToEntry->create(); + + } catch (\Exception $e) { \phpws2\Error::log($e); $db->rollback(); diff --git a/class/Controller/Feature/Admin.php b/class/Controller/Feature/Admin.php new file mode 100644 index 0000000..81d88d8 --- /dev/null +++ b/class/Controller/Feature/Admin.php @@ -0,0 +1,57 @@ +. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +namespace stories\Controller\Feature; + +use Canopy\Request; +use stories\Factory\FeatureFactory as Factory; +use stories\Factory\StoryMenu; +use stories\Controller\RoleController; + +class Admin extends RoleController +{ + + /** + * @var \stories\Factory\FeatureFactory factory + */ + protected $factory; + + protected function loadFactory() { + $this->factory = new Factory; + } + + protected function listHtmlCommand(Request $request) + { + $this->factory->addStoryCss(); + return $this->factory->scriptView('Feature', true, array('srcHttp'=>PHPWS_SOURCE_HTTP)); + } + + protected function listJsonCommand(Request $request) + { + return $this->factory->listing($request); + } + + protected function postCommand(Request $request) + { + return array('featureId'=>$this->factory->post($request)); + } + +} diff --git a/class/Factory/FeatureFactory.php b/class/Factory/FeatureFactory.php new file mode 100644 index 0000000..9f49b79 --- /dev/null +++ b/class/Factory/FeatureFactory.php @@ -0,0 +1,64 @@ +. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +namespace stories\Factory; + +use stories\Resource\FeatureResource as Resource; +use phpws2\Database; +use phpws2\Settings; +use Canopy\Request; +use phpws2\Template; + +/** + * Description of FeatureFactory + * + * @author Matthew McNaney + */ +class FeatureFactory extends BaseFactory +{ + + public function build() + { + return new Resource; + } + + public function post(Request $request) + { + $db = Database::getDB(); + $feature = $this->build(); + self::saveResource($feature); + return $feature->id; + } + + public function listing(Request $request) + { + $db = Database::getDB(); + $tbl = $db->addTable('storiesFeature'); + $tbl->addOrderBy('sorting'); + return $db->select(); + } + +} diff --git a/class/Resource/FeatureResource.php b/class/Resource/FeatureResource.php new file mode 100644 index 0000000..9f2d00c --- /dev/null +++ b/class/Resource/FeatureResource.php @@ -0,0 +1,58 @@ +. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +namespace stories\Resource; + +/** + * Description of Feature + * + * @author Matthew McNaney + */ +class FeatureResource extends BaseResource +{ + protected $title; + protected $active; + protected $entries; + protected $format; + protected $columns; + protected $sorting; + + protected $table = 'storiesFeature'; + + public function __construct() + { + parent::__construct(); + $this->title = new \phpws2\Variable\TextOnly(null, 'title'); + $this->title->setLimit(255); + $this->title->allowNull(true); + $this->format = new \phpws2\Variable\Attribute('landscape', 'format'); + $this->format->setLimit(20); + $this->active = new \phpws2\Variable\BooleanVar(true, 'active'); + $this->entries = new \phpws2\Variable\ArrayVar(null, 'entries'); + $this->columns = new \phpws2\Variable\SmallInteger(2, 'columns'); + $this->sorting = new \phpws2\Variable\SmallInteger(0, 'sorting'); + } +} diff --git a/img/landscape.png b/img/landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..64ca6f6f8e7fb4c3d58025265bffe827fff7ebbc GIT binary patch literal 5714 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

N)m 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 z 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 @I^2;lW-y_^y=Q#Bw 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 { + const _class = 'story-feature ' + format + const thumbnailStyle = { + backgroundImage: `url('${entry.thumbnail}')`, + backgroundPosition: '50% 50%' + } + return ( +

+
+
+
+ +
{entry.strippedSummary}
+
Published {entry.publishDateRelative} +
+
+
+
+ ) +} + +DisplayColumn.propTypes = { + bsClass: PropTypes.string, + format: PropTypes.string, + entry: PropTypes.object +} + +DisplayColumn.defaultTypes = {} + +export default DisplayColumn diff --git a/javascript/Feature/Feature.jsx b/javascript/Feature/Feature.jsx new file mode 100644 index 0000000..963d18b --- /dev/null +++ b/javascript/Feature/Feature.jsx @@ -0,0 +1,126 @@ +'use strict' +import React, {Component} from 'react' +import PropTypes from 'prop-types' +import FeatureObj from './FeatureObj' +import FeatureList from './FeatureList' +import FeatureForm from './FeatureForm' +import Message from '../AddOn/Message' +import Waiting from '../AddOn/Waiting' + +/* global $ */ + +export default class Feature extends Component { + constructor(props) { + super(props) + this.state = { + message: null, + currentFeature: null, + currentKey: null, + featureList: [], + loading: true, + } + this.addRow = this.addRow.bind(this) + this.closeMessage = this.closeMessage.bind(this) + this.updateFeature = this.updateFeature.bind(this) + this.loadCurrentFeature = this.loadCurrentFeature.bind(this) + } + + componentDidMount() { + this.load() + } + + load() { + $.ajax({ + url: './stories/Feature', + dataType: 'json', + type: 'get', + success: function (data) { + const featureList = data + this.setState({featureList: featureList, loading: false}) + }.bind(this), + error: function () { + this.setState({ + loading: false, + message: { + text: 'Error: Could not pull feature list', + type: 'danger' + } + }) + }.bind(this) + }) + } + + loadCurrentFeature(key) { + const feature = this.state.featureList[key] + if (feature.entries === 'null') { + feature.entries = [] + } + + if (feature.title === null) { + feature.title = '' + } + this.setState({currentFeature: feature, currentKey: key,}) + } + + addRow() { + $.ajax({ + url: './stories/Feature', + dataType: 'json', + type: 'post', + success: function (data) { + const feature = FeatureObj + feature.id = data.featureId + /* + const featureList = this.state.featureList + featureList.push(feature) + */ + this.setState({currentFeature: FeatureObj, currentKey: data.featureId,}) + }.bind(this), + error: function () {}.bind(this), + }) + } + + updateFeature(feature) { + this.setState({currentFeature: feature}) + } + + closeMessage() { + this.setState({message: null}) + } + + message() { + if (this.state.message !== null) { + const {message} = this.state + return {message.text} + } + } + + getListing() { + if (this.state.loading === true) { + return + } else if (this.state.currentKey !== null) { + return + } else { + return + } + } + + render() { + return ( +
+ {this.message()} + + {this.getListing()} +
+ ) + } +} + +Feature.propTypes = { + srcHttp: PropTypes.string +} diff --git a/javascript/Feature/FeatureDisplay.js b/javascript/Feature/FeatureDisplay.js new file mode 100644 index 0000000..8b6c89e --- /dev/null +++ b/javascript/Feature/FeatureDisplay.js @@ -0,0 +1,52 @@ +'use strict' +import React from 'react' +import PropTypes from 'prop-types' +import DisplayColumn from './DisplayColumn' + +const FeatureDisplay = (props) => { + const {feature} = props + const columns = parseInt(feature.columns) + let bsClass + + switch (columns) { + case 2: + bsClass = 'col-sm-6' + break + case 3: + bsClass = 'col-sm-4' + break + case 4: + bsClass = 'col-sm-3' + break + } + + let columnContent = [] + for (let i = 0; i < columns; i++) { + //columnContent.push(
columns!
) + let entry = { + id: 0, + title: 'Example title', + strippedSummary: 'Example summary', + publishDateRelative: 'today', + thumbnail: 'mod/stories/img/sample.jpg', + } + if (feature.entries[i] !== undefined) { + entry = feature.entries[i] + } + columnContent.push() + } + + return ( +
+ {columnContent} +
+ ) +} + +FeatureDisplay.propTypes = { + feature: PropTypes.object +} + +FeatureDisplay.defaultTypes = {} + +export default FeatureDisplay diff --git a/javascript/Feature/FeatureForm.js b/javascript/Feature/FeatureForm.js new file mode 100644 index 0000000..d3aa7c5 --- /dev/null +++ b/javascript/Feature/FeatureForm.js @@ -0,0 +1,110 @@ +'use strict' +import React from 'react' +import PropTypes from 'prop-types' +import ButtonGroup from '../AddOn/ButtonGroup' +import FeatureDisplay from './FeatureDisplay' +import './style.css' + +const FeatureForm = (props) => { + + const setColumns = (columns) => { + const feature = props.feature + feature.columns = columns + props.update(feature) + } + + const setTitle = (e) => { + const feature = props.feature + feature.title = e.target.value + props.update(feature) + } + + const setFormat = (format) => { + const feature = props.feature + feature.format = format + props.update(feature) + } + + const columnButtons = [ + { + value: '2', + label: '2', + }, { + value: '3', + label: '3', + }, { + value: '4', + label: '4', + }, + ] + + const isActive = (format) => { + return props.feature.format === format + ? 'btn btn-default active' + : 'btn btn-default' + } + + const formatTopBottom = props.srcHttp + 'mod/stories/img/top-bottom.png' + const formatLandscape = props.srcHttp + 'mod/stories/img/landscape.png' + const formatLeftRight = props.srcHttp + 'mod/stories/img/left-right.png' + + + return ( +
+
+
+ +
+
+
+ + +
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+ +
+
+ ) +} + +FeatureForm.propTypes = { + feature: PropTypes.object, + update: PropTypes.func, + srcHttp: PropTypes.string +} + +FeatureForm.defaultTypes = {} + +export default FeatureForm diff --git a/javascript/Feature/FeatureList.js b/javascript/Feature/FeatureList.js new file mode 100644 index 0000000..af7b79a --- /dev/null +++ b/javascript/Feature/FeatureList.js @@ -0,0 +1,39 @@ +'use strict' +import React from 'react' +import PropTypes from 'prop-types' + +const FeatureList = (props) => { + if (props.list === undefined) { + return
No features found. Add a feature row to get started.
+ } + + let rows = props.list.map(function (value, key) { + return ( + + + {value.id} + {value.active} + {value.title} + {value.columns} + + ) + }) + return ( +
+ + + {rows} + +
+
+ ) +} + +FeatureList.propTypes = { + list: PropTypes.array, + loadCurrentFeature: PropTypes.func, +} + +FeatureList.defaultTypes = {} + +export default FeatureList diff --git a/javascript/Feature/FeatureObj.js b/javascript/Feature/FeatureObj.js new file mode 100644 index 0000000..335f1c9 --- /dev/null +++ b/javascript/Feature/FeatureObj.js @@ -0,0 +1,11 @@ +const FeatureObj = { + id : 0, + title: '', + active: 1, + format: 'landscape', + entries: [], + columns: '3', + sorting: '0', +} + +export default FeatureObj diff --git a/javascript/Feature/index.jsx b/javascript/Feature/index.jsx new file mode 100644 index 0000000..9e66fec --- /dev/null +++ b/javascript/Feature/index.jsx @@ -0,0 +1,6 @@ +'use strict' +import React from 'react' +import ReactDOM from 'react-dom' +import Feature from './Feature.jsx' +/* global srcHttp */ +ReactDOM.render(, document.getElementById('Feature')) diff --git a/javascript/Feature/style.css b/javascript/Feature/style.css new file mode 100644 index 0000000..605c139 --- /dev/null +++ b/javascript/Feature/style.css @@ -0,0 +1,17 @@ +ul.format-selection { + list-style-type: none; + margin : 0px; + padding : 0px; +} + +ul.format-selection li { + position: relative; + display: block; + float: left; + text-align : center; + margin-right : 1em; +} + +ul.format-selection li img { + height : 40px; +} diff --git a/templates/Feature/Landscape.html b/templates/Feature/Landscape.html index d6a55b3..a94204f 100644 --- a/templates/Feature/Landscape.html +++ b/templates/Feature/Landscape.html @@ -1,6 +1,6 @@ -
+
-
 
+