diff --git a/common/router.js b/common/router.js
index e2437d33..ce3ea8e7 100644
--- a/common/router.js
+++ b/common/router.js
@@ -136,4 +136,4 @@ module.exports = class Router extends Observable {
}
return route;
}
-}
\ No newline at end of file
+}
diff --git a/docs/app.md b/docs/app.md
index c8b8c027..17689897 100644
--- a/docs/app.md
+++ b/docs/app.md
@@ -6,125 +6,104 @@
yarn add frappejs
```
-FrappeJS comes with built in rollup config for your files
+FrappeJS comes with an Express Server on the backend, VueJS for the front-end and a CLI to run these things with built-in webpack configs.
-## Build
+## Config
-There are 2 files that get built for the Desk single page application
+FrappeJS requires a file named `frappe.conf.js` to be present in the root of your directory. Minimum configuration looks like:
-- `/dist/js/bundle.js`
-- `/dist/css/style.css`
+```
+module.exports = {
+ staticPath: './static', // uploaded files are served from this directory
+ distPath: './dist', // bundled assets are built and served here
+ dev: {
+ // your client side entry files
+ entry: {
+ app: './src/main.js'
+ },
+ outputDir: './dist',
+ assetsPublicPath: '/',
+ devServerPort: 8000,
+ env: {
+ PORT: process.env.PORT || 8000
+ }
+ },
+ node: {
+ paths: {
+ main: 'server/index.js' // your server entry file
+ }
+ },
+ electron: {
+ // wip
+ }
+}
-Your `rollup.config.js` should look like:
-
-```js
-module.exports = [
- require('frappejs/config/rollup.config.style.js'),
- require('frappejs/config/rollup.config.app.js')
-]
```
-## Create a basic app
-
-### index.html
-
-The UI for the single page app (desk) will be built inside the `body` element, so you just need to have an empty body element, and link your JS bundle in `index.html`
-
-Sample index.html
+You also need an `index.html` located in the `src` directory. It can look like
```html
-
-
- Document
-
+
+
+
+ My Awesome App
-
-
+
```
-## For development setup
-Clone frappejs in the same folder as your app, since you will be developing frappejs on the side.
+### Server
-### Link frappejs
-
-```sh
-# make frappejs linkable
-cd frappejs
-
-yarn link
-yarn link frappejs
-
-# link frappejs in all
-cd ../myapp
-yarn link frappejs
-
-# install libs
-yarn
-```
-
-### server.js
-
-Create your server file `server.js`
+Assuming you have a `server/index.js` file, you can start the frappejs server in just a few lines of code.
```js
const server = require('frappejs/server');
server.start({
backend: 'sqlite',
- connection_params: {db_path: 'test.db'},
- static: './'
+ connection_params: {
+ db_path: 'test.db'
+ }
});
```
-### index.js
+### Client
-In your client file you will have to import all your controllers and init them.
+In your client file you will have to initialize `frappe` and `models`.
`frappejs/client` lib will initialize your server and user interface with the Desk.
-Example starting point for a to-do app:
+Example starting point for an app:
```js
-const client = require('frappejs/client');
-const todo = require('frappejs/models/doctype/todo/todo.js');
-// start server
-client.start({
- server: 'localhost:8000',
-}).then(() => {
- frappe.init_controller('todo', todo);
+import frappe from 'frappejs';
+import io from 'socket.io-client';
+import HTTPClient from 'frappejs/backends/http';
+import common from 'frappejs/common';
+import coreModels from 'frappejs/models';
- frappe.desk.add_sidebar_item('Home', '#');
- frappe.desk.add_sidebar_item('New ToDo', '#new/todo');
+frappe.init();
+frappe.registerLibs(common);
+frappe.registerModels(coreModels);
+
+const server = 'localhost:8000';
+frappe.fetch = window.fetch.bind();
+frappe.db = new HTTPClient({ server });
+const socket = io.connect(`http://${server}`);
+frappe.db.bindSocketClient(socket);
- frappe.router.default = '/list/todo';
- frappe.router.show(window.location.hash);
-});
```
## Start
-To start the app and build webpack simultaneously you can use a `Procfile`
+To start the server and build webpack simultaneously you can use the cli command
-```yml
-server: nodemon server.js
-watch: node_modules/.bin/rollup -c --watch
-```
-
-You can use any procfile handler like `node-foreman` to start the processes.
-
-```
-yarn global add foreman
-```
-
-Then
-
-```
-nf start
+```bash
+./node_modules/.bin/frappe start
```
diff --git a/package.json b/package.json
index 6635d115..27603255 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
"express": "^4.16.2",
"feather-icons": "^4.7.3",
"flatpickr": "^4.3.2",
- "frappe-datatable": "^1.1.2",
+ "frappe-datatable": "^1.3.1",
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^3.2.0",
"jquery": "^3.3.1",
diff --git a/server/index.js b/server/index.js
index 94ec1605..b83c3ab3 100644
--- a/server/index.js
+++ b/server/index.js
@@ -41,6 +41,7 @@ module.exports = {
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(frappe.conf.distPath));
+
app.use('/static', express.static(frappe.conf.staticPath))
app.use(morgan('tiny'));
diff --git a/test.db-journal b/test.db-journal
new file mode 100644
index 00000000..aba14275
Binary files /dev/null and b/test.db-journal differ
diff --git a/ui/components/List/List.vue b/ui/components/List/List.vue
index b844c1e2..9e99ba85 100644
--- a/ui/components/List/List.vue
+++ b/ui/components/List/List.vue
@@ -93,6 +93,7 @@ export default {
},
async deleteCheckedItems() {
await frappe.db.deleteMany(this.doctype, this.checkList);
+ this.$router.push(`/list/${this.doctype}`);
this.checkList = [];
},
toggleCheck(name) {
diff --git a/ui/components/controls/Link.vue b/ui/components/controls/Link.vue
index bcdc74df..b89ba602 100644
--- a/ui/components/controls/Link.vue
+++ b/ui/components/controls/Link.vue
@@ -101,6 +101,9 @@ export default {
},
sort() {
return (a, b) => {
+ a = a.toLowerCase();
+ b = b.toLowerCase();
+
if (a.value === '__newItem') {
return 1;
}
diff --git a/ui/pages/Report/index.vue b/ui/pages/Report/index.vue
index 35a3eb05..e921a8cf 100644
--- a/ui/pages/Report/index.vue
+++ b/ui/pages/Report/index.vue
@@ -2,7 +2,7 @@