Procházet zdrojové kódy

added feature create new workspace

Skylsmoi před 5 roky
rodič
revize
c69fa8c61f

+ 18 - 0
build_full_frontend.sh Zobrazit soubor

53
 cp i18next.scanner/fr/translation.json ../frontend/dist/app/thread_fr_translation.json
53
 cp i18next.scanner/fr/translation.json ../frontend/dist/app/thread_fr_translation.json
54
 cd -
54
 cd -
55
 
55
 
56
+# app Workspace
57
+
58
+log "cd frontend_app_workspace"
59
+cd frontend_app_workspace
60
+
61
+log "npm run build$windoz # for frontend_app_workspace"
62
+npm run build$windoz
63
+
64
+log "cp dist/workspace.app.js"
65
+cp dist/workspace.app.js ../frontend/dist/app
66
+
67
+log "cp i18next.scanner/en/translation.json ../frontend/dist/app/workspace_en_translation.json"
68
+cp i18next.scanner/en/translation.json ../frontend/dist/app/workspace_en_translation.json
69
+
70
+log "cp i18next.scanner/fr/translation.json ../frontend/dist/app/workspace_fr_translation.json"
71
+cp i18next.scanner/fr/translation.json ../frontend/dist/app/workspace_fr_translation.json
72
+cd -
73
+
56
 # app Admin Workspace User
74
 # app Admin Workspace User
57
 
75
 
58
 log "cd frontend_app_admin_workspace_user"
76
 log "cd frontend_app_admin_workspace_user"

+ 2 - 0
frontend/dist/appInterface.js Zobrazit soubor

3
 
3
 
4
   getSelectedApp = name => {
4
   getSelectedApp = name => {
5
     switch (name) {
5
     switch (name) {
6
+      case 'workspace':
7
+        return appWorkspace
6
       case 'html-document':
8
       case 'html-document':
7
         return appHtmlDocument
9
         return appHtmlDocument
8
       case 'thread':
10
       case 'thread':

+ 1 - 0
frontend/dist/index.html Zobrazit soubor

51
     <script src='/tracim.vendor.bundle.js'></script>
51
     <script src='/tracim.vendor.bundle.js'></script>
52
     <script src='/tracim.app.entry.js'></script>
52
     <script src='/tracim.app.entry.js'></script>
53
 
53
 
54
+    <script src='/app/workspace.app.js'></script>
54
     <script src='/app/html-document.app.js'></script>
55
     <script src='/app/html-document.app.js'></script>
55
     <script src='/app/thread.app.js'></script>
56
     <script src='/app/thread.app.js'></script>
56
     <!-- <script src='/app/file.app.js'></script> -->
57
     <!-- <script src='/app/file.app.js'></script> -->

+ 35 - 14
frontend/src/container/Sidebar.jsx Zobrazit soubor

3
 import { withRouter } from 'react-router'
3
 import { withRouter } from 'react-router'
4
 import classnames from 'classnames'
4
 import classnames from 'classnames'
5
 import { translate } from 'react-i18next'
5
 import { translate } from 'react-i18next'
6
+import appFactory from '../appFactory.js'
6
 import WorkspaceListItem from '../component/Sidebar/WorkspaceListItem.jsx'
7
 import WorkspaceListItem from '../component/Sidebar/WorkspaceListItem.jsx'
7
 import {
8
 import {
8
   setWorkspaceListIsOpenInSidebar,
9
   setWorkspaceListIsOpenInSidebar,
12
 import {
13
 import {
13
   getWorkspaceList
14
   getWorkspaceList
14
 } from '../action-creator.async.js'
15
 } from '../action-creator.async.js'
15
-import { PAGE } from '../helper.js'
16
+import { PAGE, workspaceConfig } from '../helper.js'
16
 
17
 
17
 const qs = require('query-string')
18
 const qs = require('query-string')
18
 
19
 
23
       sidebarClose: false,
24
       sidebarClose: false,
24
       workspaceIdInUrl: props.match.params.idws ? parseInt(props.match.params.idws) : null
25
       workspaceIdInUrl: props.match.params.idws ? parseInt(props.match.params.idws) : null
25
     }
26
     }
26
-  }
27
-
28
-  async componentDidMount () {
29
-    const { workspaceIdInUrl } = this.state
30
-    const { user, workspaceList, dispatch } = this.props
31
 
27
 
32
-    if (user.user_id !== -1 && workspaceList.length === 0) {
33
-      const fetchGetWorkspaceList = await dispatch(getWorkspaceList(user))
28
+    document.addEventListener('appCustomEvent', this.customEventReducer)
29
+  }
34
 
30
 
35
-      if (fetchGetWorkspaceList.status === 200) {
36
-        dispatch(updateWorkspaceListData(fetchGetWorkspaceList.json))
37
-        dispatch(setWorkspaceListIsOpenInSidebar(workspaceIdInUrl || fetchGetWorkspaceList.json[0].workspace_id, true))
38
-      }
31
+  customEventReducer = async ({ detail: { type, data } }) => {
32
+    switch (type) {
33
+      case 'refreshWorkspaceList':
34
+        console.log('%c<Sidebar> Custom event', 'color: #28a745', type, data)
35
+        this.loadWorkspaceList()
36
+        break
39
     }
37
     }
40
   }
38
   }
41
 
39
 
40
+  componentDidMount () {
41
+    this.loadWorkspaceList()
42
+  }
43
+
42
   componentDidUpdate (prevProps, prevState) {
44
   componentDidUpdate (prevProps, prevState) {
43
     // console.log('%c<Sidebar> Did Update', 'color: #c17838')
45
     // console.log('%c<Sidebar> Did Update', 'color: #c17838')
44
     if (this.props.match.params.idws === undefined || isNaN(this.props.match.params.idws)) return
46
     if (this.props.match.params.idws === undefined || isNaN(this.props.match.params.idws)) return
47
     if (prevState.workspaceIdInUrl !== newWorkspaceId) this.setState({workspaceIdInUrl: newWorkspaceId})
49
     if (prevState.workspaceIdInUrl !== newWorkspaceId) this.setState({workspaceIdInUrl: newWorkspaceId})
48
   }
50
   }
49
 
51
 
52
+  loadWorkspaceList = async () => {
53
+    const { workspaceIdInUrl } = this.state
54
+    const { user, dispatch } = this.props
55
+
56
+    if (user.user_id !== -1) {
57
+      const fetchGetWorkspaceList = await dispatch(getWorkspaceList(user))
58
+
59
+      if (fetchGetWorkspaceList.status === 200) {
60
+        dispatch(updateWorkspaceListData(fetchGetWorkspaceList.json))
61
+        dispatch(setWorkspaceListIsOpenInSidebar(workspaceIdInUrl || fetchGetWorkspaceList.json[0].workspace_id, true))
62
+      }
63
+    }
64
+  }
65
+
50
   handleClickWorkspace = (idWs, newIsOpenInSidebar) => this.props.dispatch(setWorkspaceListIsOpenInSidebar(idWs, newIsOpenInSidebar))
66
   handleClickWorkspace = (idWs, newIsOpenInSidebar) => this.props.dispatch(setWorkspaceListIsOpenInSidebar(idWs, newIsOpenInSidebar))
51
 
67
 
52
   handleClickAllContent = idWs => {
68
   handleClickAllContent = idWs => {
70
 
86
 
71
   handleClickToggleSidebar = () => this.setState(prev => ({sidebarClose: !prev.sidebarClose}))
87
   handleClickToggleSidebar = () => this.setState(prev => ({sidebarClose: !prev.sidebarClose}))
72
 
88
 
89
+  handleClickNewWorkspace = () => this.props.renderAppPopupCreation(workspaceConfig, this.props.user, null, null)
90
+
73
   render () {
91
   render () {
74
     const { sidebarClose, workspaceIdInUrl } = this.state
92
     const { sidebarClose, workspaceIdInUrl } = this.state
75
     const { activeLang, workspaceList, t } = this.props
93
     const { activeLang, workspaceList, t } = this.props
103
             </nav>
121
             </nav>
104
 
122
 
105
             <div className='sidebar__btnnewworkspace'>
123
             <div className='sidebar__btnnewworkspace'>
106
-              <button className='sidebar__btnnewworkspace__btn btn btn-primary primaryColorBg primaryColorBorder primaryColorBorderDarkenHover mb-5'>
124
+              <button
125
+                className='sidebar__btnnewworkspace__btn btn btn-primary primaryColorBg primaryColorBorder primaryColorBorderDarkenHover mb-5'
126
+                onClick={this.handleClickNewWorkspace}
127
+              >
107
                 {t('Create a workspace')}
128
                 {t('Create a workspace')}
108
               </button>
129
               </button>
109
             </div>
130
             </div>
130
   workspace,
151
   workspace,
131
   workspaceList
152
   workspaceList
132
 })
153
 })
133
-export default withRouter(connect(mapStateToProps)(translate()(Sidebar)))
154
+export default withRouter(connect(mapStateToProps)(appFactory(translate()(Sidebar))))

+ 15 - 0
frontend/src/container/Tracim.jsx Zobrazit soubor

28
 import Cookies from 'js-cookie'
28
 import Cookies from 'js-cookie'
29
 
29
 
30
 class Tracim extends React.Component {
30
 class Tracim extends React.Component {
31
+  constructor (props) {
32
+    super(props)
33
+
34
+    document.addEventListener('appCustomEvent', this.customEventReducer)
35
+  }
36
+
37
+  customEventReducer = async ({ detail: { type, data } }) => {
38
+    switch (type) {
39
+      case 'redirect':
40
+        console.log('%c<Tracim> Custom event', 'color: #28a745', type, data)
41
+        this.props.history.push(data.url)
42
+        break
43
+    }
44
+  }
45
+
31
   async componentDidMount () {
46
   async componentDidMount () {
32
     const { dispatch } = this.props
47
     const { dispatch } = this.props
33
 
48
 

+ 9 - 0
frontend/src/helper.js Zobrazit soubor

12
   USER_AUTH: 'user_auth'
12
   USER_AUTH: 'user_auth'
13
 }
13
 }
14
 
14
 
15
+// Côme - 2018/08/02 - shouldn't this come from api ?
16
+export const workspaceConfig = {
17
+  slug: 'workspace',
18
+  faIcon: 'space-shuttle',
19
+  hexcolor: '#7d4e24',
20
+  creationLabel: 'Create a workspace',
21
+  domContainer: 'appFeatureContainer'
22
+}
23
+
15
 export const PAGE = {
24
 export const PAGE = {
16
   HOME: '/',
25
   HOME: '/',
17
   WORKSPACE: {
26
   WORKSPACE: {

+ 2 - 3
frontend_app_workspace/src/container/PopupCreateWorkspace.jsx Zobrazit soubor

10
 
10
 
11
 const debug = { // outdated
11
 const debug = { // outdated
12
   config: {
12
   config: {
13
-    // label: 'New Document',
14
     slug: 'workspace',
13
     slug: 'workspace',
15
     faIcon: 'space-shuttle',
14
     faIcon: 'space-shuttle',
16
     hexcolor: '#7d4e24',
15
     hexcolor: '#7d4e24',
83
   handleValidate = async () => {
82
   handleValidate = async () => {
84
     const { loggedUser, config, newWorkspaceName } = this.state
83
     const { loggedUser, config, newWorkspaceName } = this.state
85
 
84
 
86
-    const fetchSaveNewWorkspace = postWorkspace(loggedUser, config.apiUrl, config.slug, newWorkspaceName)
85
+    const fetchSaveNewWorkspace = postWorkspace(loggedUser, config.apiUrl, newWorkspaceName)
87
 
86
 
88
     handleFetchResult(await fetchSaveNewWorkspace)
87
     handleFetchResult(await fetchSaveNewWorkspace)
89
       .then(resSave => {
88
       .then(resSave => {
95
           GLOBAL_dispatchEvent({
94
           GLOBAL_dispatchEvent({
96
             type: 'redirect',
95
             type: 'redirect',
97
             data: {
96
             data: {
98
-              url: `/workspaces/${resSave.json.workspace_id}`
97
+              url: `/workspaces/${resSave.body.workspace_id}/dashboard`
99
             }
98
             }
100
           })
99
           })
101
         }
100
         }

+ 1 - 1
frontend_app_workspace/webpack.config.js Zobrazit soubor

12
     path: path.resolve(__dirname, 'dist'),
12
     path: path.resolve(__dirname, 'dist'),
13
     filename: isProduction ? 'workspace.app.js' : 'workspace.app.dev.js',
13
     filename: isProduction ? 'workspace.app.js' : 'workspace.app.dev.js',
14
     pathinfo: !isProduction,
14
     pathinfo: !isProduction,
15
-    library: isProduction ? 'workspace' : undefined,
15
+    library: isProduction ? 'appWorkspace' : undefined,
16
     libraryTarget: isProduction ? 'var' : undefined
16
     libraryTarget: isProduction ? 'var' : undefined
17
   },
17
   },
18
   externals: {},
18
   externals: {},

+ 1 - 1
frontend_lib/src/component/CardPopup/CardPopupCreateContent.jsx Zobrazit soubor

27
           <input
27
           <input
28
             type='text'
28
             type='text'
29
             className='createcontent__form__input'
29
             className='createcontent__form__input'
30
-            placeHolder={props.inputPlaceholder}
30
+            placeholder={props.inputPlaceholder}
31
             value={props.contentName}
31
             value={props.contentName}
32
             onChange={props.onChangeContentName}
32
             onChange={props.onChangeContentName}
33
           />
33
           />