diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/HomePageController.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/HomePageController.java new file mode 100644 index 0000000..9ff1977 --- /dev/null +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/HomePageController.java @@ -0,0 +1,91 @@ +package com.pudonghot.ambition.crm.controller; + +import javax.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import me.chyxion.tigon.model.ListResult; +import me.chyxion.tigon.model.ViewModel; +import org.apache.ibatis.annotations.Param; +import com.pudonghot.ambition.crm.model.User; +import com.pudonghot.ambition.crm.model.HomePage; +import org.springframework.stereotype.Controller; +import org.hibernate.validator.constraints.NotBlank; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.pudonghot.ambition.crm.service.HomePageService; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestMapping; +import com.pudonghot.ambition.crm.form.create.HomePageFormForCreate; +import com.pudonghot.ambition.crm.form.update.HomePageFormForUpdate; + +/** + * @author Shaun Chyxion
+ * chyxion@163.com
+ * Mar 01, 2018 22:57:52 + */ +@Slf4j +@Controller +@RequestMapping("/home-page") +public class HomePageController + extends BaseQueryController { + private static final String[] SEARCH_COLS = new String[] { + HomePage.NAME, + HomePage.NOTE + }; + + @RequestMapping("/list") + @RequiresRoles(User.ROLE_ADMIN) + public ListResult> list( + @Min(0) + @RequestParam(value = "start", defaultValue = "0") + final int start, + @Min(1) + @Max(512) + @RequestParam(value = "limit", defaultValue = "64") + final int limit, + @RequestParam(value = "search", required = false) + final String search) { + + return listViewModels(start, limit, search, null); + } + + @RequiresRoles(User.ROLE_ADMIN) + @RequestMapping(value = "/create", method = RequestMethod.POST) + public ViewModel create( + @Valid HomePageFormForCreate form) { + return ((HomePageService) queryService).create(form); + } + + @RequiresRoles(User.ROLE_ADMIN) + @RequestMapping(value = "/update", method = RequestMethod.POST) + public ViewModel update( + @Valid HomePageFormForUpdate form) { + return ((HomePageService) queryService).update(form); + } + + @RequiresRoles(User.ROLE_ADMIN) + @RequestMapping(value = "/delete", method = RequestMethod.POST) + public void delete(@NotBlank @Param("id") String id) { + ((HomePageService) queryService).delete(id); + } + + @RequiresRoles(User.ROLE_ADMIN) + @RequestMapping(value = "/apply", method = RequestMethod.POST) + public void apply(@NotBlank String id) { + ((HomePageService) queryService).apply(id, getUserId()); + } + + @RequestMapping("/applying") + public ViewModel applying() { + return ((HomePageService) queryService).applying(); + } + + /** + * {@inheritDoc} + */ + @Override + protected String[] searchCols() { + return SEARCH_COLS; + } +} diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/HomePageService.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/HomePageService.java new file mode 100644 index 0000000..13476e5 --- /dev/null +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/HomePageService.java @@ -0,0 +1,33 @@ +package com.pudonghot.ambition.crm.service; + +import me.chyxion.tigon.model.ViewModel; +import com.pudonghot.ambition.crm.model.HomePage; +import org.hibernate.validator.constraints.NotBlank; +import me.chyxion.tigon.service.BaseCrudByFormService; +import com.pudonghot.ambition.crm.form.create.HomePageFormForCreate; +import com.pudonghot.ambition.crm.form.update.HomePageFormForUpdate; + +/** + * @author Shaun Chyxion
+ * chyxion@163.com
+ * Mar 01, 2018 22:58:16 + */ +public interface HomePageService extends + BaseCrudByFormService { + + /** + * apply home page + * @param id home page id + * @param operator operator + */ + void apply(@NotBlank String id, @NotBlank String operator); + + /** + * @return applying home page + */ + ViewModel applying(); +} + diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/HomePageServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/HomePageServiceSupport.java new file mode 100644 index 0000000..0b0e88c --- /dev/null +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/HomePageServiceSupport.java @@ -0,0 +1,99 @@ +package com.pudonghot.ambition.crm.service.support; + +import java.util.Map; +import java.util.Date; +import java.util.HashMap; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.util.Assert; +import me.chyxion.tigon.mybatis.Search; +import me.chyxion.tigon.model.ViewModel; +import org.springframework.stereotype.Service; +import com.pudonghot.ambition.crm.model.HomePage; +import com.pudonghot.ambition.crm.mapper.HomePageMapper; +import com.pudonghot.ambition.crm.service.HomePageService; +import org.springframework.transaction.annotation.Transactional; +import com.pudonghot.ambition.crm.form.create.HomePageFormForCreate; +import com.pudonghot.ambition.crm.form.update.HomePageFormForUpdate; +import me.chyxion.tigon.service.support.BaseCrudByFormServiceSupport; + +/** + * @author Shaun Chyxion
+ * chyxion@163.com
+ * Mar 01, 2018 22:58:09 + */ +@Slf4j +@Service +public class HomePageServiceSupport + extends BaseCrudByFormServiceSupport + implements HomePageService { + + /** + * {@inheritDoc} + */ + @Override + @Transactional + public void apply(final String id, final String operator) { + final HomePage homePage = find(id); + Assert.state(homePage != null, "No home page [" + id + "] found"); + Assert.state(homePage.isEnabled(), "Home page [" + id + "] is not enabled"); + Assert.state(!homePage.isApplying(), "Home page [" + id + "] is applying"); + final Date now = new Date(); + toggleApplying(now, operator); + homePage.setApplying(true); + homePage.setUpdatedBy(operator); + homePage.setDateUpdated(now); + update(homePage); + } + + /** + * {@inheritDoc} + */ + @Override + public ViewModel applying() { + return findViewModel( + new Search(HomePage.APPLYING, true) + .eq(HomePage.ENABLED, true)); + } + + /** + * {@inheritDoc} + */ + @Override + public int delete(final String id) { + final HomePage homePage = find(id); + Assert.state(homePage != null, "No home page [" + id + "] found"); + Assert.state(!homePage.isEnabled(), "Home page [" + id + "] is enabled"); + return super.delete(id); + } + + /** + * {@inheritDoc} + */ + @Override + protected void beforeInsert(final HomePage homePage) { + super.beforeInsert(homePage); + if (homePage.isApplying()) { + toggleApplying(homePage.getDateCreated(), homePage.getCreatedBy()); + } + } + + /** + * {@inheritDoc} + */ + @Override + protected void beforeUpdate(final HomePage homePage) { + super.beforeUpdate(homePage); + if (homePage.isApplying()) { + toggleApplying(homePage.getDateUpdated(), homePage.getUpdatedBy()); + } + } + + private void toggleApplying(final Date date, final String operator) { + final Map update = new HashMap<>(); + update.put(HomePage.APPLYING, false); + update.put(HomePage.UPDATED_BY, operator); + update.put(HomePage.DATE_UPDATED, date != null ? date : new Date()); + update(update, new Search(HomePage.APPLYING, true)); + } +} diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/web/RequestListener.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/web/RequestListener.java new file mode 100644 index 0000000..fcd793a --- /dev/null +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/web/RequestListener.java @@ -0,0 +1,38 @@ +package com.pudonghot.ambition.crm.web; + +import org.slf4j.MDC; +import lombok.extern.slf4j.Slf4j; +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import me.chyxion.tigon.sequence.IdSequence; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Shaun Chyxion
+ * chyxion@163.com
+ * Mar 04, 2018 14:33:09 + */ +@Slf4j +@Service +public class RequestListener implements ServletRequestListener { + @Autowired + private IdSequence idSeq; + + @Override + public void requestInitialized(final ServletRequestEvent sre) { + MDC.put("requestId", idSeq.get()); + sre.getServletRequest().setAttribute("startTime", System.currentTimeMillis()); + } + + @Override + public void requestDestroyed(final ServletRequestEvent sre) { + final HttpServletRequest request = (HttpServletRequest) sre.getServletRequest(); + log.info("Request [{}] took {} ms.", + request.getRequestURI(), + System.currentTimeMillis() - + (Long) request.getAttribute("startTime")); + MDC.remove("requestId"); + } +} diff --git a/server/crm/src/main/resources/log4j2_dev.xml b/server/crm/src/main/resources/log4j2_dev.xml index 52621a8..94490c0 100644 --- a/server/crm/src/main/resources/log4j2_dev.xml +++ b/server/crm/src/main/resources/log4j2_dev.xml @@ -3,11 +3,11 @@ DEBUG .logs - %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%c{1}] %m%n + %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%X{requestId}][%c{1}] %m%n - + INFO /data/program/logs/${project.artifactId} - %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%c{1}] %m%n + %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%X{requestId}][%c{1}] %m%n diff --git a/server/crm/src/main/resources/log4j2_test.xml b/server/crm/src/main/resources/log4j2_test.xml index 2727834..a57043b 100644 --- a/server/crm/src/main/resources/log4j2_test.xml +++ b/server/crm/src/main/resources/log4j2_test.xml @@ -3,7 +3,7 @@ INFO /data/program/logs/${project.artifactId} - %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%c{1}] %m%n + %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%X{requestId}][%c{1}] %m%n diff --git a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/HomePageMapper.java b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/HomePageMapper.java new file mode 100644 index 0000000..0473375 --- /dev/null +++ b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/HomePageMapper.java @@ -0,0 +1,14 @@ +package com.pudonghot.ambition.crm.mapper; + +import me.chyxion.tigon.mybatis.BaseMapper; +import com.pudonghot.ambition.crm.model.HomePage; + +/** + * @version 0.0.1 + * @author Auto Generated
+ * Tech Support Shaun Chyxion
+ * Feb 27, 2018 9:16:03 AM + */ +public interface HomePageMapper extends BaseMapper { + +} diff --git a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/HomePageMapper.xml b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/HomePageMapper.xml new file mode 100644 index 0000000..634d530 --- /dev/null +++ b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/HomePageMapper.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/HomePageMapperTest.java b/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/HomePageMapperTest.java new file mode 100644 index 0000000..8e3f4be --- /dev/null +++ b/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/HomePageMapperTest.java @@ -0,0 +1,63 @@ +package com.pudonghot.ambition.crm.mapper; + +import org.junit.Test; +import java.util.Date; +import org.junit.Assert; +import org.junit.runner.RunWith; +import com.pudonghot.ambition.crm.model.HomePage; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; + +/** + * @version 0.0.1 + * @author Auto Generated
+ * Tech Support Shaun Chyxion
+ * Feb 27, 2018 9:16:03 AM + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath*:spring/spring-*.xml") +public class HomePageMapperTest extends AbstractTransactionalJUnit4SpringContextTests { + @Autowired + private HomePageMapper mapper; + + @Test + public void mapperTest() { + // String id = String.valueOf(new Date().getTime()); + // init model + HomePage m = new HomePage(); + String id = "id"; + m.setId(id); + m.setDateCreated(new Date()); + m.setContent("s"); + m.setApplying(true); + mapper.insert(m); + Assert.assertTrue(mapper.list(null).size() > 0); + /* + // Your Test Logics + HomePage m1 = mapper.find(id); + // asserts + Assert.assertEquals(id, m1.getId()); + Assert.assertEquals("s", m.getPage()); + Assert.assertEquals("s", m.getApplying()); + // update + m.setDateUpdated(new Date()); + m.setPage("S"); + m.setApplying("S"); + mapper.update(m); + m1 = mapper.find(id); + // asserts + Assert.assertEquals(id, m1.getId()); + Assert.assertNotNull(m1.getDateUpdated()); + Assert.assertEquals("S", m.getPage()); + Assert.assertEquals("S", m.getApplying()); + // list + Assert.assertTrue(mapper.list(null).size() > 0); + // delete + mapper.delete(id); + m1 = mapper.find(id); + Assert.assertNull(m1); + */ + } +} diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/form/create/CustomerPermissionFormForCreate.java b/server/model/src/main/java/com/pudonghot/ambition/crm/form/create/HomePageFormForCreate.java similarity index 68% rename from server/model/src/main/java/com/pudonghot/ambition/crm/form/create/CustomerPermissionFormForCreate.java rename to server/model/src/main/java/com/pudonghot/ambition/crm/form/create/HomePageFormForCreate.java index 2941ed4..0c3ab76 100644 --- a/server/model/src/main/java/com/pudonghot/ambition/crm/form/create/CustomerPermissionFormForCreate.java +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/form/create/HomePageFormForCreate.java @@ -3,7 +3,7 @@ package com.pudonghot.ambition.crm.form.create; import lombok.Getter; import lombok.Setter; import me.chyxion.tigon.form.FC2; -import org.hibernate.validator.constraints.Length; +import me.chyxion.tigon.format.annotation.Trim; import org.hibernate.validator.constraints.NotBlank; /** @@ -15,11 +15,15 @@ import org.hibernate.validator.constraints.NotBlank; */ @Getter @Setter -public class CustomerPermissionFormForCreate extends FC2 { +public class HomePageFormForCreate extends FC2 { private static final long serialVersionUID = 1L; // Properties + @Trim @NotBlank - @Length(max = 64) private String name; + @Trim + @NotBlank + private String content; + private boolean applying; } diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/form/update/HomePageFormForUpdate.java b/server/model/src/main/java/com/pudonghot/ambition/crm/form/update/HomePageFormForUpdate.java new file mode 100644 index 0000000..b9e34e5 --- /dev/null +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/form/update/HomePageFormForUpdate.java @@ -0,0 +1,25 @@ +package com.pudonghot.ambition.crm.form.update; + +import lombok.Getter; +import lombok.Setter; +import me.chyxion.tigon.form.FU2; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @version 0.0.1 + * @since 0.0.1 + * @author Shaun Chyxion
+ * chyxion@163.com
+ * May 10, 2016 1:42:01 PM + */ +@Getter +@Setter +public class HomePageFormForUpdate extends FU2 { + private static final long serialVersionUID = 1L; + + @NotBlank + private String name; + @NotBlank + private String content; + private boolean applying; +} diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/model/HomePage.java b/server/model/src/main/java/com/pudonghot/ambition/crm/model/HomePage.java new file mode 100644 index 0000000..ef483ed --- /dev/null +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/model/HomePage.java @@ -0,0 +1,29 @@ +package com.pudonghot.ambition.crm.model; + +import lombok.Getter; +import lombok.Setter; +import me.chyxion.tigon.model.M3; +import me.chyxion.tigon.mybatis.Table; + +/** + * @version 0.0.1 + * @author Auto Generated
+ * Tech Support Shaun Chyxion
+ * Feb 27, 2018 9:16:03 AM + */ +@Getter +@Setter +@Table("crm_home_page") +public class HomePage extends M3 { + private static final long serialVersionUID = 1L; + + // Column Names + public static final String NAME = "name"; + public static final String CONTENT = "content"; + public static final String APPLYING = "applying"; + + // Properties + private String name; + private String content; + private boolean applying; +} diff --git a/server/model/src/main/resources/log4j2.xml b/server/model/src/main/resources/log4j2.xml new file mode 100644 index 0000000..ff2fb0a --- /dev/null +++ b/server/model/src/main/resources/log4j2.xml @@ -0,0 +1,38 @@ + + + + DEBUG + .logs + %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%c{1}] %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/model/src/main/resources/spring/config.properties b/server/model/src/main/resources/spring/config.properties new file mode 100644 index 0000000..0ecab35 --- /dev/null +++ b/server/model/src/main/resources/spring/config.properties @@ -0,0 +1,8 @@ +# Config Dev + +# Database +datasource.host=127.0.0.1 +datasource.port=63306 +datasource.database-name=ambition_crm_test +datasource.username=root +datasource.password=696@2^~)oZ@^#*Q diff --git a/web/app/components/wysiwyg-editor.js b/web/app/components/wysiwyg-editor.js index b8c5d17..3d37b5a 100644 --- a/web/app/components/wysiwyg-editor.js +++ b/web/app/components/wysiwyg-editor.js @@ -3,27 +3,42 @@ import BaseFormInput from './base-form-input'; export default BaseFormInput.extend({ didInsertElement() { - let me = this; + const me = this; me._super(...arguments); //intialize wysiwyg editor me.$('.wysiwyg-editor').ace_wysiwyg({ toolbar: [ - 'bold', - 'italic', - 'strikethrough', - 'underline', + 'font', null, - 'justifyleft', - 'justifycenter', - 'justifyright', + 'fontSize', null, - 'createLink', - 'unlink', + 'bold', + 'italic', + 'strikethrough', + 'underline', null, - 'undo', + 'insertunorderedlist', + 'insertorderedlist', + 'outdent', + 'indent', + null, + 'justifyleft', + 'justifycenter', + 'justifyright', + 'justifyfull', + null, + 'createLink', + 'unlink', + // null, + // 'insertImage', + null, + 'foreColor', + null, + 'undo', 'redo' - ]}).on('DOMSubtreeModified propertychange', function() { + ] + }).on('DOMSubtreeModified propertychange', function() { me.setVal(Ember.$(this).html()); - }).html(me.getVal()).prev().addClass('wysiwyg-style1'); + }).html(me.getVal()).prev().addClass('wysiwyg-style2'); } }); diff --git a/web/app/router.js b/web/app/router.js index 3cb9bce..2d8e8d4 100644 --- a/web/app/router.js +++ b/web/app/router.js @@ -68,6 +68,12 @@ Router.map(function() { this.route('database-backup', function() { this.route('list'); }); + + this.route('home-page', function() { + this.route('list', {path: '/list/:page'}); + this.route('create'); + this.route('edit', {path: '/:id/edit'}); + }); }); export default Router; diff --git a/web/app/routes/application.js b/web/app/routes/application.js index 1e3bd2b..3308d9a 100644 --- a/web/app/routes/application.js +++ b/web/app/routes/application.js @@ -1,6 +1,7 @@ import Ember from 'ember'; +import Route from '@ember/routing/route'; -export default Ember.Route.extend({ +export default Route.extend({ getLoginRoute() { return Ember.getOwner(this).lookup('route:login'); }, diff --git a/web/app/routes/base.js b/web/app/routes/base.js index 89a710b..21326cb 100644 --- a/web/app/routes/base.js +++ b/web/app/routes/base.js @@ -1,6 +1,7 @@ import Ember from 'ember'; +import Route from '@ember/routing/route'; -export default Ember.Route.extend({ +export default Route.extend({ toolService: Ember.inject.service('tool-service'), beforeModel(transition) { let me = this; diff --git a/web/app/routes/home-page/create.js b/web/app/routes/home-page/create.js new file mode 100644 index 0000000..ccbf129 --- /dev/null +++ b/web/app/routes/home-page/create.js @@ -0,0 +1,10 @@ +import BaseRoute from '../base'; + +export default BaseRoute.extend({ + breadcrumbs: [{route: 'home-page.list', params: 1, text: 'Home Pages'}, {text: 'Create Home Page'}], + model() { + return { + enabled: true, + }; + } +}); diff --git a/web/app/routes/home-page/edit.js b/web/app/routes/home-page/edit.js new file mode 100644 index 0000000..4c5e7c1 --- /dev/null +++ b/web/app/routes/home-page/edit.js @@ -0,0 +1,11 @@ +import BaseEditRoute from '../base-edit'; + +export default BaseEditRoute.extend({ + afterModel(model) { + const me = this; + me._super(...arguments); + me.set('breadcrumbs', + [{route: 'home-page.list', params: 1, text: 'Home Pages'}, + {text: 'Edit Home Page [' + model.name + ']'}]); + } +}); diff --git a/web/app/routes/home-page/list.js b/web/app/routes/home-page/list.js new file mode 100644 index 0000000..787f96b --- /dev/null +++ b/web/app/routes/home-page/list.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; +import BaseListRoute from './../base-list'; + +export default BaseListRoute.extend({ + breadcrumbs: [{text: 'Home Pages'}], + actions: { + apply(page) { + const me = this; + console.log('apply page: ', page); + me.get('dialog').confirm('Are you sure to apply home page [' + page.name + ']?', () => { + me.get('ajax').doPost('home-page/apply', {id: page.id}, () => { + me.get('message').alert('Home page [' + page.name + '] applied'); + me.refresh(); + }); + }); + } + } +}); diff --git a/web/app/routes/index.js b/web/app/routes/index.js index 0a5128b..68d1dde 100644 --- a/web/app/routes/index.js +++ b/web/app/routes/index.js @@ -1,11 +1,17 @@ -import Ember from 'ember'; +import Route from '@ember/routing/route'; -export default Ember.Route.extend({ - beforeModel() { +export default Route.extend({ + model() { + const me = this; + me._super(...arguments); + return me.get('store').ajaxGet('home-page/applying'); + }, + afterModel(model) { + console.log('home page loaded: ', model); + if (model.content) { + // model.content = + model.content = Ember.String.htmlSafe(model.content); + } // this.transitionTo('app.list', 1); }, - // activate() { - // Ember.Logger.info('Index active.'); - // Ember.run.later(() => Ember.$('.page-content').addClass('desktop'), 1000) - // } }); diff --git a/web/app/services/home-page/service.js b/web/app/services/home-page/service.js new file mode 100644 index 0000000..c0bf474 --- /dev/null +++ b/web/app/services/home-page/service.js @@ -0,0 +1,20 @@ +import BaseService from '../service'; + +export default BaseService.extend({ + modelName: 'HomePage', + constraints: { + name: { + presence: true, + length: { + minimum: 1, + maximum: 36 + } + }, + content: { + presence: true + }, + applying: { + presence: true, + } + } +}); diff --git a/web/app/templates/components/form-input-checkbox.hbs b/web/app/templates/components/form-input-checkbox.hbs index def733d..0ba925f 100644 --- a/web/app/templates/components/form-input-checkbox.hbs +++ b/web/app/templates/components/form-input-checkbox.hbs @@ -1,6 +1,6 @@
-
+{{/main-content}} +{{outlet}} diff --git a/web/app/templates/index.hbs b/web/app/templates/index.hbs index 59509e7..6315b72 100644 --- a/web/app/templates/index.hbs +++ b/web/app/templates/index.hbs @@ -1,54 +1,6 @@ {{!home-board}} {{#main-content}}
-

User tips:

-

{{repeat-it ' ' 4}}Customer Status:

-

{{repeat-it ' ' 8}}Active – Auto assigned, Active customer, with PO in current year

-

{{repeat-it ' ' 8}}Occasional – Auto assigned, Not very active, no PO in current year, but occasional PO within past 2 years

-

{{repeat-it ' ' 8}}Sleeping – Auto assigned, Sleeping customer and no PO within past 2 years, still use PUSH-PULL

-

{{repeat-it ' ' 8}}NA – Manually assigned, Not PUSH-PULL customer anymore

-
-

{{repeat-it ' ' 4}}Customer Basic Information to collect:

-

{{repeat-it ' ' 8}}General info:

-

{{repeat-it ' ' 8}}Global Project (for CA only):

-

{{repeat-it ' ' 8}}Cust. Core Business:

-

{{repeat-it ' ' 8}}LEMO app:

-

{{repeat-it ' ' 8}}LEMO rivals(%):

-

{{repeat-it ' ' 8}}Cust. staff qty:

-

{{repeat-it ' ' 8}}Cust. competitors:

- -
-

{{repeat-it ' ' 4}}LMCN Week Goals:

-

{{repeat-it ' ' 8}}每次访客时100%向需要的客户推广:新产品、光纤、组件和技术研讨会。

- -
-

Admin Tips:

-

{{repeat-it ' ' 4}}Step 1 – Import Customers: QAD 2.2.23

-

{{repeat-it ' ' 4}}Step 2 – Import Sales Data: QAD 7.17.13

- -{{!-- -User tips: -    Customer Status: -        Active – Auto assigned, Active customer, with PO in current year -        Occasional – Auto assigned, Not very active, no PO in current year, but occasional PO within past 2 years -        Sleeping – Auto assigned, Sleeping customer and no PO within past 2 years, still use PUSH-PULL -        NA – Manually assigned, Not PUSH-PULL customer anymore -  - Customer Basic Information to collect: - General info: - Global Project (for CA only):   - Cust. Core Business: - LEMO app: - LEMO rivals(%): - Cust. staff qty: - Cust. competitors: -  - LMCN Week Goals: - 每次访客时100%向需要的客户推广:新产品、光纤、组件和技术研讨会。 - -Admin Tips: - Step 1 – Import Customers: QAD 2.2.23 - Step 2 – Import Sales Data: QAD 7.17.13 ---}} + {{model.content}}
{{/main-content}} diff --git a/web/app/templates/user/create.hbs b/web/app/templates/user/create.hbs index 372af59..4d6b06c 100644 --- a/web/app/templates/user/create.hbs +++ b/web/app/templates/user/create.hbs @@ -14,4 +14,3 @@
{{form-footer-buttons}} {{/form-content}} - diff --git a/web/bower.json b/web/bower.json index 3dba419..cbb6b2a 100644 --- a/web/bower.json +++ b/web/bower.json @@ -18,8 +18,7 @@ "jquery-colorbox": "^1.6.4", "fuelux": "^3.15.4", "jquery.hotkeys": "*", - "bootstrap-wysiwyg": "*", - "editor.md": "^1.5.0" + "bootstrap-wysiwyg": "*" }, "resolutions": { "ember": "release" diff --git a/web/ember-cli-build.js b/web/ember-cli-build.js index c8cf331..edc4394 100644 --- a/web/ember-cli-build.js +++ b/web/ember-cli-build.js @@ -89,6 +89,11 @@ module.exports = function(defaults) { destDir: '/assets/img' }); + // JQuery HotKeys + importVendor(app, 'bower_components/jquery.hotkeys/jquery.hotkeys.js'); + // Bootstrap WYSIWYG + importVendor(app, 'bower_components/bootstrap-wysiwyg/bootstrap-wysiwyg.js'); + // Select2, must before ace importVendor(app, 'vendor/ace/js/select2.js'); importVendor(app, 'vendor/ace/css/select2.css'); @@ -119,7 +124,7 @@ module.exports = function(defaults) { // importVendor(app, 'vendor/ace/js/ace/elements.fileinput.js'); // importVendor(app, 'vendor/ace/js/ace/elements.spinner.js'); // importVendor(app, 'vendor/ace/js/ace/elements.treeview.js'); - // importVendor(app, 'vendor/ace/js/ace/elements.wysiwyg.js'); + importVendor(app, 'vendor/ace/js/ace/elements.wysiwyg.js'); // importVendor(app, 'vendor/ace/js/jquery-ui.custom.js'); diff --git a/web/tests/unit/routes/home-page/create-test.js b/web/tests/unit/routes/home-page/create-test.js new file mode 100644 index 0000000..381f8fb --- /dev/null +++ b/web/tests/unit/routes/home-page/create-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:home-page/create', 'Unit | Route | home page/create', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/web/tests/unit/routes/home-page/edit-test.js b/web/tests/unit/routes/home-page/edit-test.js new file mode 100644 index 0000000..c2749f1 --- /dev/null +++ b/web/tests/unit/routes/home-page/edit-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:home-page/edit', 'Unit | Route | home page/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/web/tests/unit/routes/home-page/list-test.js b/web/tests/unit/routes/home-page/list-test.js new file mode 100644 index 0000000..4ac4e9d --- /dev/null +++ b/web/tests/unit/routes/home-page/list-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:home-page/list', 'Unit | Route | home page/list', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/web/tests/unit/services/home-page/service-test.js b/web/tests/unit/services/home-page/service-test.js new file mode 100644 index 0000000..974b6b4 --- /dev/null +++ b/web/tests/unit/services/home-page/service-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('service:home-page/service', 'Unit | Service | home page/service', { + // Specify the other units that are required for this test. + // needs: ['service:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let service = this.subject(); + assert.ok(service); +});