bmd-extension 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/launch.json +14 -0
- package/.vscode/settings.json +1 -0
- package/CHANGELOG.md +9 -0
- package/DEPLOY.md +4 -0
- package/README.md +17 -0
- package/README_PRIVATE.md +1 -0
- package/build.sh +5 -0
- package/logo.png +0 -0
- package/media/dark/add.svg +40 -0
- package/media/dark/block.svg +1 -0
- package/media/dark/checklist-1.svg +1 -0
- package/media/dark/checklist.svg +1 -0
- package/media/dark/control.svg +1 -0
- package/media/dark/create.svg +1 -0
- package/media/dark/delete-1.svg +1 -0
- package/media/dark/delete.svg +1 -0
- package/media/dark/deploy-1.svg +2 -0
- package/media/dark/deploy.svg +2 -0
- package/media/dark/documents.svg +66 -0
- package/media/dark/earth.svg +68 -0
- package/media/dark/exe.svg +15 -0
- package/media/dark/export.svg +1 -0
- package/media/dark/function.svg +1 -0
- package/media/dark/game-controller.svg +77 -0
- package/media/dark/get.svg +1 -0
- package/media/dark/id-card.svg +59 -0
- package/media/dark/identity.svg +81 -0
- package/media/dark/import.svg +1 -0
- package/media/dark/information.svg +1 -0
- package/media/dark/interface.svg +1 -0
- package/media/dark/layout.svg +41 -0
- package/media/dark/leaf.svg +54 -0
- package/media/dark/list.svg +13 -0
- package/media/dark/logo.svg +249 -0
- package/media/dark/mockup.svg +1 -0
- package/media/dark/needle.svg +1 -0
- package/media/dark/pass.svg +46 -0
- package/media/dark/plus.svg +1 -0
- package/media/dark/post.svg +1 -0
- package/media/dark/quit.svg +1 -0
- package/media/dark/rocket.svg +28 -0
- package/media/dark/service.svg +1 -0
- package/media/dark/settings.svg +98 -0
- package/media/dark/social.svg +1 -0
- package/media/dark/spaceship-1.svg +1 -0
- package/media/dark/spaceship-2.svg +1 -0
- package/media/dark/spaceship.svg +1 -0
- package/media/dark/support.svg +88 -0
- package/media/dark/transfer.svg +1 -0
- package/media/dark/transform.svg +92 -0
- package/media/dark/update.svg +45 -0
- package/media/dark/upload-1.svg +1 -0
- package/media/dark/upload.svg +41 -0
- package/media/dark/vaccine.svg +1 -0
- package/media/dark/vr-gaming.svg +1 -0
- package/media/light/add.svg +40 -0
- package/media/light/block.svg +1 -0
- package/media/light/checklist-1.svg +1 -0
- package/media/light/checklist.svg +1 -0
- package/media/light/control.svg +1 -0
- package/media/light/create.svg +1 -0
- package/media/light/delete-1.svg +1 -0
- package/media/light/delete.svg +1 -0
- package/media/light/deploy-1.svg +2 -0
- package/media/light/deploy.svg +2 -0
- package/media/light/documents.svg +66 -0
- package/media/light/earth.svg +68 -0
- package/media/light/exe.svg +15 -0
- package/media/light/export.svg +1 -0
- package/media/light/function.svg +1 -0
- package/media/light/game-controller.svg +77 -0
- package/media/light/get.svg +1 -0
- package/media/light/id-card.svg +59 -0
- package/media/light/identity.svg +81 -0
- package/media/light/import.svg +1 -0
- package/media/light/information.svg +1 -0
- package/media/light/interface.svg +1 -0
- package/media/light/layout.svg +41 -0
- package/media/light/leaf.svg +54 -0
- package/media/light/list.svg +13 -0
- package/media/light/logo.svg +249 -0
- package/media/light/mockup.svg +1 -0
- package/media/light/needle.svg +1 -0
- package/media/light/pass.svg +46 -0
- package/media/light/plus.svg +1 -0
- package/media/light/post.svg +1 -0
- package/media/light/quit.svg +1 -0
- package/media/light/rocket.svg +28 -0
- package/media/light/service.svg +1 -0
- package/media/light/settings.svg +98 -0
- package/media/light/social.svg +1 -0
- package/media/light/spaceship-1.svg +1 -0
- package/media/light/spaceship-2.svg +1 -0
- package/media/light/spaceship.svg +1 -0
- package/media/light/support.svg +88 -0
- package/media/light/transfer.svg +1 -0
- package/media/light/transform.svg +92 -0
- package/media/light/update.svg +45 -0
- package/media/light/upload-1.svg +1 -0
- package/media/light/upload.svg +41 -0
- package/media/light/vaccine.svg +1 -0
- package/media/light/vr-gaming.svg +1 -0
- package/package-lock.json +6430 -0
- package/package.json +540 -0
- package/snippets-tsr.json +512 -0
- package/snippets.json +761 -0
- package/src/API.ts +14 -0
- package/src/FsProvider.ts +105 -0
- package/src/Request.ts +24 -0
- package/src/assets/api/api.txt +27 -0
- package/src/assets/configuration/AdminConfigurationController.ts.txt +72 -0
- package/src/assets/configuration/Configuration.ts.txt +37 -0
- package/src/assets/configuration/ConfigurationService.ts.txt +26 -0
- package/src/assets/contentDefine/AdminContentDefineController.ts.txt +91 -0
- package/src/assets/contentDefine/ContentDefine.ts.txt +45 -0
- package/src/assets/contentDefine/ContentDefineService.ts.txt +19 -0
- package/src/assets/contentDefine/CustomerContentDefineController.ts.txt +34 -0
- package/src/assets/controller/controller.txt +46 -0
- package/src/assets/controller/controllerResource.txt +103 -0
- package/src/assets/entity/entity.txt +22 -0
- package/src/assets/entity-request/entity-request.txt +18 -0
- package/src/assets/init/.env.example.txt +37 -0
- package/src/assets/init/.env.production.txt +37 -0
- package/src/assets/init/.gitignore.txt +8 -0
- package/src/assets/init/config.ts.txt +55 -0
- package/src/assets/init/deploy.sh.txt +46 -0
- package/src/assets/init/package-lock.json.txt +4184 -0
- package/src/assets/init/package.json.txt +79 -0
- package/src/assets/init/src/Server.ts.txt +167 -0
- package/src/assets/init/src/controllers/admin/AuthController.ts.txt +96 -0
- package/src/assets/init/src/controllers/admin/CustomerController.ts.txt +107 -0
- package/src/assets/init/src/controllers/admin/RoleController.ts.txt +143 -0
- package/src/assets/init/src/controllers/admin/StaffController.ts.txt +192 -0
- package/src/assets/init/src/controllers/customer/AuthController.ts.txt +170 -0
- package/src/assets/init/src/controllers/customer/CustomerController.ts.txt +32 -0
- package/src/assets/init/src/core/entity/CoreEntity.ts.txt +70 -0
- package/src/assets/init/src/core/services/CoreService.ts.txt +21 -0
- package/src/assets/init/src/entity/Customer.ts.txt +68 -0
- package/src/assets/init/src/entity/Permission.ts.txt +29 -0
- package/src/assets/init/src/entity/Role.ts.txt +36 -0
- package/src/assets/init/src/entity/Staff.ts.txt +54 -0
- package/src/assets/init/src/entity-request/CustomerInsert.ts.txt +42 -0
- package/src/assets/init/src/entity-request/CustomerUpdate.ts.txt +40 -0
- package/src/assets/init/src/entity-request/PermissionImport.ts.txt +12 -0
- package/src/assets/init/src/entity-request/StaffUpdate.ts.txt +33 -0
- package/src/assets/init/src/index.ts.txt +13 -0
- package/src/assets/init/src/middleware/auth/Verification.ts.txt +16 -0
- package/src/assets/init/src/middleware/auth/VerificationJWT.ts.txt +16 -0
- package/src/assets/init/src/middleware/auth/strategy/AuthStrategy.ts.txt +5 -0
- package/src/assets/init/src/middleware/auth/strategy/JWT.ts.txt +147 -0
- package/src/assets/init/src/middleware/error/handleError.ts.txt +22 -0
- package/src/assets/init/src/middleware/error/handleNotFound.ts.txt +7 -0
- package/src/assets/init/src/middleware/response/CustomSendResponse.ts.txt +35 -0
- package/src/assets/init/src/middleware/response/responseAPI.ts.txt +76 -0
- package/src/assets/init/src/middleware/validator/Validator.ts.txt +103 -0
- package/src/assets/init/src/services/CustomerService.ts.txt +79 -0
- package/src/assets/init/src/services/InitService.ts.txt +11 -0
- package/src/assets/init/src/services/MailService.ts.txt +271 -0
- package/src/assets/init/src/services/RoleService.ts.txt +66 -0
- package/src/assets/init/src/services/StaffService.ts.txt +104 -0
- package/src/assets/init/src/ssl/certificate-ca.crt +0 -0
- package/src/assets/init/src/ssl/certificate.crt +0 -0
- package/src/assets/init/src/ssl/private.key +0 -0
- package/src/assets/init/src/types/express.d.ts.txt +97 -0
- package/src/assets/init/src/util/expo.ts.txt +53 -0
- package/src/assets/init/src/util/helper.ts.txt +321 -0
- package/src/assets/init/src/util/language.ts.txt +8 -0
- package/src/assets/init/src/util/logger.ts.txt +47 -0
- package/src/assets/init/src/util/mailer.ts.txt +32 -0
- package/src/assets/init/src/util/password.ts.txt +13 -0
- package/src/assets/init/tsconfig.json.txt +26 -0
- package/src/assets/service/service.txt +34 -0
- package/src/constant.ts +83 -0
- package/src/extension.ts +459 -0
- package/src/provider/codeAction/controller/addPathParams.ts +65 -0
- package/src/provider/codeAction/controller/addTokenParam.ts +43 -0
- package/src/provider/codeAction/controller/addValidation.ts +47 -0
- package/src/provider/codeAction/controller/codeAction.ts +34 -0
- package/src/provider/codeAction/controller/util.ts +48 -0
- package/src/provider/codeAction/entity/codeAction.ts +48 -0
- package/src/provider/codeAction/entity/handleBuilder.ts +87 -0
- package/src/provider/codeAction/entity/handleFunction.ts +487 -0
- package/src/provider/codeAction/entity/handleProperty.ts +32 -0
- package/src/provider/codeAction/entity/handleRelation.ts +72 -0
- package/src/provider/codeAction/entity/helper.ts +132 -0
- package/src/provider/codeAction/entity-request/codeAction.ts +178 -0
- package/src/provider/codeAction/enum/codeAction.ts +95 -0
- package/src/provider/codeAction/service/codeAction.ts +232 -0
- package/src/provider/completion/CompletionProvider.ts +108 -0
- package/src/provider/errorChecking/checkHeaderToken.ts +60 -0
- package/src/provider/errorChecking/checkPathParam.ts +64 -0
- package/src/provider/errorChecking/checkRequired.ts +56 -0
- package/src/provider/errorChecking/errorChecking.ts +35 -0
- package/src/provider/errorChecking/util.ts +56 -0
- package/src/provider/treeDataProvider/Dependency.ts +26 -0
- package/src/provider/treeDataProvider/TreeProviderCommand.ts +60 -0
- package/src/provider/treeDataProvider/TreeProviderProject.ts +65 -0
- package/src/provider/treeDataProvider/api/createApi.ts +106 -0
- package/src/provider/treeDataProvider/controller/command/createController.ts +99 -0
- package/src/provider/treeDataProvider/controller/command/handleMethod.ts +363 -0
- package/src/provider/treeDataProvider/controller/treeData.ts +81 -0
- package/src/provider/treeDataProvider/deploy/command/handleDeploy.ts +70 -0
- package/src/provider/treeDataProvider/deploy/treeData.ts +21 -0
- package/src/provider/treeDataProvider/entity/command/addProperty.ts +144 -0
- package/src/provider/treeDataProvider/entity/command/addRelation.ts +125 -0
- package/src/provider/treeDataProvider/entity/command/createEntity.ts +53 -0
- package/src/provider/treeDataProvider/entity/command/createEntityRequest.ts +65 -0
- package/src/provider/treeDataProvider/entity/command/exportInterface.ts +130 -0
- package/src/provider/treeDataProvider/entity/treeData.ts +49 -0
- package/src/provider/treeDataProvider/module/command/configuration.ts +34 -0
- package/src/provider/treeDataProvider/module/command/contentDefine.ts +36 -0
- package/src/provider/treeDataProvider/module/command/initProject.ts +155 -0
- package/src/provider/treeDataProvider/module/treeData.ts +28 -0
- package/src/provider/treeDataProvider/project/command/addEnum.ts +0 -0
- package/src/provider/treeDataProvider/project/command/addProjectName.ts +23 -0
- package/src/provider/treeDataProvider/project/command/getProjectDetails.ts +284 -0
- package/src/provider/treeDataProvider/project/treeData.ts +28 -0
- package/src/provider/treeDataProvider/service/command/createService.ts +70 -0
- package/src/provider/treeDataProvider/service/command/handleConstructor.ts +134 -0
- package/src/provider/treeDataProvider/service/treeData.ts +25 -0
- package/src/types/project.d.ts +7 -0
- package/src/util.ts +145 -0
- package/src/utils/Password.ts +19 -0
- package/tsconfig.json +18 -0
- package/tslint.json +15 -0
- package/vsc-extension-quickstart.md +42 -0
@@ -0,0 +1,512 @@
|
|
1
|
+
{
|
2
|
+
"FL": {
|
3
|
+
"prefix": "fl",
|
4
|
+
"body": [
|
5
|
+
"<FlatList",
|
6
|
+
"data={${data}}",
|
7
|
+
"renderItem={({ item }) => <HistoryListItem data={item} />}",
|
8
|
+
"keyExtractor={(item, index) => index.toString()}",
|
9
|
+
"showsHorizontalScrollIndicator={false}",
|
10
|
+
"showsVerticalScrollIndicator={false}",
|
11
|
+
"refreshing={${refreshing}}",
|
12
|
+
"onEndReachedThreshold={0.4}",
|
13
|
+
"onEndReached={${onLoadMore}}",
|
14
|
+
"refreshControl={",
|
15
|
+
" <RefreshControl",
|
16
|
+
" refreshing={this.state.isRefreshing}",
|
17
|
+
" onRefresh={this.onRefresh}",
|
18
|
+
" />",
|
19
|
+
"}",
|
20
|
+
"/>"
|
21
|
+
],
|
22
|
+
"description": "Log output to console"
|
23
|
+
},
|
24
|
+
"useNavigate React router ": {
|
25
|
+
"prefix": "useNavigate",
|
26
|
+
"body": ["const navigate = useNavigate();"],
|
27
|
+
"description": "useNavigate React router "
|
28
|
+
},
|
29
|
+
"crud crema": {
|
30
|
+
"prefix": "crudCrema",
|
31
|
+
"body": [
|
32
|
+
"import { PlusOutlined, SearchOutlined } from \"@ant-design/icons\";",
|
33
|
+
"import { Button, Input, Space, Spin, Table } from \"antd\";",
|
34
|
+
"import { ${1}Api } from \"api/${1}.api\";",
|
35
|
+
"import { Pagination } from \"components/Pagination\";",
|
36
|
+
"import { useCallback, useEffect, useState } from \"react\";",
|
37
|
+
"import { ModalStatus } from \"types/modal\";",
|
38
|
+
"import { QueryParam } from \"types/query\";",
|
39
|
+
"import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\";",
|
40
|
+
"import { getTitle } from \"utils\";",
|
41
|
+
"import AppComponentHeader from \"@crema/core/AppComponentHeader\";",
|
42
|
+
"import StatsCard from \"components/StatsCard/StatsCard\";",
|
43
|
+
"import { RiUserSettingsLine } from \"react-icons/ri\";",
|
44
|
+
"import AppsContainer from \"@crema/core/AppsContainer\";",
|
45
|
+
"import AppsContent from \"@crema/core/AppsContainer/AppsContent\";",
|
46
|
+
"import AppsFooter from \"@crema/core/AppsContainer/AppsFooter\";",
|
47
|
+
"import { ${1/(.*)/${1:/capitalize}/}Modal } from \"./components/${1/(.*)/${1:/capitalize}/}Modal\";",
|
48
|
+
"import { debounce } from \"lodash\";",
|
49
|
+
"",
|
50
|
+
"const { ColumnGroup, Column } = Table;",
|
51
|
+
"",
|
52
|
+
"export const ${TM_FILENAME_BASE} = ({ title = \"\" }) => {",
|
53
|
+
" const [query, setQuery] = useState<QueryParam>({",
|
54
|
+
" page: 1,",
|
55
|
+
" limit: 10,",
|
56
|
+
" search: \"\",",
|
57
|
+
" });",
|
58
|
+
" const [loading, setLoading] = useState(false);",
|
59
|
+
" const [data, setData] = useState<${1/(.*)/${1:/capitalize}/}[]>([]);",
|
60
|
+
" const [total, setTotal] = useState(0);",
|
61
|
+
" const [visibleModal, setVisibleModal] = useState(false);",
|
62
|
+
" const [selected${1/(.*)/${1:/capitalize}/}, setSelected${1/(.*)/${1:/capitalize}/}] = useState<Partial<${1/(.*)/${1:/capitalize}/}>>(",
|
63
|
+
" {}",
|
64
|
+
" );",
|
65
|
+
" const [modalStatus, setModalStatus] = useState<ModalStatus>(\"create\");",
|
66
|
+
" const [search, setSearch] = useState(\"\");",
|
67
|
+
"",
|
68
|
+
" const debounceSearch = useCallback(",
|
69
|
+
" debounce((keyword) => setQuery({ ...query, search: keyword }), 500),",
|
70
|
+
" [query]",
|
71
|
+
" );",
|
72
|
+
"",
|
73
|
+
" useEffect(() => {",
|
74
|
+
" document.title = getTitle(title);",
|
75
|
+
" }, []);",
|
76
|
+
"",
|
77
|
+
" useEffect(() => {",
|
78
|
+
" fetchData();",
|
79
|
+
" }, [query]);",
|
80
|
+
"",
|
81
|
+
" const fetchData = async () => {",
|
82
|
+
" setLoading(true);",
|
83
|
+
" const {data} = await ${1}Api.findAll(query);",
|
84
|
+
" setLoading(false);",
|
85
|
+
" setData(data.${1}s);",
|
86
|
+
" setTotal(data.total);",
|
87
|
+
" };",
|
88
|
+
"",
|
89
|
+
" return (",
|
90
|
+
" <div>",
|
91
|
+
" <Space",
|
92
|
+
" style={{",
|
93
|
+
" width: \"100%\",",
|
94
|
+
" justifyContent: \"space-between\",",
|
95
|
+
" alignItems: \"end\",",
|
96
|
+
" }}",
|
97
|
+
" >",
|
98
|
+
" <Space direction=\"vertical\">",
|
99
|
+
" <AppComponentHeader title={title} />",
|
100
|
+
" <Space align=\"end\">",
|
101
|
+
" <Input",
|
102
|
+
" allowClear",
|
103
|
+
" suffix={<SearchOutlined />}",
|
104
|
+
" placeholder=\"Tìm kiếm\"",
|
105
|
+
" size=\"large\"",
|
106
|
+
" onChange={(e) => {",
|
107
|
+
" setSearch(e.target.value);",
|
108
|
+
" debounceSearch(e.target.value);",
|
109
|
+
" }}",
|
110
|
+
" onKeyDown={(e) => {",
|
111
|
+
" if (e.key === \"Enter\") {",
|
112
|
+
" setQuery({ ...query, search });",
|
113
|
+
" }",
|
114
|
+
" }}",
|
115
|
+
" />",
|
116
|
+
"",
|
117
|
+
" <Button",
|
118
|
+
" size=\"large\"",
|
119
|
+
" type=\"primary\"",
|
120
|
+
" color=\"primary\"",
|
121
|
+
" icon={<PlusOutlined />}",
|
122
|
+
" onClick={() => {",
|
123
|
+
" setModalStatus(\"create\");",
|
124
|
+
" setVisibleModal(true);",
|
125
|
+
" }}",
|
126
|
+
" >",
|
127
|
+
" Thêm mới",
|
128
|
+
" </Button>",
|
129
|
+
" </Space>",
|
130
|
+
" </Space>",
|
131
|
+
" <StatsCard",
|
132
|
+
" icon={<RiUserSettingsLine />}",
|
133
|
+
" data={total}",
|
134
|
+
" heading={\"Tổng ${2}\"}",
|
135
|
+
" />",
|
136
|
+
" </Space>",
|
137
|
+
"",
|
138
|
+
" <Spin spinning={loading}>",
|
139
|
+
" <AppsContainer title=\"\" type=\"bottom\" fullView>",
|
140
|
+
" <AppsContent>",
|
141
|
+
" <Table dataSource={data} pagination={false}>",
|
142
|
+
" <Column title=\"Mã KH\" dataIndex=\"code\" />",
|
143
|
+
"",
|
144
|
+
" <Column title=\"Tên khách hàng\" dataIndex=\"name\" />",
|
145
|
+
"",
|
146
|
+
" <Column title=\"Mã số thuế\" dataIndex=\"\" />",
|
147
|
+
" </Table>",
|
148
|
+
" </AppsContent>",
|
149
|
+
"",
|
150
|
+
" <AppsFooter>",
|
151
|
+
" <Pagination",
|
152
|
+
" total={total}",
|
153
|
+
" currentPage={query.page}",
|
154
|
+
" onChange={({ limit, page }) => {",
|
155
|
+
" query.page = page;",
|
156
|
+
" query.limit = limit;",
|
157
|
+
" setQuery({ ...query });",
|
158
|
+
" }}",
|
159
|
+
" />",
|
160
|
+
" </AppsFooter>",
|
161
|
+
" </AppsContainer>",
|
162
|
+
" </Spin>",
|
163
|
+
" <${1/(.*)/${1:/capitalize}/}Modal",
|
164
|
+
" onClose={() => {",
|
165
|
+
" }}",
|
166
|
+
" onSubmitOk={()=>{",
|
167
|
+
" fetchData()",
|
168
|
+
" }}",
|
169
|
+
" />",
|
170
|
+
" </div>",
|
171
|
+
" );",
|
172
|
+
"};",
|
173
|
+
"",
|
174
|
+
"export { ${TM_FILENAME_BASE} as default };",
|
175
|
+
""
|
176
|
+
],
|
177
|
+
"description": "crud crema"
|
178
|
+
},
|
179
|
+
"CRUD": {
|
180
|
+
"prefix": "crud",
|
181
|
+
"body": [
|
182
|
+
"import { PlusOutlined, SearchOutlined } from \"@ant-design/icons\";",
|
183
|
+
"import { Button, Input, Space, Spin, Table } from \"antd\";",
|
184
|
+
"import { ${1}Api } from \"api/${1}.api\";",
|
185
|
+
"import { Pagination } from \"components/Pagination\";",
|
186
|
+
"import React, { useEffect, useState, useRef } from \"react\";",
|
187
|
+
"import { ModalStatus } from \"types/modal\";",
|
188
|
+
"import { QueryParam } from \"types/query\";",
|
189
|
+
"import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\";",
|
190
|
+
"import { getTitle } from \"utils\";",
|
191
|
+
"import { \\$url } from \"utils/url\";",
|
192
|
+
"import { ${1/(.*)/${1:/capitalize}/}Modal } from \"./components/${1/(.*)/${1:/capitalize}/}Modal\";",
|
193
|
+
"import { use${1/(.*)/${1:/capitalize}/} } from \"hooks/use${1/(.*)/${1:/capitalize}/}\";",
|
194
|
+
"",
|
195
|
+
"const { ColumnGroup, Column } = Table;",
|
196
|
+
"",
|
197
|
+
"export const ${TM_FILENAME_BASE} = ({ title = \"\" }) => {",
|
198
|
+
" const {",
|
199
|
+
" ${1}s,",
|
200
|
+
" total${1/(.*)/${1:/capitalize}/},",
|
201
|
+
" fetch${1/(.*)/${1:/capitalize}/},",
|
202
|
+
" loading${1/(.*)/${1:/capitalize}/},",
|
203
|
+
" setQuery${1/(.*)/${1:/capitalize}/},",
|
204
|
+
" query${1/(.*)/${1:/capitalize}/},",
|
205
|
+
"} = use${1/(.*)/${1:/capitalize}/}({initQuery: {page: 1, limit: 10}})",
|
206
|
+
" const [selected${1/(.*)/${1:/capitalize}/}, setSelected${1/(.*)/${1:/capitalize}/}] = useState<Partial<${1/(.*)/${1:/capitalize}/}>>({});",
|
207
|
+
" const modalRef = useRef<${TM_FILENAME_BASE}Modal>(null)",
|
208
|
+
"",
|
209
|
+
" useEffect(() => {",
|
210
|
+
" document.title = getTitle(title);",
|
211
|
+
" }, []);",
|
212
|
+
"",
|
213
|
+
" useEffect(() => {",
|
214
|
+
" fetch${1/(.*)/${1:/capitalize}/}();",
|
215
|
+
" }, [query${1/(.*)/${1:/capitalize}/}]);",
|
216
|
+
"",
|
217
|
+
" return (",
|
218
|
+
" <div>",
|
219
|
+
" <div className=\"filter-container\">",
|
220
|
+
" <Space>",
|
221
|
+
" <div className=\"filter-item\">",
|
222
|
+
" <label htmlFor=\"\">Tìm kiếm</label>",
|
223
|
+
" <Input",
|
224
|
+
" onKeyDown={(ev) => {",
|
225
|
+
" if (ev.code == \"Enter\") {",
|
226
|
+
" query${1/(.*)/${1:/capitalize}/}.page = 1;",
|
227
|
+
" setQuery${1/(.*)/${1:/capitalize}/}({ ...query${1/(.*)/${1:/capitalize}/} });",
|
228
|
+
" }",
|
229
|
+
" }}",
|
230
|
+
" size=\"middle\"",
|
231
|
+
" onChange={(ev) => {",
|
232
|
+
" query${1/(.*)/${1:/capitalize}/}.search = ev.currentTarget.value;",
|
233
|
+
" }}",
|
234
|
+
" placeholder=\"Tìm kiếm\"",
|
235
|
+
" />",
|
236
|
+
" </div>",
|
237
|
+
"",
|
238
|
+
" <div className=\"filter-item btn\">",
|
239
|
+
" <Button onClick={fetch${1/(.*)/${1:/capitalize}/}} type=\"primary\" icon={<SearchOutlined />}>",
|
240
|
+
" Tìm kiếm",
|
241
|
+
" </Button>",
|
242
|
+
" </div>",
|
243
|
+
"",
|
244
|
+
" <div className=\"filter-item btn\">",
|
245
|
+
" <Button",
|
246
|
+
" onClick={() => {",
|
247
|
+
" modalRef.current?.handleCreate();",
|
248
|
+
" }}",
|
249
|
+
" type=\"primary\"",
|
250
|
+
" icon={<PlusOutlined />}",
|
251
|
+
" >",
|
252
|
+
" Thêm mới",
|
253
|
+
" </Button>",
|
254
|
+
" </div>",
|
255
|
+
" </Space>",
|
256
|
+
" </div>",
|
257
|
+
"",
|
258
|
+
" <Table loading={loading${1/(.*)/${1:/capitalize}/}} pagination={false} rowKey=\"id\" dataSource={${1}s}>",
|
259
|
+
" <Column",
|
260
|
+
" title=\"Username\"",
|
261
|
+
" dataIndex=\"username\"",
|
262
|
+
" key=\"username\"",
|
263
|
+
" render={(text, record: ${1/(.*)/${1:/capitalize}/}) => {",
|
264
|
+
" return (",
|
265
|
+
" <div>",
|
266
|
+
" {record.avatar && (",
|
267
|
+
" <img",
|
268
|
+
" width={40}",
|
269
|
+
" height={40}",
|
270
|
+
" style={{ objectFit: \"cover\" }}",
|
271
|
+
" src={\\$url(record.avatar)}",
|
272
|
+
" alt=\"\"",
|
273
|
+
" />",
|
274
|
+
" )}",
|
275
|
+
" <br />",
|
276
|
+
" <label htmlFor=\"\">{text}</label>",
|
277
|
+
" </div>",
|
278
|
+
" );",
|
279
|
+
" }}",
|
280
|
+
" />",
|
281
|
+
" <Column title=\"Name\" dataIndex=\"name\" key=\"name\" />",
|
282
|
+
" <Column title=\"Phone\" dataIndex=\"phone\" key=\"phone\" />",
|
283
|
+
" <Column title=\"Email\" dataIndex=\"email\" key={\"email\"} />",
|
284
|
+
"",
|
285
|
+
" <Column",
|
286
|
+
" title=\"Action\"",
|
287
|
+
" key=\"action\"",
|
288
|
+
" render={(text, record: ${1/(.*)/${1:/capitalize}/}) => (",
|
289
|
+
" <span>",
|
290
|
+
" <Button",
|
291
|
+
" type=\"primary\"",
|
292
|
+
" onClick={() => {",
|
293
|
+
" modalRef.current?.handleUpdate(record)",
|
294
|
+
" }}",
|
295
|
+
" >",
|
296
|
+
" Cập nhật",
|
297
|
+
" </Button>",
|
298
|
+
" </span>",
|
299
|
+
" )}",
|
300
|
+
" />",
|
301
|
+
" </Table>",
|
302
|
+
"",
|
303
|
+
" <Pagination",
|
304
|
+
" currentPage={query${1/(.*)/${1:/capitalize}/}.page}",
|
305
|
+
" total={total${1/(.*)/${1:/capitalize}/}}",
|
306
|
+
" onChange={({ limit, page }) => {",
|
307
|
+
" query${1/(.*)/${1:/capitalize}/}.page = page;",
|
308
|
+
" query${1/(.*)/${1:/capitalize}/}.limit = limit;",
|
309
|
+
" setQuery${1/(.*)/${1:/capitalize}/}({ ...query${1/(.*)/${1:/capitalize}/} });",
|
310
|
+
" }}",
|
311
|
+
" />",
|
312
|
+
"",
|
313
|
+
" <${1/(.*)/${1:/capitalize}/}Modal",
|
314
|
+
" onSubmitOk={fetch${1/(.*)/${1:/capitalize}/}}",
|
315
|
+
" onClose={() => {}}",
|
316
|
+
" ref={modalRef}",
|
317
|
+
" />",
|
318
|
+
" </div>",
|
319
|
+
" );",
|
320
|
+
"};",
|
321
|
+
""
|
322
|
+
],
|
323
|
+
"description": "FE CRUD"
|
324
|
+
},
|
325
|
+
"modal": {
|
326
|
+
"prefix": "modal",
|
327
|
+
"body": [
|
328
|
+
"import { Col, Form, Input, message, Modal, Row } from \"antd\";",
|
329
|
+
"import { Rule } from \"antd/lib/form\";",
|
330
|
+
"import { ${1}Api } from \"api/${1}.api\";",
|
331
|
+
"import { SingleImageUpload } from \"components/Upload/SingleImageUpload\";",
|
332
|
+
"import React, { useEffect, useImperativeHandle, useState } from \"react\";",
|
333
|
+
"import { ModalStatus } from \"types/modal\";",
|
334
|
+
"import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\";",
|
335
|
+
"",
|
336
|
+
"const rules: Rule[] = [{ required: true }];",
|
337
|
+
"",
|
338
|
+
"export interface ${1/(.*)/${1:/capitalize}/}Modal {",
|
339
|
+
" handleCreate: () => void;",
|
340
|
+
" handleUpdate: (${1}: ${1/(.*)/${1:/capitalize}/}) => void;",
|
341
|
+
"}",
|
342
|
+
"interface ${1/(.*)/${1:/capitalize}/}ModalProps {",
|
343
|
+
" onClose: () => void;",
|
344
|
+
" onSubmitOk: () => void;",
|
345
|
+
"}",
|
346
|
+
"",
|
347
|
+
"export const ${1/(.*)/${1:/capitalize}/}Modal = React.forwardRef(",
|
348
|
+
" (",
|
349
|
+
" {",
|
350
|
+
" onClose,",
|
351
|
+
" onSubmitOk,",
|
352
|
+
" }: ${1/(.*)/${1:/capitalize}/}ModalProps,",
|
353
|
+
" ref",
|
354
|
+
" ) => {",
|
355
|
+
" const [form] = Form.useForm<${1/(.*)/${1:/capitalize}/}>();",
|
356
|
+
" const [loading, setLoading] = useState(false);",
|
357
|
+
" const [visible, setVisible] = useState(false);",
|
358
|
+
" const [status, setStatus] = useState<ModalStatus>(\"create\");",
|
359
|
+
" const [selected${1/(.*)/${1:/capitalize}/}, setSelected${1/(.*)/${1:/capitalize}/}] = useState<${1/(.*)/${1:/capitalize}/}>();",
|
360
|
+
"",
|
361
|
+
" useImperativeHandle<any, ${1/(.*)/${1:/capitalize}/}Modal>(",
|
362
|
+
" ref,",
|
363
|
+
" () => ({",
|
364
|
+
" handleCreate() {",
|
365
|
+
" form.resetFields();",
|
366
|
+
" setVisible(true);",
|
367
|
+
" setStatus(\"create\");",
|
368
|
+
" setSelected${1/(.*)/${1:/capitalize}/}(undefined);",
|
369
|
+
" },",
|
370
|
+
" handleUpdate(${1}: ${1/(.*)/${1:/capitalize}/}) {",
|
371
|
+
" form.setFieldsValue({ ...${1}});",
|
372
|
+
" setVisible(true);",
|
373
|
+
" setStatus(\"update\");",
|
374
|
+
" setSelected${1/(.*)/${1:/capitalize}/}(${1});",
|
375
|
+
" },",
|
376
|
+
" }),",
|
377
|
+
" []",
|
378
|
+
" );",
|
379
|
+
"",
|
380
|
+
"const getPayload = () => {",
|
381
|
+
" const {...rest} = form.getFieldsValue();",
|
382
|
+
" return { ${1}: rest};",
|
383
|
+
"}",
|
384
|
+
"",
|
385
|
+
"const submitForm = async () => {",
|
386
|
+
" try{",
|
387
|
+
" setLoading(true);",
|
388
|
+
" const valid = await form.validateFields();",
|
389
|
+
" const data = getPayload()",
|
390
|
+
" let res: any = undefined;",
|
391
|
+
" switch(status){",
|
392
|
+
" case \"create\":",
|
393
|
+
" res = await ${1}Api.create(data);",
|
394
|
+
" message.success(\"Create ${1/(.*)/${1:/capitalize}/} successfully!\");",
|
395
|
+
" break;",
|
396
|
+
" case \"update\":",
|
397
|
+
" res = await ${1}Api.update(selected${1/(.*)/${1:/capitalize}/}?.id || 0, data);",
|
398
|
+
" message.success(\"Update ${1/(.*)/${1:/capitalize}/} successfully!\");",
|
399
|
+
" break;",
|
400
|
+
" }",
|
401
|
+
" onSubmitOk();",
|
402
|
+
" handleClose();",
|
403
|
+
" }",
|
404
|
+
" finally {",
|
405
|
+
" setLoading(false);",
|
406
|
+
" }",
|
407
|
+
"}",
|
408
|
+
"",
|
409
|
+
"const handleClose = () => {",
|
410
|
+
" onClose?.();",
|
411
|
+
" setVisible(false);",
|
412
|
+
" setSelected${1/(.*)/${1:/capitalize}/}(undefined)",
|
413
|
+
"}",
|
414
|
+
"",
|
415
|
+
" return (",
|
416
|
+
" <Modal",
|
417
|
+
" onCancel={()=> {",
|
418
|
+
" handleClose();",
|
419
|
+
" }}",
|
420
|
+
" visible={visible}",
|
421
|
+
" title={status == \"create\" ? \"Create ${1/(.*)/${1:/capitalize}/}\" : \"Update ${1/(.*)/${1:/capitalize}/}\"}",
|
422
|
+
" style={{ top: 20 }}",
|
423
|
+
" width={700}",
|
424
|
+
" confirmLoading={loading}",
|
425
|
+
" onOk={submitForm}",
|
426
|
+
" >",
|
427
|
+
" <Form layout=\"vertical\" form={form}>",
|
428
|
+
" <Row gutter={16}>",
|
429
|
+
" <Col span={12}>",
|
430
|
+
" <Form.Item label=\"Username\" name=\"username\" rules={rules}>",
|
431
|
+
" <Input placeholder=\"\" />",
|
432
|
+
" </Form.Item>",
|
433
|
+
" </Col>",
|
434
|
+
"",
|
435
|
+
" {status == \"create\" && (",
|
436
|
+
" <Col span={12}>",
|
437
|
+
" <Form.Item label=\"Password\" name=\"password\" rules={rules}>",
|
438
|
+
" <Input placeholder=\"\" />",
|
439
|
+
" </Form.Item>",
|
440
|
+
" </Col>",
|
441
|
+
" )}",
|
442
|
+
"",
|
443
|
+
" <Col span={12}>",
|
444
|
+
" <Form.Item label=\"Name\" name=\"name\" rules={rules}>",
|
445
|
+
" <Input placeholder=\"\" />",
|
446
|
+
" </Form.Item>",
|
447
|
+
" </Col>",
|
448
|
+
"",
|
449
|
+
" <Col span={12}>",
|
450
|
+
" <Form.Item label=\"Phone\" name=\"phone\" rules={rules}>",
|
451
|
+
" <Input placeholder=\"\" />",
|
452
|
+
" </Form.Item>",
|
453
|
+
" </Col>",
|
454
|
+
"",
|
455
|
+
" <Col span={12}>",
|
456
|
+
" <Form.Item label=\"Email\" name=\"email\">",
|
457
|
+
" <Input placeholder=\"\" />",
|
458
|
+
" </Form.Item>",
|
459
|
+
" </Col>",
|
460
|
+
" </Row>",
|
461
|
+
"",
|
462
|
+
" <Form.Item shouldUpdate={true}>",
|
463
|
+
" {() => {",
|
464
|
+
" return (",
|
465
|
+
" <Form.Item label=\"Avatar\" name=\"avatar\">",
|
466
|
+
" <SingleImageUpload",
|
467
|
+
" onUploadOk={(path: string) => {",
|
468
|
+
" console.log(\"onUploadOk:\", path);",
|
469
|
+
" form.setFieldsValue({",
|
470
|
+
" avatar: path,",
|
471
|
+
" });",
|
472
|
+
" }}",
|
473
|
+
" imageUrl={form.getFieldValue(\"avatar\")}",
|
474
|
+
" />",
|
475
|
+
" </Form.Item>",
|
476
|
+
" );",
|
477
|
+
" }}",
|
478
|
+
" </Form.Item>",
|
479
|
+
" </Form>",
|
480
|
+
" </Modal>",
|
481
|
+
" );",
|
482
|
+
" }",
|
483
|
+
");",
|
484
|
+
""
|
485
|
+
],
|
486
|
+
"description": "modal"
|
487
|
+
},
|
488
|
+
"form-milk": {
|
489
|
+
"prefix": "form-milk",
|
490
|
+
"body": [
|
491
|
+
"<Formik",
|
492
|
+
" initialValues={{ ...initValues }}",
|
493
|
+
"onSubmit={(values, formikActions) => {",
|
494
|
+
"formikActions.setSubmitting(false);",
|
495
|
+
"}}",
|
496
|
+
"validationSchema={yup.object().shape({",
|
497
|
+
"})}",
|
498
|
+
">",
|
499
|
+
"{({",
|
500
|
+
" values,handleChange,errors,setFieldTouched,touched,setFieldValue,handleSubmit,isValid,",
|
501
|
+
"}) => (",
|
502
|
+
" <>",
|
503
|
+
"</>",
|
504
|
+
")}",
|
505
|
+
" </Formik>"
|
506
|
+
]
|
507
|
+
},
|
508
|
+
"json-string": {
|
509
|
+
"prefix": "json-string",
|
510
|
+
"body": "JSON.stringify($0)"
|
511
|
+
}
|
512
|
+
}
|