mirror of
https://github.com/silverstripe/silverstripe-frameworktest
synced 2024-10-22 11:06:02 +02:00
Merge pull request #22 from open-sausages/pulls/test-react
Added TestReactFormBuilder admin section
This commit is contained in:
commit
4d2eef608b
@ -10,6 +10,9 @@ indent_style = space
|
|||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[{*.js,*.jsx}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
[{*.yml,package.json}]
|
[{*.yml,package.json}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
|
2
.eslintignore
Normal file
2
.eslintignore
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
client/dist/
|
||||||
|
client/lang/
|
6
.eslintrc
Normal file
6
.eslintrc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": "airbnb",
|
||||||
|
"rules": {
|
||||||
|
"max-len": [2, 120, 4]
|
||||||
|
}
|
||||||
|
}
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
/**/*.js.map
|
14
client/dist/legacy.js
vendored
Normal file
14
client/dist/legacy.js
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
!function(t){function e(r){if(n[r])return n[r].exports
|
||||||
|
var o=n[r]={exports:{},id:r,loaded:!1}
|
||||||
|
return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={}
|
||||||
|
return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict"
|
||||||
|
n(1)},function(t,e,n){"use strict"
|
||||||
|
function r(t){return t&&t.__esModule?t:{"default":t}}var o=n(2),i=r(o),u=n(3),c=r(u),s=n(4),a=r(s),l=n(5),f=n(6),d=r(f)
|
||||||
|
i["default"].entwine("ss",function(t){t(".TestReactFormBuilder").entwine({onmatch:function e(){var t=this
|
||||||
|
setTimeout(function(){return t._renderForm()},100),this[0].style.setProperty("overflow-y","scroll","important")},onunmatch:function n(){this._clearForm(),this.css("overflow-y",!1)},open:function r(){this._renderForm()
|
||||||
|
|
||||||
|
},close:function o(){this._clearForm()},_renderForm:function i(){var t=this,e=window.ss.store,n=e.getState().config.sections.TestReactFormBuilder,r=n.form.TestEditForm.schemaUrl
|
||||||
|
a["default"].render(c["default"].createElement(l.Provider,{store:e},c["default"].createElement(d["default"],{schemaUrl:r,handleSubmit:function o(){return t._handleSubmit.apply(t,arguments)}})),this[0])
|
||||||
|
|
||||||
|
},_clearForm:function u(){a["default"].unmountComponentAtNode(this[0])},_handleSubmit:function s(t,e,n){return t.preventDefault(),n()}}),t(".TestReactFormBuilder .nav-link").entwine({onclick:function f(t){
|
||||||
|
t.preventDefault()}})})},function(t,e){t.exports=jQuery},function(t,e){t.exports=React},function(t,e){t.exports=ReactDom},function(t,e){t.exports=ReactRedux},function(t,e){t.exports=FormBuilder}])
|
1
client/src/bundles/legacy.js
Normal file
1
client/src/bundles/legacy.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
require('../legacy/TestReactFormBuilder');
|
69
client/src/legacy/TestReactFormBuilder.js
Normal file
69
client/src/legacy/TestReactFormBuilder.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import jQuery from 'jQuery';
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import { Provider } from 'react-redux';
|
||||||
|
import FormBuilder from 'components/FormBuilder/FormBuilder';
|
||||||
|
|
||||||
|
jQuery.entwine('ss', ($) => {
|
||||||
|
/**
|
||||||
|
* Kick off Test React FormBuilder admin section.
|
||||||
|
* Uses React to rebuild the list of fields from FrameworkTest's TestPages.
|
||||||
|
*/
|
||||||
|
$('.TestReactFormBuilder').entwine({
|
||||||
|
onmatch() {
|
||||||
|
setTimeout(() => this._renderForm(), 100);
|
||||||
|
// need to force scrollable .css() doesn't work with important which is needed for this case
|
||||||
|
this[0].style.setProperty('overflow-y', 'scroll', 'important');
|
||||||
|
},
|
||||||
|
|
||||||
|
onunmatch() {
|
||||||
|
this._clearForm();
|
||||||
|
this.css('overflow-y', false);
|
||||||
|
},
|
||||||
|
|
||||||
|
open() {
|
||||||
|
this._renderForm();
|
||||||
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this._clearForm();
|
||||||
|
},
|
||||||
|
|
||||||
|
_renderForm() {
|
||||||
|
const store = window.ss.store;
|
||||||
|
const sectionConfig = store.getState()
|
||||||
|
.config.sections['TestReactFormBuilder'];
|
||||||
|
const schemaUrl = sectionConfig.form.TestEditForm.schemaUrl;
|
||||||
|
|
||||||
|
ReactDOM.render(
|
||||||
|
<Provider store={store}>
|
||||||
|
<FormBuilder
|
||||||
|
schemaUrl={schemaUrl}
|
||||||
|
handleSubmit={(...args) => this._handleSubmit(...args)}
|
||||||
|
/>
|
||||||
|
</Provider>,
|
||||||
|
this[0]
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
_clearForm() {
|
||||||
|
ReactDOM.unmountComponentAtNode(this[0]);
|
||||||
|
// this.empty();
|
||||||
|
},
|
||||||
|
|
||||||
|
_handleSubmit(event, fieldValues, submitFn) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
return submitFn();
|
||||||
|
},
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.TestReactFormBuilder .nav-link').entwine({
|
||||||
|
onclick: function (e) {
|
||||||
|
// this is required because the React version of e.preventDefault() doesn't work
|
||||||
|
// this is to stop React Tabs from navigating the page
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
53
code/TestReactFormBuilder.php
Normal file
53
code/TestReactFormBuilder.php
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use SilverStripe\Admin\LeftAndMain;
|
||||||
|
use SilverStripe\View\Requirements;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
|
||||||
|
class TestReactFormBuilder extends LeftAndMain
|
||||||
|
{
|
||||||
|
private static $url_segment = 'test-react';
|
||||||
|
private static $menu_title = 'Test React FormBuilder';
|
||||||
|
|
||||||
|
public function getClientConfig()
|
||||||
|
{
|
||||||
|
$baseLink = $this->Link();
|
||||||
|
return array_merge(parent::getClientConfig(), [
|
||||||
|
'reactRouter' => false,
|
||||||
|
'form' => [
|
||||||
|
'TestEditForm' => [
|
||||||
|
'schemaUrl' => $this->Link('schema/TestEditForm'),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
public function getTestEditForm($id = null) {
|
||||||
|
/* @var $page BasicFieldsTestPage */
|
||||||
|
$page = BasicFieldsTestPage::create();
|
||||||
|
|
||||||
|
$form = Form::create($this, 'TestEditForm', $page->getCMSFields(), FieldList::create([]));
|
||||||
|
return $form;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function TestEditForm() {
|
||||||
|
return $this->getTestEditForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @todo Implement on client
|
||||||
|
*
|
||||||
|
* @param bool $unlinked
|
||||||
|
* @return ArrayList
|
||||||
|
*/
|
||||||
|
public function breadcrumbs($unlinked = false)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEditForm($id = null, $fields = null) {
|
||||||
|
Requirements::javascript('frameworktest/client/dist/legacy.js');
|
||||||
|
|
||||||
|
return Form::create($this, 'TestEditForm', FieldList::create(), FieldList::create());
|
||||||
|
}
|
||||||
|
}
|
91
package.json
Normal file
91
package.json
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
{
|
||||||
|
"name": "silverstripe-asset-admin",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "Asset management for the SilverStripe CMS",
|
||||||
|
"main": "./client/src/boot/index.js",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/open-sausages/silverstripe-asset-admin.git"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/open-sausages/silverstripe-asset-admin",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/open-sausages/silverstripe-asset-admin/issues"
|
||||||
|
},
|
||||||
|
"author": "SilverStripe Ltd",
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "webpack",
|
||||||
|
"watch": "webpack --config ./webpack-dev.config.js --watch",
|
||||||
|
"lock": "npm-shrinkwrap --dev",
|
||||||
|
"test": "NODE_PATH=\"./client/src\" jest",
|
||||||
|
"coverage": "NODE_PATH=\"./client/src\" jest --coverage",
|
||||||
|
"lint": "eslint client/src & sass-lint -v"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
|
||||||
|
"testDirectoryName": "tests",
|
||||||
|
"unmockedModulePathPatterns": [
|
||||||
|
"<rootDir>/node_modules/react"
|
||||||
|
],
|
||||||
|
"mocksPattern": "mocks",
|
||||||
|
"testPathDirs": [
|
||||||
|
"client/src"
|
||||||
|
],
|
||||||
|
"bail": true,
|
||||||
|
"testRunner": "<rootDir>/node_modules/jest-cli/src/testRunners/jasmine/jasmine2.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"react": "^15.3.1",
|
||||||
|
"react-addons-css-transition-group": "^15.3.1",
|
||||||
|
"react-bootstrap-ss": "^0.30.5",
|
||||||
|
"react-dom": "^15.3.1",
|
||||||
|
"react-redux": "^4.4.1",
|
||||||
|
"react-router": "^2.4.1",
|
||||||
|
"react-router-redux": "^4.0.5",
|
||||||
|
"redux": "https://registry.npmjs.org/redux/-/redux-3.0.5.tgz",
|
||||||
|
"redux-thunk": "^2.1.0",
|
||||||
|
"tether": "^1.3.2",
|
||||||
|
"url": "^0.11.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"autoprefixer": "^6.4.0",
|
||||||
|
"babel-core": "^6.7.4",
|
||||||
|
"babel-jest": "^9.0.3",
|
||||||
|
"babel-loader": "^6.2.5",
|
||||||
|
"babel-plugin-transform-es2015-modules-umd": "^6.6.5",
|
||||||
|
"babel-plugin-transform-object-assign": "^6.5.0",
|
||||||
|
"babel-plugin-transform-object-rest-spread": "^6.8.0",
|
||||||
|
"babel-preset-es2015": "^6.6.0",
|
||||||
|
"babel-preset-react": "^6.5.0",
|
||||||
|
"css-loader": "^0.23.1",
|
||||||
|
"eslint": "^2.5.3",
|
||||||
|
"eslint-config-airbnb": "^6.2.0",
|
||||||
|
"eslint-plugin-react": "^4.2.3",
|
||||||
|
"expose-loader": "^0.7.1",
|
||||||
|
"extract-text-webpack-plugin": "^1.0.1",
|
||||||
|
"file-loader": "^0.9.0",
|
||||||
|
"imports-loader": "^0.6.5",
|
||||||
|
"jest-cli": "^0.9.2",
|
||||||
|
"node-sass": "^3.8.0",
|
||||||
|
"npm-shrinkwrap": "^6.0.1",
|
||||||
|
"postcss-loader": "^0.10.1",
|
||||||
|
"react-addons-test-utils": "^15.3.1",
|
||||||
|
"redux-logger": "^2.6.1",
|
||||||
|
"resolve-url-loader": "^1.6.0",
|
||||||
|
"sass-lint": "^1.9.1",
|
||||||
|
"sass-loader": "^4.0.0",
|
||||||
|
"script-loader": "^0.7.0",
|
||||||
|
"semver": "^5.1.0",
|
||||||
|
"url-loader": "^0.5.7",
|
||||||
|
"webpack": "^1.13.2"
|
||||||
|
},
|
||||||
|
"babel": {
|
||||||
|
"presets": [
|
||||||
|
"react",
|
||||||
|
"es2015"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
12
webpack-dev.config.js
Normal file
12
webpack-dev.config.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const webpack = require('webpack');
|
||||||
|
const Config = require('./webpack.config');
|
||||||
|
|
||||||
|
Config.plugins = [
|
||||||
|
new webpack.ProvidePlugin({
|
||||||
|
jQuery: 'jQuery',
|
||||||
|
$: 'jQuery',
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
Config.devtool = 'source-map';
|
||||||
|
|
||||||
|
module.exports = Config;
|
113
webpack.config.js
Normal file
113
webpack.config.js
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
const webpack = require('webpack');
|
||||||
|
const autoprefixer = require('autoprefixer');
|
||||||
|
const ExtractTextPlugin = require('extract-text-webpack-plugin');
|
||||||
|
// const SprityWebpackPlugin = require('sprity-webpack-plugin');
|
||||||
|
|
||||||
|
const PATHS = {
|
||||||
|
MODULES: './node_modules',
|
||||||
|
JS_SRC: './client/src',
|
||||||
|
JS_DIST: './client/dist',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Used for autoprefixing css properties (same as Bootstrap Aplha.2 defaults)
|
||||||
|
const SUPPORTED_BROWSERS = [
|
||||||
|
'Chrome >= 35',
|
||||||
|
'Firefox >= 31',
|
||||||
|
'Edge >= 12',
|
||||||
|
'Explorer >= 9',
|
||||||
|
'iOS >= 8',
|
||||||
|
'Safari >= 8',
|
||||||
|
'Android 2.3',
|
||||||
|
'Android >= 4',
|
||||||
|
'Opera >= 12',
|
||||||
|
];
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// TODO Split out with new 'admin' module
|
||||||
|
name: 'js',
|
||||||
|
entry: {
|
||||||
|
legacy: `${PATHS.JS_SRC}/bundles/legacy.js`,
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
modulesDirectories: [PATHS.MODULES],
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
path: 'client/dist',
|
||||||
|
filename: '[name].js',
|
||||||
|
},
|
||||||
|
|
||||||
|
// lib.js provies these globals and more. These references allow the framework bundle
|
||||||
|
// to access them.
|
||||||
|
externals: {
|
||||||
|
'components/Breadcrumb/Breadcrumb': 'Breadcrumb',
|
||||||
|
'components/FormBuilderModal/FormBuilderModal': 'FormBuilderModal',
|
||||||
|
'components/FormBuilder/FormBuilder': 'FormBuilder',
|
||||||
|
'components/Toolbar/Toolbar': 'Toolbar',
|
||||||
|
'state/breadcrumbs/BreadcrumbsActions': 'BreadcrumbsActions',
|
||||||
|
'deep-freeze-strict': 'DeepFreezeStrict',
|
||||||
|
i18n: 'i18n',
|
||||||
|
jQuery: 'jQuery',
|
||||||
|
'lib/Backend': 'Backend',
|
||||||
|
'lib/Config': 'Config',
|
||||||
|
'lib/Injector': 'Injector',
|
||||||
|
'lib/ReducerRegister': 'ReducerRegister',
|
||||||
|
'lib/Router': 'Router',
|
||||||
|
'lib/ReactRouteRegister': 'ReactRouteRegister',
|
||||||
|
'lib/SilverStripeComponent': 'SilverStripeComponent',
|
||||||
|
'page.js': 'Page',
|
||||||
|
'react-addons-css-transition-group': 'ReactAddonsCssTransitionGroup',
|
||||||
|
'react-addons-test-utils': 'ReactAddonsTestUtils',
|
||||||
|
'react-dom': 'ReactDom',
|
||||||
|
'react-redux': 'ReactRedux',
|
||||||
|
'react-router-redux': 'ReactRouterRedux',
|
||||||
|
'react-router': 'ReactRouter',
|
||||||
|
react: 'React',
|
||||||
|
'redux-thunk': 'ReduxThunk',
|
||||||
|
redux: 'Redux',
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
loaders: [
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /(node_modules|thirdparty)/,
|
||||||
|
loader: 'babel',
|
||||||
|
query: {
|
||||||
|
presets: ['es2015', 'react'],
|
||||||
|
plugins: ['transform-object-assign', 'transform-object-rest-spread'],
|
||||||
|
comments: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: '/i18n.js/',
|
||||||
|
loader: 'script-loader',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new webpack.ProvidePlugin({
|
||||||
|
jQuery: 'jQuery',
|
||||||
|
$: 'jQuery',
|
||||||
|
}),
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.env':{
|
||||||
|
// Builds React in production mode, avoiding console warnings
|
||||||
|
'NODE_ENV': JSON.stringify('production')
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
|
compress: {
|
||||||
|
unused: false,
|
||||||
|
warnings: false,
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
beautify: false,
|
||||||
|
semicolons: false,
|
||||||
|
comments: false,
|
||||||
|
max_line_len: 200,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// Use WEBPACK_CHILD=js or WEBPACK_CHILD=css env var to run a single config
|
||||||
|
module.exports = config;
|
Loading…
Reference in New Issue
Block a user