Commit 92406c66 authored by nano's avatar nano

complete

parent 4f79c3bb
......@@ -2,21 +2,11 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="7dc474d0-9fc0-4b76-8c2f-3c98df702116" name="Default" comment="">
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/Example.js" afterPath="" />
<change type="MOVED" beforePath="$PROJECT_DIR$/.roadhogrc" afterPath="$PROJECT_DIR$/.roadhogrc.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.eslintrc" afterPath="$PROJECT_DIR$/.eslintrc" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/package.json" afterPath="$PROJECT_DIR$/package.json" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/public/index.html" afterPath="$PROJECT_DIR$/public/index.html" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/components/App/Create.js" afterPath="$PROJECT_DIR$/src/components/App/Create.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/components/Common/Nav.js" afterPath="$PROJECT_DIR$/src/components/Common/Nav.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/index.js" afterPath="$PROJECT_DIR$/src/index.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/models/App.js" afterPath="$PROJECT_DIR$/src/models/App.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/models/Apps.js" afterPath="$PROJECT_DIR$/src/models/Apps.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/router.js" afterPath="$PROJECT_DIR$/src/router.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/routes/AppDetail.js" afterPath="$PROJECT_DIR$/src/routes/AppDetail.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/routes/AppDetail.less" afterPath="$PROJECT_DIR$/src/routes/AppDetail.less" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/routes/Entry.js" afterPath="$PROJECT_DIR$/src/routes/Entry.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/utils/request.js" afterPath="$PROJECT_DIR$/src/utils/request.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/Packages.js" afterPath="$PROJECT_DIR$/src/services/Packages.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/yarn.lock" afterPath="$PROJECT_DIR$/yarn.lock" />
</list>
<ignored path="$PROJECT_DIR$/.tmp/" />
......@@ -35,11 +25,21 @@
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="Packages.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/services/Packages.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="271">
<caret line="26" column="32" lean-forward="false" selection-start-line="26" selection-start-column="32" selection-end-line="26" selection-end-column="32" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="AppDetail.js" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/routes/AppDetail.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="798">
<caret line="701" column="40" lean-forward="false" selection-start-line="701" selection-start-column="40" selection-end-line="701" selection-end-column="40" />
<state relative-caret-position="223">
<caret line="849" column="37" lean-forward="true" selection-start-line="849" selection-start-column="37" selection-end-line="849" selection-end-column="37" />
<folding>
<element signature="e#0#26#0" expanded="true" />
</folding>
......@@ -51,32 +51,36 @@
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>for</find>
<find>f</find>
<find>.update({ $set: { ...data }}).exec()</find>
<find>fo</find>
<find>format</find>
<find>formatm</find>
<find>formatme</find>
<find>cate</find>
<find>category</find>
<find>news</find>
<find>s</find>
<find>spin</find>
<find>&lt;</find>
<find>&lt;Sp</find>
<find>&lt;Spin</find>
<find>i</find>
<find>isMoun</find>
<find>isMounte</find>
<find>isMounted</find>
<find>isdanger</find>
<find>remove</find>
<find>width=&quot;100%&quot; height=&quot;100%&quot;</find>
<find>radio</find>
<find>console</find>
<find>pack</find>
<find>upload</find>
<find>message</find>
<find>success</find>
<find>uploading</find>
<find>fetch</find>
<find>0</find>
<find>0.0.1</find>
<find>packages</find>
<find>add</find>
<find>pack.state</find>
<find>addpack</find>
<find>onadd</find>
<find>onAddPackage</find>
<find>didmont</find>
<find>保存</find>
<find>remove</find>
<find>发布</find>
<find>fa</find>
<find>上传</find>
<find>urlUpload</find>
<find>url</find>
<find>disable</find>
</findStrings>
</component>
<component name="Git.Settings">
......@@ -98,6 +102,8 @@
<option value="$PROJECT_DIR$/src/routes/Entry.js" />
<option value="$PROJECT_DIR$/src/models/Apps.js" />
<option value="$PROJECT_DIR$/src/routes/AppDetail.less" />
<option value="$PROJECT_DIR$/src/services/Packages.js" />
<option value="$PROJECT_DIR$/src/models/packages.js" />
<option value="$PROJECT_DIR$/src/routes/AppDetail.js" />
</list>
</option>
......@@ -114,8 +120,8 @@
<handled-path value="$PROJECT_DIR$/node_modules" />
</component>
<component name="ProjectFrameBounds">
<option name="x" value="235" />
<option name="y" value="58" />
<option name="x" value="296" />
<option name="y" value="23" />
<option name="width" value="1383" />
<option name="height" value="968" />
</component>
......@@ -162,6 +168,60 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="moecube-console-web" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="moecube-console-web" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="services" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="moecube-console-web" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="moecube-console-web" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="routes" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="moecube-console-web" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="moecube-console-web" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="models" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
</panes>
......@@ -265,15 +325,15 @@
<option name="presentableId" value="Default" />
<updated>1492397512644</updated>
<workItem from="1492397516564" duration="4541000" />
<workItem from="1492407287300" duration="13890000" />
<workItem from="1492407287300" duration="47582000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="18431000" />
<option name="totallyTimeSpent" value="52123000" />
</component>
<component name="ToolWindowManager">
<frame x="235" y="58" width="1383" height="968" extended-state="0" />
<frame x="296" y="23" width="1383" height="968" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
......@@ -283,7 +343,7 @@
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="npm" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32966226" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32990867" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33333334" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.33333334" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="TypeScript" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2572707" sideWeight="0.49315068" order="0" side_tool="false" content_ui="combo" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.24981357" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
......@@ -312,6 +372,10 @@
<option value="$PROJECT_DIR$/../moecube-console-backend/src/routes/upload.js" />
<option value="$PROJECT_DIR$/../moecube-console-backend/src/utils.js.map" />
<option value="$PROJECT_DIR$/../moecube-console-backend/src/utils.js" />
<option value="$PROJECT_DIR$/../moecube-console/package/utils.js.map" />
<option value="$PROJECT_DIR$/../moecube-console/package/main.js.map" />
<option value="$PROJECT_DIR$/../moecube-console/package/utils.js" />
<option value="$PROJECT_DIR$/../moecube-console/package/main.js" />
</list>
</option>
</component>
......@@ -323,16 +387,6 @@
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="162">
<caret line="14" column="3" lean-forward="false" selection-start-line="14" selection-start-column="3" selection-end-line="14" selection-end-column="3" />
<folding>
<element signature="e#0#33#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
......@@ -421,6 +475,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
......@@ -428,6 +483,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
......@@ -435,6 +491,9 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#26#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
......@@ -442,20 +501,9 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/Common.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="5" column="18" lean-forward="true" selection-start-line="5" selection-start-column="18" selection-end-line="5" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/user.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#26#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
......@@ -583,14 +631,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/router.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="108">
<caret line="12" column="41" lean-forward="true" selection-start-line="12" selection-start-column="41" selection-end-line="12" selection-end-column="41" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/utils/request.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
......@@ -609,16 +649,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/App.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
<caret line="14" column="14" lean-forward="true" selection-start-line="14" selection-start-column="14" selection-end-line="14" selection-end-column="14" />
<folding>
<element signature="e#0#39#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/dist/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="18">
......@@ -635,14 +665,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/Apps.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="593">
<caret line="54" column="38" lean-forward="true" selection-start-line="54" selection-start-column="38" selection-end-line="54" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/routes/Entry.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="270">
......@@ -685,10 +707,108 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/router.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="108">
<caret line="12" column="41" lean-forward="false" selection-start-line="12" selection-start-column="41" selection-end-line="12" selection-end-column="41" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/services/example.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/dva/dist/dva.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="7595" column="11" lean-forward="false" selection-start-line="7595" selection-start-column="11" selection-end-line="7595" selection-end-column="11" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yarn.lock">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="186">
<caret line="1065" column="16" lean-forward="false" selection-start-line="1065" selection-start-column="16" selection-end-line="1065" selection-end-column="16" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/App.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-539">
<caret line="14" column="14" lean-forward="true" selection-start-line="14" selection-start-column="14" selection-end-line="14" selection-end-column="14" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/services/Apps.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="38" lean-forward="true" selection-start-line="0" selection-start-column="38" selection-end-line="0" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/Apps.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-190">
<caret line="21" column="0" lean-forward="true" selection-start-line="21" selection-start-column="0" selection-end-line="21" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/example.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="378">
<caret line="21" column="6" lean-forward="true" selection-start-line="21" selection-start-column="6" selection-end-line="21" selection-end-column="6" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/Common.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="5" column="18" lean-forward="true" selection-start-line="5" selection-start-column="18" selection-end-line="5" selection-end-column="18" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/packages.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="282">
<caret line="56" column="11" lean-forward="true" selection-start-line="56" selection-start-column="11" selection-end-line="56" selection-end-column="11" />
<folding>
<element signature="e#0#70#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/models/user.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/services/Packages.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="271">
<caret line="26" column="32" lean-forward="false" selection-start-line="26" selection-start-column="32" selection-end-line="26" selection-end-column="32" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/routes/AppDetail.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="798">
<caret line="701" column="40" lean-forward="false" selection-start-line="701" selection-start-column="40" selection-end-line="701" selection-end-column="40" />
<state relative-caret-position="223">
<caret line="849" column="37" lean-forward="true" selection-start-line="849" selection-start-column="37" selection-end-line="849" selection-end-column="37" />
<folding>
<element signature="e#0#26#0" expanded="true" />
</folding>
......
......@@ -16,6 +16,8 @@ const app = dva({
app.model(require("./models/Apps"));
app.model(require("./models/packages"));
app.model(require("./models/user"));
// app.model(require("./models/packages"));
......
import {fetch, add, del, patch, urlUpload} from '../services/Packages'
import {message} from 'antd'
export default {
namespace: 'packages',
state: {
packages: {},
},
reducers: {
fetchSuccess(state, action) {
return {
...state,
...action.payload
}
},
success(state, action) {
return {
...state,
...action.payload
}
},
},
effects: {
*fetch({payload}, {call, put}) {
try {
const {data} = yield call(fetch, payload)
yield put({ type: 'fetchSuccess', payload: {packages: data}})
} catch (e) {
message.error(e.message)
}
},
*add({payload}, {call, put}) {
try {
const {data} = yield call(add, payload)
yield put({ type: 'success', payload: {packages: data}, appId: payload.appId})
} catch (e) {
message.error(e.message)
}
},
*patch({payload}, {call, put}) {
try {
const {data} = yield call(patch, payload)
yield put({ type: 'success', payload: {packages: data}, appId: payload.appId})
} catch (e) {
message.error(e.message)
}
},
*delete({payload}, {call, put}) {
try {
const {data} = yield call(del, payload)
yield put({ type: 'success', payload: {packages: data}, appId: payload.appId})
} catch (e) {
message.error(e.message)
}
},
*urlUpload({payload}, {call, put}) {
try {
const {data} = yield call(urlUpload, payload)
yield put({ type: 'success', payload: {packages: data}, appId: payload.appId})
} catch (e) {
message.error(e.message)
}
},
*success({appId}, {call, put}) {
yield put({ type: 'fetch', payload: { appId }})
}
},
subscriptions: {},
};
......@@ -2,6 +2,7 @@ import React from 'react';
import {connect} from 'dva';
import styles from './AppDetail.less';
import config from '../config'
import vercomp from 'vercomp'
import uuid from 'uuid'
import {
Form,
......@@ -16,6 +17,9 @@ import {
Upload,
Modal,
Table,
Badge,
Alert,
message,
Popconfirm,
Row,
Col,
......@@ -30,6 +34,11 @@ const TabPane = Tabs.TabPane;
const Dragger = Upload.Dragger;
const confirm = Modal.confirm
const statusMap = {
'failed': 'error',
'uploading': 'processing'
}
const defCategory = ["game", "runtime", "emulator", "module"]
const defLocales = ["zh-CN", "zh-TW", "en-US", "ja-JP"]
const defPlatform = ["win32", "darwin"]
......@@ -47,11 +56,7 @@ defLocales.forEach(locale => {
const defPackage = () => {
return {
id: uuid.v1(),
name: '',
version: '',
platforms: [],
locales: [],
isNew: true
status: 'new'
}
}
......@@ -66,17 +71,7 @@ const uploadProps = {
name: 'file',
multiple: false,
showUploadList: false,
onChange(info) {
const status = info.file.status;
if (status !== 'uploading') {
console.log(info.file, info.fileList);
}
if (status === 'done') {
// message.success(`${info.file.name} file uploaded successfully.`);
} else if (status === 'error') {
// message.error(`${info.file.name} file upload failed.`);
}
},
}
......@@ -95,12 +90,26 @@ class AppDetail extends React.Component {
packages: [],
};
componentDidMount() {
this.props.dispatch({ type: 'packages/fetch', payload: {appId: this.props.params.id}})
}
componentWillReceiveProps(nextProps) {
const {App: {developers, publishers, news, packages = []}} = nextProps
const {App: {developers, publishers, news}, packages } = nextProps
// this.setState({
// developers: {...defDevelopers, ...developers},
// publishers: {...defPublishers, ...publishers},
// packages: [...defPackages, ...packages],
// news: {...defNews, ...news},
// })
if(this.state.packages.length !== packages) {
this.setState({
packages
})
}
this.setState({
developers: {...defDevelopers, ...developers},
publishers: {...defPublishers, ...publishers},
packages: [...defPackages, ...packages],
news: {...defNews, ...news},
})
}
......@@ -136,6 +145,7 @@ class AppDetail extends React.Component {
}
}
onSubmitBase = (e) => {
const {form, dispatch, params: {id}} = this.props
......@@ -194,39 +204,106 @@ class AppDetail extends React.Component {
console.log('Received values of form: ', values);
let {upload: {packages}} = values
const pack = packages.find(el => el.id == _pack.id)
dispatch({type: "Apps/updatePackage", payload: {id, package: pack}})
dispatch({type: "Apps/update", payload: {id, packages}})
}
});
}
onAddPackage = (e) => {
onAddPackage = (e, pack) => {
const {form, dispatch, params: {id}} = this.props
e && e.preventDefault();
form.validateFieldsAndScroll((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
//
let {upload: {packages}} = values
const _package = packages.find(p => p.id == pack.id)
dispatch({type: "packages/add", payload: {appId: id, ..._package}})
}
});
}
onPatchPackage = (e, pack) => {
const {form, dispatch, params: {id}} = this.props
e && e.preventDefault();
form.validateFieldsAndScroll((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
//
let {upload: {packages}} = values
const _package = packages.find(p => p.id == pack.id)
dispatch({type: "packages/patch", payload: {appId: id, ..._package}})
}
});
}
onNewPackageVersion = (e, pack) => {
const {form, dispatch, params: {id}} = this.props
dispatch({type: "Apps/addPackage", payload: {id, packages}})
e && e.preventDefault();
form.validateFieldsAndScroll((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
//
let {upload: {packages}} = values
const _package = packages.find(p => p.id == pack.id)
dispatch({type: "packages/add", payload: {appId: id, ..._package}})
}
});
}
onDeletePackage = (_id) => {
handleUrlUpload = (e, pack) => {
const {form, dispatch, params: {id}} = this.props
e && e.preventDefault();
form.validateFieldsAndScroll((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
let {upload: {packages}} = values
packages.splice(_id, 1)
const _package = packages.find(p => p.id == pack.id)
dispatch({type: "Apps/update", payload: {id, packages}})
dispatch({type: "packages/urlUpload", payload: {appId: id, ..._package}})
}
});
}
// onUpdatePackage = (e) => {
// const {form, dispatch, params: {id}} = this.props
//
// e && e.preventDefault();
// form.validateFieldsAndScroll((err, values) => {
// if (!err) {
// console.log('Received values of form: ', values);
//
// // let {upload: {packages}} = values
// let {packages} = this.state
//
//
// dispatch({type: "Apps/updatePackage", payload: {id, packages}})
// }
// });
// }
onDeletePackage = (pack) => {
const {form, dispatch, params: {id}} = this.props
form.validateFieldsAndScroll((err, values) => {
if (!err) {
let {upload: {packages}} = values
const _package = packages.find(p => p.id == pack.id)
dispatch({type: "packages/delete", payload: {appId:id, ..._package}})
}
});
}
......@@ -246,7 +323,7 @@ class AppDetail extends React.Component {
})
// this.onSubmitUpload()
this.onAddPackage()
// this.onAddPackage()
}
remove = async (targetKey) => {
......@@ -255,13 +332,17 @@ class AppDetail extends React.Component {
content: '你真的确定要删除嘛?',
onOk: async () => {
let {packages} = this.state
let _package = packages[targetKey]
if(_package._id) {
this.onDeletePackage(_package)
}
packages.splice(targetKey, 1)
await this.setState({
this.setState({
packages
})
return this.onDeletePackage(targetKey)
},
})
}
......@@ -287,12 +368,11 @@ class AppDetail extends React.Component {
}
render() {
const {form, App, loading} = this.props
const {form, App, loading, dispatch} = this.props
const {getFieldDecorator} = form
const {id, author, homepage, references = {}, dependencies = {}, description = {}, actions = {}, version = {}, name = {}, category, tags = [], locales = [], conference, icon, cover, background,} = App
const {publishers, developers, previewVisible, previewImage, iconList, coverList, backgroundList, isCreateNews, news, packages} = this.state
return (
<Spin spinning={loading.global}>
<Tabs defaultActiveKey="1" className="app-detail-nav">
......@@ -682,6 +762,24 @@ class AppDetail extends React.Component {
)}
</FormItem>
<FormItem {...formItemLayout} help="id" style={{display: "none"}}>
{getFieldDecorator(`upload["packages"][${i}]["status"]`, {
initialValue: pack["status"]
})(
<Input addonBefore={<Icon type="info-circle-o"/>} placeholder="status" disabled/>
)}
</FormItem>
{ pack["status"] !== 'uploaded' &&
<FormItem {...formItemLayout} help="id" style={{display: "none"}}>
{getFieldDecorator(`upload["packages"][${i}]["_id"]`, {
initialValue: pack["_id"]
})(
<Input addonBefore={<Icon type="info-circle-o"/>} placeholder="_id" disabled/>
)}
</FormItem>
}
<FormItem {...formItemLayout} help="name">
{getFieldDecorator(`upload["packages"][${i}]["name"]`, {
initialValue: pack["name"]
......@@ -694,7 +792,8 @@ class AppDetail extends React.Component {
{getFieldDecorator(`upload["packages"][${i}]["version"]`, {
initialValue: pack["version"]
})(
<Input addonBefore={<Icon type="info-circle-o"/>} placeholder="版本号"/>
<Input addonBefore={<Icon type="info-circle-o"/>} placeholder="版本号"
disabled={pack.status !== 'new' && pack.status !== 'init' && pack.status !== 'failed'}/>
)}
</FormItem>
......@@ -722,42 +821,97 @@ class AppDetail extends React.Component {
)}
</FormItem>
<FormItem {...formItemLayout}>
<FormItem {...formItemLayout} >
<div className={styles.wrapSubmit}>
{
pack.status == 'uploaded' && <Button type="primary" onClick={(e) => this.onNewPackageVersion(e, pack)} size="large">发布新版本</Button>
}
{
pack.status == 'uploading' && <Button type="primary" size="large" disabled>上传中...</Button>
}
{
pack.status == 'init' && <Button type="primary" onClick={(e) => this.onPatchPackage(e, pack)} size="large">保存</Button>
}
{
pack.status == 'new' && <Button type="primary" onClick={(e) => this.onAddPackage(e, pack)} size="large">提交</Button>
}
</div>
</FormItem>
{
pack.status == 'uploaded' &&
<Card title="详细信息">
<p>_id: {pack._id}</p>
<p>id: {pack.id}</p>
<p>name: {pack.name}</p>
<p>version: {pack.version}</p>
<p>locales: {pack.locales.map((locale, i) => {
return <span key={i} style={{padding: "0 2px"}}>{locale}</span>
})}</p>
<p>platforms: {pack.platforms.map((platform,i) => {
return <span key={i} style={{padding: "0 2px"}}>{platform}</span>
})}</p>
<p>files: {pack.files.length}</p>
</Card>
}
{pack.status !== 'uploaded' &&<FormItem {...formItemLayout}>
{getFieldDecorator(`upload["packages"][${i}]["upload"]`, {})(
<Tabs defaultActiveKey="1" size="small">
<TabPane tab="url上传" key="1">
{getFieldDecorator(`upload["packages"][${i}]["url"]`, {
// initialValue: pack["url"]
})(
<div>
<Input addonBefore={<Icon type="uplaad"/>} placeholder="url"/>
请确认输入的链接真实有效~
<div style={{display: 'flex', flexDirection: 'column', alignItems: 'center'}}>
{
pack.status == 'failed' && <Alert message="上传失败,请重试" type="warning" showIcon />
}
<Input
addonBefore={<Icon type="upload"/>}
placeholder="请确认输入的链接真实有效~"
disabled={pack.status !== 'init' && pack.status !== 'failed'}/>
<Button
type="primary"
onClick={(e) => this.handleUrlUpload(e, pack)}
loading={loading.global}
size="small" style={{margin: "1vh 0"}}
disabled={pack.status !== 'init' && pack.status !== 'failed'}
>上传</Button>
</div>
)}
</TabPane>
<TabPane tab="直接上传" key="2">
{
pack.status == 'failed' && <Alert message="上传失败,请重试" type="warning" showIcon />
}
<Dragger
{...uploadProps}
action={`${config.apiRoot}/upload/packages/${pack["id"]}`}
disabled={pack.isNew}>
onChange={(info) => {
const status = info.file.status;
console.log(info)
if (status !== 'uploading') {
console.log(info.file, info.fileList);
}
if (status === 'done') {
dispatch({type: 'packages/fetch', payload: {appId: this.props.params.id}})
} else if (status === 'error') {
message.error(info.file.response.message);
}
}}
disabled={ pack.status !== 'init' && pack.status !== 'failed'}
action={`${config.apiRoot}/upload/package/${pack["_id"]}`}
>
<p className="ant-upload-drag-icon">
<Icon type="inbox"/>
</p>
<p className="ant-upload-text">Click or drag file to this area to upload</p>
<p className="ant-upload-hint">Support for a single or bulk upload. Strictly
prohibit
from uploading company data or other band files</p>
</Dragger>
</TabPane>
</Tabs>
)}
</FormItem>
<FormItem {...formItemLayout} >
<div className={styles.wrapSubmit}>
<Button type="primary" htmlType="submit" size="large">提交</Button>
</div>
</FormItem>
</FormItem>}
</Form>
</TabPane>
)
......@@ -782,13 +936,17 @@ function mapStateToProps(state, props) {
const {params: {id}} = props
const {
Apps: {apps},
packages: {packages},
loading
} = state
const App = apps[id] || {}
const _packages = packages[id] || []
return {
loading,
packages: _packages,
App
};
}
......
import request from '../utils/request'
export async function create(params) {
return request(`/packages/${params.id}`, {
export async function add(params) {
return request(`/packages`, {
method: 'POST',
body: JSON.stringify(params)
})
}
export async function patch(params) {
return request(`/packages`, {
method: 'PATCH',
body: JSON.stringify(params)
})
}
export async function fetch(params) {
return request(`/packages/manage?appId=${params.appId}`, {
method: 'GET',
})
}
export async function urlUpload(params) {
return request('/upload/packageUrl', {
method: 'POST',
body: JSON.stringify(params)
})
}
export async function del(params) {
return request(`/packages`, {
method: 'DELETE',
body: JSON.stringify(params)
})
}
......@@ -215,6 +215,10 @@ assert@^1.1.1:
dependencies:
util "0.10.3"
assertion-error@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b"
ast-types@0.9.6:
version "0.9.6"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
......@@ -1166,6 +1170,13 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"
chai@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/chai/-/chai-2.3.0.tgz#8a2f6a34748da801090fd73287b2aa739a4e909a"
dependencies:
assertion-error "1.0.0"
deep-eql "0.1.3"
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
......@@ -1641,6 +1652,12 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
deep-eql@0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
dependencies:
type-detect "0.1.1"
deep-equal@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
......@@ -5558,6 +5575,10 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
type-detect@0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
type-is@~1.6.14:
version "1.6.15"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
......@@ -5679,6 +5700,12 @@ vendors@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
vercomp@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/vercomp/-/vercomp-1.0.2.tgz#725fd292c099014d919ad9e9e05d3d25c7cff491"
dependencies:
chai "^2.2.0"
verror@1.3.6:
version "1.3.6"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment