| @@ -0,0 +1,82 @@ | |||
| # See https://help.github.com/articles/ignoring-files for more about ignoring files. | |||
| # | |||
| # If you find yourself ignoring temporary files generated by your text editor | |||
| # or operating system, you probably want to add a global ignore instead: | |||
| # git config --global core.excludesfile '~/.gitignore_global' | |||
| # Ignore bundler config. | |||
| /.bundle | |||
| /bundle | |||
| # Ignore lock config file | |||
| *.lock | |||
| *.log | |||
| # mac | |||
| *.DS_Store | |||
| .bashrc | |||
| # Ignore all logfiles and tempfiles. | |||
| /log/* | |||
| /tmp/* | |||
| !/log/.keep | |||
| !/tmp/.keep | |||
| # Ignore uploaded files in development | |||
| /storage/* | |||
| /node_modules | |||
| /yarn-error.log | |||
| # /public/assets | |||
| .byebug_history | |||
| # Ignore master key for decrypting credentials and more. | |||
| /config/master.key | |||
| /config/database.yml | |||
| /.idea/* | |||
| # Ignore react node_modules | |||
| /public/react/.cache | |||
| /public/react/node_modules/ | |||
| /public/react/config/stats.json | |||
| /public/react/stats.json | |||
| /public/react/.idea/* | |||
| /public/h5build | |||
| /public/npm-debug.log | |||
| # avatars | |||
| /public/images/avatars | |||
| /config/secrets.yml | |||
| /config/redis.yml | |||
| /config/elasticsearch.yml | |||
| /config/aliyun_vod.yml | |||
| public/upload.html | |||
| /config/configuration.yml | |||
| /config/environments/production.rb | |||
| /config/initializers/gitlab_config.rb | |||
| /db/schema.rb | |||
| .vscode/ | |||
| vendor/bundle/ | |||
| .ruby-version | |||
| .ruby-gemset | |||
| /Users | |||
| /files | |||
| /public/images/avatars | |||
| /public/files | |||
| /workspace | |||
| /log | |||
| /public/admin | |||
| /mysql_data | |||
| .generators | |||
| .rakeTasks | |||
| db/bak/ | |||
| docker/ | |||
| educoder.sql | |||
| redis_data/ | |||
| Dockerfile | |||
| @@ -0,0 +1,529 @@ | |||
| import React, {Component} from 'react'; | |||
| import logo from './logo.svg'; | |||
| import './App.css'; | |||
| import {LocaleProvider} from 'antd' | |||
| import zhCN from 'antd/lib/locale-provider/zh_CN'; | |||
| import { | |||
| BrowserRouter as Router, | |||
| Route, | |||
| Switch | |||
| } from 'react-router-dom'; | |||
| import axios from 'axios'; | |||
| import '@icedesign/base/dist/ICEDesignBase.css'; | |||
| import '@icedesign/base/index.scss'; | |||
| import LoginDialog from './modules/login/LoginDialog'; | |||
| import Notcompletedysl from './modules/user/Notcompletedysl'; | |||
| import Trialapplicationysl from './modules/login/Trialapplicationysl'; | |||
| import Trialapplicationreview from './modules/user/Trialapplicationreview'; | |||
| import Addcourses from "./modules/courses/coursesPublic/Addcourses"; | |||
| import AccountProfile from"./modules/user/AccountProfile"; | |||
| import Trialapplication from './modules/login/Trialapplication' | |||
| import NotFoundPage from './NotFoundPage' | |||
| import Loading from './Loading' | |||
| import Loadable from 'react-loadable'; | |||
| import moment from 'moment' | |||
| import {MuiThemeProvider, createMuiTheme} from 'material-ui/styles'; | |||
| // import './AppConfig' | |||
| import history from './history'; | |||
| import {SnackbarHOC} from 'educoder' | |||
| import {initAxiosInterceptors} from './AppConfig' | |||
| // !!!tpi需要这个来加载css | |||
| import {TPMIndexHOC} from './modules/tpm/TPMIndexHOC'; | |||
| const theme = createMuiTheme({ | |||
| palette: { | |||
| primary: { | |||
| main: '#4CACFF', | |||
| contrastText: 'rgba(255, 255, 255, 0.87)' | |||
| }, | |||
| secondary: {main: '#4CACFF'}, // #11cb5f This is just green.A700 as hex. | |||
| }, | |||
| }); | |||
| // | |||
| // const Trialapplication= Loadable({ | |||
| // loader: () =>import('./modules/login/Trialapplication'), | |||
| // loading:Loading, | |||
| // }) | |||
| //登入 | |||
| const EducoderLogin = Loadable({ | |||
| loader: () => import('./modules/login/EducoderLogin'), | |||
| loading: Loading, | |||
| }) | |||
| const TestIndex = Loadable({ | |||
| loader: () => import('./modules/test'), | |||
| loading: Loading, | |||
| }) | |||
| const IndexWrapperComponent = Loadable({ | |||
| loader: () => import('./modules/page/IndexWrapper'), | |||
| loading: Loading, | |||
| }) | |||
| const CommentComponent = Loadable({ | |||
| loader: () => import('./modules/comment/CommentContainer'), | |||
| loading: Loading, | |||
| }) | |||
| const TestMaterialDesignComponent = Loadable({ | |||
| loader: () => import('./modules/test/md/TestMaterialDesign'), | |||
| loading: Loading, | |||
| }) | |||
| const TestCodeMirrorComponent = Loadable({ | |||
| loader: () => import('./modules/test/codemirror/TestCodeMirror'), | |||
| loading: Loading, | |||
| }) | |||
| const TestComponent = Loadable({ | |||
| loader: () => import('./modules/test/TestRC'), | |||
| loading: Loading, | |||
| }) | |||
| const TestUrlQueryComponent = Loadable({ | |||
| loader: () => import('./modules/test/urlquery/TestUrlQuery'), | |||
| loading: Loading, | |||
| }) | |||
| const TPMIndexComponent = Loadable({ | |||
| loader: () => import('./modules/tpm/TPMIndex'), | |||
| loading: Loading, | |||
| }) | |||
| const TPMShixunsIndexComponent = Loadable({ | |||
| loader: () => import('./modules/tpm/shixuns/ShixunsIndex'), | |||
| loading: Loading, | |||
| }) | |||
| //实训课程(原实训路径) | |||
| const ShixunPaths = Loadable({ | |||
| loader: () => import('./modules/paths/Index'), | |||
| loading: Loading, | |||
| }) | |||
| //在线课堂 | |||
| const CoursesIndex = Loadable({ | |||
| loader: () => import('./modules/courses/Index'), | |||
| loading: Loading, | |||
| }) | |||
| const SearchPage = Loadable({ | |||
| loader: () => import('./search/SearchPage'), | |||
| loading: Loading, | |||
| }) | |||
| //教学案例 | |||
| const MoopCases = Loadable({ | |||
| loader: () => import('./modules/moop_cases/index'), | |||
| loading: Loading, | |||
| }) | |||
| // 课堂讨论 | |||
| // const BoardIndex = Loadable({ | |||
| // loader: () => import('./modules/courses/boards/BoardIndex'), | |||
| // loading:Loading, | |||
| // }) | |||
| // //课堂普通作业&分组作业 | |||
| // const CoursesWorkIndex = Loadable({ | |||
| // loader: () => import('./modules/courses/busyWork/Index'), | |||
| // loading:Loading, | |||
| // }) | |||
| // | |||
| // const TPMShixunchildIndexComponent = Loadable({ | |||
| // loader: () => import('./modules/tpm/shixunchild/ShixunChildIndex'), | |||
| // loading: Loading, | |||
| // }) | |||
| // const TPMshixunfork_listIndexComponent = Loadable({ | |||
| // loader: () => import('./modules/tpm/shixunchild/Shixunfork_list'), | |||
| // loading: Loading, | |||
| // }) | |||
| const ForumsIndexComponent = Loadable({ | |||
| loader: () => import('./modules/forums/ForumsIndex'), | |||
| loading: Loading, | |||
| }) | |||
| // trustie plus forum | |||
| // const TPForumsIndexComponent = Loadable({ | |||
| // loader: () => import('./modules/tp-forums/TPForumsIndex'), | |||
| // loading: Loading, | |||
| // }) | |||
| // const TestPageComponent = Loadable({ | |||
| // loader: () => import('./modules/page/Index'), | |||
| // loading: Loading, | |||
| // }) | |||
| //新建实训 | |||
| const Newshixuns = Loadable({ | |||
| loader: () => import('./modules/tpm/newshixuns/Newshixuns'), | |||
| loading: Loading, | |||
| }) | |||
| //实训首页 | |||
| const ShixunsHome = Loadable({ | |||
| loader: () => import('./modules/home/shixunsHome'), | |||
| loading: Loading, | |||
| }) | |||
| const CompatibilityPageLoadable = Loadable({ | |||
| loader: () => import('./modules/common/CompatibilityPage'), | |||
| loading: Loading, | |||
| }) | |||
| //403页面 | |||
| const Shixunauthority = Loadable({ | |||
| loader: () => import('./modules/403/Shixunauthority'), | |||
| loading: Loading, | |||
| }) | |||
| //404页面 | |||
| const Shixunnopage = Loadable({ | |||
| loader: () => import('./modules/404/Shixunnopage'), | |||
| loading: Loading, | |||
| }) | |||
| //500页面 | |||
| const http500 = Loadable({ | |||
| loader: () => import('./modules/500/http500'), | |||
| loading: Loading, | |||
| }) | |||
| // 登录注册 | |||
| const LoginRegisterPage = Loadable({ | |||
| loader: () => import('./modules/user/LoginRegisterPage'), | |||
| loading: Loading, | |||
| }) | |||
| const AccountPage = Loadable({ | |||
| loader: () => import('./modules/user/AccountPage'), | |||
| loading: Loading, | |||
| }) | |||
| // 个人主页 | |||
| const UsersInfo = Loadable({ | |||
| loader: () => import('./modules/user/usersInfo/Infos'), | |||
| loading: Loading, | |||
| }) | |||
| // 兴趣页面 | |||
| const Interestpage = Loadable({ | |||
| loader: () => import('./modules/login/EducoderInteresse'), | |||
| loading: Loading, | |||
| }) | |||
| //众包创新 | |||
| const ProjectPackages=Loadable({ | |||
| loader: () => import('./modules/projectPackages/ProjectPackageIndex'), | |||
| loading: Loading, | |||
| }) | |||
| class App extends Component { | |||
| constructor(props) { | |||
| super(props) | |||
| // this.state = { | |||
| // isRenders:false, | |||
| // } | |||
| } | |||
| componentDidMount() { | |||
| // force an update if the URL changes | |||
| history.listen(() => { | |||
| this.forceUpdate() | |||
| const $ = window.$ | |||
| // https://www.trustie.net/issues/21919 可能会有问题 | |||
| $("html").animate({ scrollTop: $('html').scrollTop() - 0 }) | |||
| }); | |||
| initAxiosInterceptors(this.props) | |||
| // | |||
| // axios.interceptors.response.use((response) => { | |||
| // // console.log("response"+response); | |||
| // if(response!=undefined) | |||
| // // console.log("response"+response.data.statu); | |||
| // if (response&&response.data.status === 407) { | |||
| // this.setState({ | |||
| // isRenders: true, | |||
| // }) | |||
| // } | |||
| // return response; | |||
| // }, (error) => { | |||
| // //TODO 这里如果样式变了会出现css不加载的情况 | |||
| // }); | |||
| } | |||
| //修改登录方法 | |||
| Modifyloginvalue=()=>{ | |||
| this.setState({ | |||
| isRender:false, | |||
| }) | |||
| } | |||
| render() { | |||
| return ( | |||
| <LocaleProvider locale={zhCN}> | |||
| <MuiThemeProvider theme={theme}> | |||
| <LoginDialog {...this.props} {...this.state} Modifyloginvalue={()=>this.Modifyloginvalue()}></LoginDialog> | |||
| <Notcompletedysl {...this.props} {...this.state}></Notcompletedysl> | |||
| <Trialapplicationysl {...this.props} {...this.state}></Trialapplicationysl> | |||
| <Trialapplicationreview {...this.props} {...this.state}></Trialapplicationreview> | |||
| <Addcourses {...this.props} {...this.state}/> | |||
| <AccountProfile {...this.props} {...this.state}/> | |||
| {/*{*/} | |||
| {/* isRender === true?*/} | |||
| {/* <LoginDialog></LoginDialog> : ""*/} | |||
| {/*}*/} | |||
| {/*{*/} | |||
| {/* isRenders === true?*/} | |||
| {/*<Trialapplication></Trialapplication>*/} | |||
| {/*:""*/} | |||
| {/*}*/} | |||
| <Router> | |||
| <Switch> | |||
| {/*<Route path="/login" component={LoginRegisterPage}/>*/} | |||
| {/*众包创新*/} | |||
| <Route path={"/crowdsourcings"} component={ProjectPackages}/> | |||
| {/*认证*/} | |||
| <Route path="/account" component={AccountPage}/> | |||
| {/*403*/} | |||
| <Route path="/403" component={Shixunauthority}/> | |||
| <Route path="/500" component={http500}/> | |||
| {/*404*/} | |||
| <Route path="/nopage" component={Shixunnopage}/> | |||
| <Route path="/compatibility" component={CompatibilityPageLoadable}/> | |||
| <Route | |||
| path="/login" component={EducoderLogin} | |||
| /> | |||
| <Route | |||
| path="/register" component={EducoderLogin} | |||
| /> | |||
| <Route path="/users/:username" | |||
| render={ | |||
| (props) => (<UsersInfo {...this.props} {...props} {...this.state} />) | |||
| }></Route> | |||
| {/*<Route*/} | |||
| {/* path="/trialapplication" component={Trialapplication}*/} | |||
| {/*/>*/} | |||
| <Route | |||
| path="/changepassword" component={EducoderLogin} | |||
| /> | |||
| <Route | |||
| path="/interesse" component={Interestpage} | |||
| /> | |||
| <Route path="/shixuns/new" component={Newshixuns}> | |||
| </Route> | |||
| <Route path="/tasks/:stageId" component={IndexWrapperComponent}/> | |||
| <Route path="/shixuns/:shixunId" component={TPMIndexComponent}> | |||
| </Route> | |||
| {/*列表页*/} | |||
| <Route path="/shixuns" component={TPMShixunsIndexComponent}/> | |||
| {/* <Route path="/shixunchild" component={TPMShixunchildIndexComponent}> | |||
| </Route> | |||
| <Route path="/fork_list" component={TPMshixunfork_listIndexComponent}> | |||
| </Route> */} | |||
| {/*<Route path="/forums" component={ForumsIndexComponent}>*/} | |||
| {/*</Route>*/} | |||
| {/*实训课程(原实训路径)*/} | |||
| <Route path="/paths" component={ShixunPaths}></Route> | |||
| <Route path="/search" | |||
| render={ | |||
| (props)=>(<SearchPage {...this.props} {...props} {...this.state}></SearchPage>) | |||
| } | |||
| ></Route> | |||
| {/*课堂*/} | |||
| <Route path="/courses" component={CoursesIndex} {...this.props}></Route> | |||
| {/* 课堂讨论 */} | |||
| {/* <Route path="/board" component = {BoardIndex} {...this.props}></Route> */} | |||
| {/* <Route path="/tpforums" component={TPForumsIndexComponent}> | |||
| </Route> */} | |||
| {/* <Route path="/myshixuns/:shixunId/stages/:stageId" component={Index}/> */} | |||
| {/* 兴趣页面*/} | |||
| {/*<Route path="/interest" component={Interestpage}/>*/} | |||
| <Route path="/comment" component={CommentComponent}/> | |||
| <Route path="/testMaterial" component={TestMaterialDesignComponent}/> | |||
| <Route path="/test" component={TestIndex}/> | |||
| <Route path="/testCodeMirror" component={TestCodeMirrorComponent}/> | |||
| <Route path="/testRCComponent" component={TestComponent}/> | |||
| <Route path="/testUrlQuery" component={TestUrlQueryComponent}/> | |||
| {/* 教学案例 */} | |||
| <Route path="/moop_cases"render={ | |||
| (props) => (<MoopCases {...this.props} {...props} {...this.state} />) | |||
| }/> | |||
| {/* <Route component={NotFoundPage}/> */} | |||
| {/*列表页*/} | |||
| {/*<Route component={TPMShixunsIndexComponent}/>*/} | |||
| {/*首页*/} | |||
| <Route exact path="/" component={ShixunsHome}/> | |||
| <Route component={Shixunnopage}/> | |||
| {/*<Route component={ShixunsHome}/>*/} | |||
| </Switch> | |||
| </Router> | |||
| </MuiThemeProvider> | |||
| </LocaleProvider> | |||
| ); | |||
| } | |||
| } | |||
| // moment国际化,设置为中文 | |||
| moment.defineLocale('zh-cn', { | |||
| months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), | |||
| monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), | |||
| weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), | |||
| weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'), | |||
| weekdaysMin: '日_一_二_三_四_五_六'.split('_'), | |||
| longDateFormat: { | |||
| LT: 'Ah点mm分', | |||
| LTS: 'Ah点m分s秒', | |||
| L: 'YYYY-MM-DD', | |||
| LL: 'YYYY年MMMD日', | |||
| LLL: 'YYYY年MMMD日Ah点mm分', | |||
| LLLL: 'YYYY年MMMD日ddddAh点mm分', | |||
| l: 'YYYY-MM-DD', | |||
| ll: 'YYYY年MMMD日', | |||
| lll: 'YYYY年MMMD日Ah点mm分', | |||
| llll: 'YYYY年MMMD日ddddAh点mm分' | |||
| }, | |||
| meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, | |||
| meridiemHour: function (hour, meridiem) { | |||
| if (hour === 12) { | |||
| hour = 0; | |||
| } | |||
| if (meridiem === '凌晨' || meridiem === '早上' || | |||
| meridiem === '上午') { | |||
| return hour; | |||
| } else if (meridiem === '下午' || meridiem === '晚上') { | |||
| return hour + 12; | |||
| } else { | |||
| // '中午' | |||
| return hour >= 11 ? hour : hour + 12; | |||
| } | |||
| }, | |||
| meridiem: function (hour, minute, isLower) { | |||
| var hm = hour * 100 + minute; | |||
| if (hm < 600) { | |||
| return '凌晨'; | |||
| } else if (hm < 900) { | |||
| return '早上'; | |||
| } else if (hm < 1130) { | |||
| return '上午'; | |||
| } else if (hm < 1230) { | |||
| return '中午'; | |||
| } else if (hm < 1800) { | |||
| return '下午'; | |||
| } else { | |||
| return '晚上'; | |||
| } | |||
| }, | |||
| calendar: { | |||
| sameDay: function () { | |||
| return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; | |||
| }, | |||
| nextDay: function () { | |||
| return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; | |||
| }, | |||
| lastDay: function () { | |||
| return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; | |||
| }, | |||
| nextWeek: function () { | |||
| var startOfWeek, prefix; | |||
| startOfWeek = moment().startOf('week'); | |||
| prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; | |||
| return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; | |||
| }, | |||
| lastWeek: function () { | |||
| var startOfWeek, prefix; | |||
| startOfWeek = moment().startOf('week'); | |||
| prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; | |||
| return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; | |||
| }, | |||
| sameElse: 'LL' | |||
| }, | |||
| ordinalParse: /\d{1,2}(日|月|周)/, | |||
| ordinal: function (number, period) { | |||
| switch (period) { | |||
| case 'd': | |||
| case 'D': | |||
| case 'DDD': | |||
| return number + '日'; | |||
| case 'M': | |||
| return number + '月'; | |||
| case 'w': | |||
| case 'W': | |||
| return number + '周'; | |||
| default: | |||
| return number; | |||
| } | |||
| }, | |||
| relativeTime: { | |||
| future: '%s内', | |||
| past: '%s前', | |||
| s: '几秒', | |||
| m: '1分钟', | |||
| mm: '%d分钟', | |||
| h: '1小时', | |||
| hh: '%d小时', | |||
| d: '1天', | |||
| dd: '%d天', | |||
| M: '1个月', | |||
| MM: '%d个月', | |||
| y: '1年', | |||
| yy: '%d年' | |||
| }, | |||
| week: { | |||
| // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 | |||
| dow: 1, // Monday is the first day of the week. | |||
| doy: 4 // The week that contains Jan 4th is the first week of the year. | |||
| } | |||
| }); | |||
| export default SnackbarHOC()(App); | |||
| @@ -0,0 +1,121 @@ | |||
| source 'https://gems.ruby-china.com' | |||
| git_source(:github) { |repo| "https://github.com/#{repo}.git" } | |||
| ruby '2.3.7' | |||
| gem 'rails', '~> 5.2.0' | |||
| gem 'mysql2', '>= 0.4.4', '< 0.6.0' | |||
| gem 'puma', '~> 3.11' | |||
| gem 'sass-rails', '~> 5.0' | |||
| gem 'uglifier', '>= 1.3.0' | |||
| # gem 'coffee-rails', '~> 4.2' | |||
| gem 'turbolinks', '~> 5' | |||
| gem 'jbuilder', '~> 2.5' | |||
| gem 'groupdate', '~> 4.1.0' | |||
| gem 'chartkick' | |||
| gem 'grape-entity', '~> 0.7.1' | |||
| gem 'kaminari', '~> 1.1', '>= 1.1.1' | |||
| gem 'bootsnap', '>= 1.1.0', require: false | |||
| gem 'gitlab', path: 'lib/gitlab-cli' | |||
| gem 'chinese_pinyin' | |||
| gem 'rack-cors' | |||
| gem 'redis-rails' | |||
| gem 'roo-xls' | |||
| gem 'simple_xlsx_reader' | |||
| gem 'rubyzip' | |||
| gem 'spreadsheet' | |||
| gem 'ruby-ole' | |||
| # 导出为xlsx | |||
| gem 'axlsx', '~> 3.0.0.pre' | |||
| gem 'axlsx_rails', '~> 0.5.2' | |||
| gem 'oauth2' | |||
| #导出为pdf | |||
| gem 'pdfkit' | |||
| gem 'wkhtmltopdf-binary' | |||
| gem 'request_store' | |||
| #gem 'iconv' | |||
| # markdown 转html | |||
| gem 'redcarpet', '~> 3.4' | |||
| gem 'rqrcode', '~> 0.10.1' | |||
| gem 'rqrcode_png' | |||
| gem 'acts-as-taggable-on', '~> 6.0' | |||
| # a tree structure | |||
| gem 'ancestry' | |||
| gem 'acts_as_list' | |||
| gem 'omniauth-cas' | |||
| group :development, :test do | |||
| gem 'rspec-rails', '~> 3.8' | |||
| end | |||
| group :development do | |||
| gem 'awesome_print' | |||
| gem 'web-console', '>= 3.3.0' | |||
| gem 'listen', '>= 3.0.5', '< 3.2' | |||
| gem 'spring' | |||
| gem 'spring-watcher-listen', '~> 2.0.0' | |||
| end | |||
| group :test do | |||
| gem 'capybara', '>= 2.15', '< 4.0' | |||
| gem 'selenium-webdriver' | |||
| gem 'chromedriver-helper' | |||
| end | |||
| gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] | |||
| #编码检测 | |||
| gem 'rchardet', '~> 1.8' | |||
| # http client | |||
| gem 'faraday', '~> 0.15.4' | |||
| # view | |||
| gem 'active_decorator' | |||
| gem 'bootstrap', '~> 4.3.1' | |||
| gem 'jquery-rails' | |||
| gem 'simple_form' | |||
| gem 'font-awesome-sass', '4.7.0' | |||
| # i18n | |||
| gem 'rails-i18n', '~> 5.1' | |||
| # job | |||
| gem 'sidekiq' | |||
| gem 'sinatra' | |||
| # batch insert | |||
| gem 'bulk_insert' | |||
| # elasticsearch | |||
| gem 'searchkick' | |||
| gem 'aasm' | |||
| gem 'enumerize' | |||
| gem 'diffy' | |||
| gem 'deep_cloneable', '~> 3.0.0' | |||
| # oauth2 | |||
| gem 'omniauth', '~> 1.9.0' | |||
| gem 'omniauth-oauth2', '~> 1.6.0' | |||
| # global var | |||
| gem 'request_store' | |||
| # 敏感词汇 | |||
| gem 'harmonious_dictionary', '~> 0.0.1' | |||
| gem 'parallel', '~> 1.19', '>= 1.19.1' | |||
| @@ -0,0 +1,6 @@ | |||
| # Add your own tasks in files placed in lib/tasks ending in .rake, | |||
| # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. | |||
| require_relative 'config/application' | |||
| Rails.application.load_tasks | |||
| @@ -0,0 +1,3 @@ | |||
| //= link_tree ../images | |||
| //= link_directory ../javascripts .js | |||
| //= link_directory ../stylesheets .css | |||
| @@ -0,0 +1,101 @@ | |||
| //= require rails-ujs | |||
| //= require activestorage | |||
| //= require turbolinks | |||
| //= require jquery3 | |||
| //= require popper | |||
| //= require bootstrap-sprockets | |||
| //= require jquery.validate.min | |||
| //= require additional-methods.min | |||
| //= require bootstrap-notify | |||
| //= require jquery.cookie.min | |||
| //= require select2 | |||
| //= require moment.min | |||
| //= require jquery.cxselect | |||
| //= require bootstrap-datepicker | |||
| //= require bootstrap-datetimepicker | |||
| //= require bootstrap.viewer | |||
| //= require jquery.mloading | |||
| //= require jquery-confirm.min | |||
| //= require common | |||
| //= require echarts | |||
| //= require codemirror/lib/codemirror | |||
| //= require codemirror/mode/shell/shell | |||
| //= require editormd/editormd | |||
| //= require editormd/languages/zh-tw | |||
| //= require dragula/dragula | |||
| //= require_tree ./i18n | |||
| //= require_tree ./admins | |||
| $.ajaxSetup({ | |||
| beforeSend: function(xhr) { | |||
| xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); | |||
| } | |||
| }); | |||
| // ******** select2 global config ******** | |||
| $.fn.select2.defaults.set('theme', 'bootstrap4'); | |||
| $.fn.select2.defaults.set('language', 'zh-CN'); | |||
| Turbolinks.setProgressBarDelay(200); | |||
| $.notifyDefaults({ | |||
| type: 'success', | |||
| z_index: 9999, | |||
| delay: 2000 | |||
| }); | |||
| function show_success_flash(){ | |||
| $.notify({ | |||
| message: '操作成功' | |||
| },{ | |||
| type: 'success' | |||
| }); | |||
| } | |||
| $(document).on('turbolinks:load', function(){ | |||
| $('[data-toggle="tooltip"]').tooltip({ trigger : 'hover' }); | |||
| $('[data-toggle="popover"]').popover(); | |||
| // 图片查看大图 | |||
| $('img.preview-image').bootstrapViewer(); | |||
| // flash alert提示框自动关闭 | |||
| if($('.admin-alert-container .alert').length > 0){ | |||
| setTimeout(function(){ | |||
| $('.admin-alert-container .alert:not(.alert-danger)').alert('close'); | |||
| }, 2000); | |||
| setTimeout(function(){ | |||
| $('.admin-alert-container .alert.alert-danger').alert('close'); | |||
| }, 5000); | |||
| } | |||
| }); | |||
| $(document).on("turbolinks:before-cache", function () { | |||
| $('[data-toggle="tooltip"]').tooltip('hide'); | |||
| $('[data-toggle="popover"]').popover('hide'); | |||
| }); | |||
| // var progressBar = new Turbolinks.ProgressBar(); | |||
| // $(document).on('ajax:send', function(event){ | |||
| // console.log('ajax send', event); | |||
| // progressBar.setValue(0) | |||
| // progressBar.show() | |||
| // }); | |||
| // | |||
| // $(document).on('ajax:complete', function(event){ | |||
| // console.log('ajax complete', event); | |||
| // progressBar.setValue(1) | |||
| // progressBar.hide() // 分页时不触发,奇怪 | |||
| // }); | |||
| // $(document).on('ajax:success', function(event){ | |||
| // console.log('ajax success', event); | |||
| // }); | |||
| // $(document).on('ajax:error', function(event){ | |||
| // console.log('ajax error', event); | |||
| // }); | |||
| $(function () { | |||
| }); | |||
| @@ -0,0 +1,5 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-abouts-edit-page, body.admins-abouts-update-page').length > 0) { | |||
| createMDEditor('about-us-editor', {}); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,5 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-agreements-edit-page, body.admins-agreements-update-page').length > 0) { | |||
| createMDEditor('agreement-editor', {}); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,6 @@ | |||
| function show_add_manager(id) { | |||
| $(".auth-schools-user-add").modal("show"); | |||
| $(".auth-schools-user-add").find("#school_id_input").val(id) | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| $(document).on('click', '.batch-all-check-box', function(){ | |||
| var $checkAll = $(this); | |||
| $('.batch-check-box').prop('checked', $checkAll.is(':checked')); | |||
| }) | |||
| $(document).on('click', '.batch-check-box', function(){ | |||
| var allChecked = $('.batch-check-box:checked').length === $('.batch-check-box').length | |||
| $('.batch-all-check-box').prop('checked', allChecked); | |||
| }) | |||
| }); | |||
| @@ -0,0 +1,132 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-carousels-index-page').length > 0) { | |||
| var laboratoryId = $('#carousels-container').data('laboratoryId'); | |||
| var resetNo = function(){ | |||
| $('#carousels-container .custom-carousel-item-no').each(function(index, ele){ | |||
| $(ele).html(index + 1); | |||
| }) | |||
| } | |||
| // 删除后 | |||
| $(document).on('delete_success', resetNo); | |||
| // ------------ 保存链接 ----------- | |||
| $('.carousels-card').on('click', '.save-data-btn', function(){ | |||
| var $link = $(this); | |||
| var id = $link.data('id'); | |||
| var link = $('.custom-carousel-item-' + id).find('.link-input').val(); | |||
| var name = $('.custom-carousel-item-' + id).find('.name-input').val(); | |||
| if(!name || name.length == 0){ | |||
| $.notify({ message: '名称不能为空' },{ type: 'danger' }); | |||
| return; | |||
| } | |||
| $link.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/laboratories/' + laboratoryId + '/carousels/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { link: link, name: name }, | |||
| success: function(data){ | |||
| $.notify({ message: '操作成功' }); | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $link.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // -------------- 是否在首页展示 -------------- | |||
| $('.carousels-card').on('change', '.online-check-box', function(){ | |||
| var $checkbox = $(this); | |||
| var id = $checkbox.data('id'); | |||
| var checked = $checkbox.is(':checked'); | |||
| $checkbox.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/laboratories/' + laboratoryId + '/carousels/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { status: checked }, | |||
| success: function(data){ | |||
| $.notify({ message: '保存成功' }); | |||
| var box = $('.custom-carousel-item-' + id).find('.drag'); | |||
| if(checked){ | |||
| box.removeClass('not_active'); | |||
| }else{ | |||
| box.addClass('not_active'); | |||
| } | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $checkbox.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // ------------ 拖拽 ------------- | |||
| var onDropFunc = function(el, _target, _source, sibling){ | |||
| var moveId = $(el).data('id'); | |||
| var insertId = $(sibling).data('id') || ''; | |||
| $.ajax({ | |||
| url: '/admins/laboratories/' + laboratoryId + '/carousels/drag', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { move_id: moveId, after_id: insertId }, | |||
| success: function(data){ | |||
| resetNo(); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $.notify({message: '移动失败,原因:' + data.message}, {type: 'danger'}); | |||
| } | |||
| }) | |||
| }; | |||
| var ele1 = document.getElementById('carousels-container'); | |||
| dragula([ele1], { mirrorContainer: ele1 }).on('drop', onDropFunc); | |||
| // ----------- 新增 -------------- | |||
| var $createModal = $('.modal.admin-add-carousel-modal'); | |||
| var $createForm = $createModal.find('form.admin-add-carousel-form'); | |||
| $createForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "portal_image[image]": { | |||
| required: true | |||
| }, | |||
| "portal_image[name]": { | |||
| required: true | |||
| }, | |||
| } | |||
| }); | |||
| $createModal.on('show.bs.modal', function(event){ | |||
| resetFileInputFunc($createModal.find('.img-file-input')); | |||
| $createModal.find('.file-names').html('选择文件'); | |||
| }); | |||
| $createModal.on('click', '.submit-btn', function() { | |||
| $createForm.find('.error').html(''); | |||
| if ($createForm.valid()) { | |||
| $createForm.submit(); | |||
| } else { | |||
| $createForm.find('.error').html('请选择图片'); | |||
| } | |||
| }); | |||
| $createModal.on('change', '.img-file-input', function(){ | |||
| var file = $(this)[0].files[0]; | |||
| $createModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| // -------------- 重新上传图片 -------------- | |||
| //replace_image_url | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $carouselItem = $('.custom-carousel-item-' + data.source_id); | |||
| $carouselItem.find('.custom-carousel-item-img img').attr('src', data.url); | |||
| }) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,67 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $refuseModal = $('.admin-common-refuse-modal'); | |||
| if ($refuseModal.length > 0) { | |||
| var $form = $refuseModal.find('form.admin-common-refuse-form'); | |||
| var $applyIdInput = $refuseModal.find('.modal-body input[name="apply_id"]'); | |||
| var $applyTitle = $refuseModal.find('.modal-title'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| reason: { | |||
| required: true, | |||
| maxlength: 200 | |||
| }, | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $refuseModal.on('show.bs.modal', function (event) { | |||
| var $link = $(event.relatedTarget); | |||
| var applyId = $link.data('id'); | |||
| var url = $link.data('url'); | |||
| var title = $link.data('title'); | |||
| var type = $link.data('type'); | |||
| var form_method = "POST"; | |||
| if(typeof title !== 'undefined'){ | |||
| $applyTitle.html(title) | |||
| } | |||
| if(typeof type !== 'undefined'){ | |||
| form_method = type; | |||
| } | |||
| $applyIdInput.val(applyId); | |||
| $form.data('url', url); | |||
| $form.data('type', form_method); | |||
| }); | |||
| // modal visited fire | |||
| $refuseModal.on('shown.bs.modal', function(){ | |||
| $refuseModal.find('.modal-body textarea[name="reason"]').focus(); | |||
| }); | |||
| $refuseModal.on('hide.bs.modal', function () { | |||
| $applyIdInput.val(''); | |||
| $refuseModal.find('.modal-body textarea[name="reason"]').val(''); | |||
| $form.data('url', ''); | |||
| }) | |||
| $refuseModal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| var form_method = $form.data('type'); | |||
| $.ajax({ | |||
| method: form_method, | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| }).done(function(){ | |||
| $refuseModal.modal('hide'); | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,803 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| if ($('body.admins-competition-settings-index-page').length > 0) { | |||
| var dateOptions = { | |||
| autoclose: true, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd', | |||
| startDate: '2017-04-01' | |||
| }; | |||
| var timeOptions = { | |||
| autoclose: 1, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd hh:ii', | |||
| minuteStep: 30 | |||
| }; | |||
| var defineDateRangeSelect = function (element) { | |||
| var options = $.extend({inputs: $(element).find('.start-date, .end-date')}, dateOptions); | |||
| $(element).datepicker(options); | |||
| $(element).find('.start-date').datepicker().on('changeDate', function (e) { | |||
| $(element).find('.end-date').datepicker('setStartDate', e.date); | |||
| }); | |||
| }; | |||
| $(".competition-start-end-date .start-date").datetimepicker(timeOptions); | |||
| $(".competition-start-end-date .end-date").datetimepicker(timeOptions); | |||
| $(".nav-setting-form .enroll_end_time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-start-time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-end-time").datetimepicker(timeOptions); | |||
| defineDateRangeSelect('.teaching-mode-date'); | |||
| // defineTimeRangeSelect('.competition-start-end-date'); | |||
| var $basicForm = $('form.basic-setting-form'); | |||
| $basicForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: "required", | |||
| subTitle: "required", | |||
| startTime: "required", | |||
| endTime: "required", | |||
| mode: "required", | |||
| identifier: "required" | |||
| } | |||
| }); | |||
| // 保存按钮 | |||
| $basicForm.on('click', ".submit-btn", function () { | |||
| $basicForm.find('.submit-btn').attr('disabled', 'disabled'); | |||
| $basicForm.find('.error').html(''); | |||
| var valid = $basicForm.valid(); | |||
| if ($("input[name='mode']:checked").val() == 2) { | |||
| var $courseId = $("input[name='course_id']"); | |||
| if ($courseId.val() === undefined || $courseId.val().length === 0) { | |||
| $courseId.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $courseId.removeClass('danger text-danger'); | |||
| } | |||
| } else if ($("input[name='mode']:checked").val() == 3) { | |||
| var $techStartTime = $("input[name='teach_start_time']"); | |||
| var $techEndTime = $("input[name='teach_end_time']"); | |||
| if ($techStartTime.val() === undefined || $techStartTime.val().length === 0) { | |||
| $techStartTime.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $techStartTime.removeClass('danger text-danger'); | |||
| } | |||
| if ($techEndTime.val() === undefined || $techEndTime.val().length === 0) { | |||
| $techEndTime.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $techEndTime.removeClass('danger text-danger'); | |||
| } | |||
| } else { | |||
| $("input[name='course_id']").removeClass('danger text-danger'); | |||
| $("input[name='teach_start_time']").removeClass('danger text-danger'); | |||
| $("input[name='teach_end_time']").removeClass('danger text-danger'); | |||
| } | |||
| if (!valid) return; | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: $basicForm.attr('action'), | |||
| data: new FormData($basicForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function (data) { | |||
| $.notify({message: '保存成功'}); | |||
| // window.location.reload(); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $basicForm.find('.error').html(data.message); | |||
| }, | |||
| complete: function () { | |||
| $basicForm.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }); | |||
| var selectOptions = { | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的单位名称', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.schools } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name || item.text; | |||
| }, | |||
| templateSelection: function(item){ | |||
| return item.name || item.text; | |||
| } | |||
| }; | |||
| $('.sponsor-select').select2(selectOptions); | |||
| $('.allow-school-select').select2(selectOptions); | |||
| $('.manager-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的管理员姓名', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/users', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.users } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return $("<div class='row px-0'><span class='col-3'>" + item.real_name + "</span><span class='col-5 font-12'>" + item.school_name + "</span><span class='col-4 font-12'>" + item.hidden_phone + "</span></div>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| // 排行榜 | |||
| //链接 | |||
| $(".nav-setting-form").on("click",".add_linkBtn",function () { | |||
| var length=$(".nav-setting-form").find(".linkFormItem").length + 1; | |||
| var html='<div class="row mt-2 align-items-center linkFormItem">\n' + | |||
| ' <div class="col-1 text-right">\n' + | |||
| ' <label class="checkbox checkbox-primary mt-1">\n' + | |||
| ' <input type="checkbox" name="navbar[][hidden]" value="0" hidden class="font-16" checked="checked">\n' + | |||
| ' <input type="checkbox" value="0" class="font-16 module_hidden" checked="checked">\n' + | |||
| ' </label>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-md-label mt-1"><input type="hidden" value="md" name="navbar[][module_type]">\n' + | |||
| ' <input type="text" name="navbar[][name]" value="" class="form-control" placeholder="模块名称"></div>\n' + | |||
| ' <div class="col-md-1 mt-1"><input type="text" name="navbar[][position]" value="" class="form-control" placeholder="位置"></div>\n' + | |||
| ' <div class="col-md-3 mt-1"><input type="text" name="navbar[][url]" value="" class="form-control" placeholder="请输入资料下载地址"></div>\n' + | |||
| ' <a class="mt-1 btn btn-primary waves-effect waves-light btn-xs setBtn_s add_linkBtn" href="javascript:void(0)">+</a>\n' + | |||
| ' <a class="mt-1 btn btn-icon waves-effect btn-default waves-light setBtn_s ml10 del_linkBtn" href="javascript:void(0)">×</a>\n' + | |||
| ' </div>'; | |||
| $(this).parents(".linkFormItem").after(html); | |||
| }); | |||
| $(".nav-setting-form").on("click", ".del_linkBtn", function () { | |||
| $(this).parents(".linkFormItem").remove(); | |||
| }); | |||
| //有关报名要求 | |||
| $(".addRequireBtn").on("click",function () { | |||
| var length=$("#requireForm").find(".requireForm_item").length + 1; | |||
| var html='<div class="row mt-2 mb-4 requireForm_item">\n' + | |||
| ' <div class="col-1 text-right"> </div>\n' + | |||
| ' <div class="col-1 text-left mt-1">\n' + | |||
| ' <input type="text" class="form-control" name="competition_staffs[][minimum]" value="0">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-1 mt-1">\n' + | |||
| ' <input type="text" class="form-control" name="competition_staffs[][maximum]" value="1">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">人</span>\n' + | |||
| ' <div class="col-2 mt-1">\n' + | |||
| ' <select class="form-control" name="competition_staffs[][category]">\n' + | |||
| ' <option value="student">学生</option>\n' + | |||
| ' <option value="teacher">教师</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-2 mt-1">\n' + | |||
| ' <label class="radio checkbox-primary mt-1" value="require_'+length+'_1">\n' + | |||
| ' <input id="require_'+length+'_1" class="mutiple-limited-radio" value="false" checked name="competition_staffs[][mutiple_limited]" type="checkbox">\n' + | |||
| ' <label for="require_'+length+'_1">可多次报名</label>\n' + | |||
| ' </label>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-2 mt-1">\n' + | |||
| ' <label class="radio checkbox-primary mt-1" value="require_'+length+'_2">\n' + | |||
| ' <input id="require_'+length+'_2" class="mutiple-limited-radio" value="true" name="competition_staffs[][mutiple_limited]" type="checkbox">\n' + | |||
| ' <label for="require_'+length+'_2">不可多次报名</label>\n' + | |||
| ' </label>\n' + | |||
| ' <a href="javascript:void(0)" class="ml20 delRequrieBtn">\n' + | |||
| ' <i class="fa fa-times-circle font-20 color-grey-c"></i>\n' + | |||
| ' </a>\n' + | |||
| ' </div>\n' + | |||
| ' </div>'; | |||
| $("#requireForm").append(html); | |||
| }); | |||
| $("#requireForm").on("click",".delRequrieBtn",function () { | |||
| $(this).parents(".requireForm_item").remove(); | |||
| }); | |||
| $('.nav-setting-form').on('click', '.module_hidden', function(){ | |||
| var checkEle = $(this); | |||
| if (checkEle.is(':checked')) { | |||
| checkEle.prev().val(0); | |||
| } else { | |||
| checkEle.prev().val(1); | |||
| } | |||
| }); | |||
| $('.competition-staff-settings').on('click', '.mutiple-limited-radio', function(){ | |||
| var radio = $(this); | |||
| if (radio.is(':checked')) { | |||
| radio.parent().parent().siblings().find('.mutiple-limited-radio').attr('checked', false) | |||
| } else { | |||
| radio.parent().parent().siblings().find('.mutiple-limited-radio').attr('checked', true) | |||
| } | |||
| }); | |||
| var $navForm = $('form.nav-setting-form'); | |||
| $navForm.on('click', ".submit-btn", function () { | |||
| $navForm.find('.submit-btn').attr('disabled', 'disabled'); | |||
| $navForm.find('.error').html(''); | |||
| var valid = $navForm.valid(); | |||
| if (!valid) return; | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: $navForm.attr('action'), | |||
| data: new FormData($navForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function (data) { | |||
| $.notify({message: '保存成功'}); | |||
| // window.location.reload(); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $navForm.find('.error').html(data.message); | |||
| }, | |||
| complete: function () { | |||
| $navForm.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }); | |||
| // 排行榜设置 | |||
| //删除小阶段 | |||
| $("#large_panel").on("click",".small_panel_item_del",function () { | |||
| var list = $(this).parents(".small_panel"); | |||
| $(this).parents(".small_panel_item").remove(); | |||
| for(var i=0;i < $(list).find(".subName").length;i++){ | |||
| console.log(i); | |||
| $(list).find(".subName").eq(i).html("第"+parseInt(i+1)+"阶段"); | |||
| } | |||
| }); | |||
| // $('form.stage-update-form').validate({ | |||
| // errorElement: 'span', | |||
| // errorClass: 'danger text-danger', | |||
| // rules: { | |||
| // stage_name: "required", | |||
| // "stage[][start_time]": "required", | |||
| // "stage[][end_time]": "required", | |||
| // "stage[][mission_count]": { | |||
| // required: true, | |||
| // min: 1 | |||
| // }, | |||
| // "stage[][entry]": { | |||
| // required: true, | |||
| // min: 1 | |||
| // }, | |||
| // score_rate: { | |||
| // required: true, | |||
| // range: [0, 100] | |||
| // } | |||
| // }, | |||
| // messages: { | |||
| // "stage[][mission_count]": { | |||
| // min: ">=1" | |||
| // }, | |||
| // "stage[][entry]": { | |||
| // min: ">=1" | |||
| // }, | |||
| // } | |||
| // }); | |||
| $('.competition-chart-setting').on('click', ".update-stage", function () { | |||
| var updateForm = $(this).parents("form"); | |||
| $(this).attr('disabled', 'disabled'); | |||
| updateForm.find('.error').html(''); | |||
| // var valid = updateForm.valid(); | |||
| var valid = true; | |||
| var $stageName = updateForm.find('input[name="stage_name"]'); | |||
| if($stageName.val() === undefined || $stageName.val().length === 0){ | |||
| $stageName.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $stageName.removeClass('danger text-danger'); | |||
| } | |||
| var $scoreRate = updateForm.find('input[name="score_rate"]'); | |||
| if($scoreRate.val() === undefined || $scoreRate.val().length === 0){ | |||
| $scoreRate.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else if (parseInt($scoreRate.val()) > 100 || parseInt($scoreRate.val()) < 0) { | |||
| $scoreRate.addClass('danger text-danger'); | |||
| $scoreRate.after('<span class="danger text-danger">0-100之间的数值</span>'); | |||
| valid = false; | |||
| } else { | |||
| $scoreRate.removeClass('danger text-danger'); | |||
| $scoreRate.siblings().remove(); | |||
| } | |||
| updateForm.find('input[name="stage[][start_time]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][end_time]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][mission_count]"]').each(function(i, e){ | |||
| var $ele = $(e); | |||
| var $entry = updateForm.find('input[name="stage[][entry]"]').eq(i); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else if (parseInt($ele.val()) < 1) { | |||
| $ele.addClass('danger text-danger'); | |||
| $ele.after('<span class="danger text-danger">大于等于1</span>'); | |||
| valid = false; | |||
| } else if (parseInt($ele.val()) > parseInt($entry.val())) { | |||
| $ele.addClass('danger text-danger'); | |||
| $ele.after('<span class="danger text-danger">不能大于总任务数</span>'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| $ele.siblings().remove(); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][entry]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else if (parseInt($ele.val()) < 1) { | |||
| $ele.addClass('danger text-danger'); | |||
| $ele.after('<span class="danger text-danger">大于等于1</span>'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| $ele.siblings().remove(); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][identifiers][]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| if (!valid) return; | |||
| updateForm.find('input[name="stage[][mission_count]"]').each(function(_, e){ | |||
| var $missionCount = $(e); | |||
| var $entryCount = $(e).parents("div.row").find('input[name="stage[][mission_count]"]'); | |||
| if(parseInt($missionCount.val()) > parseInt($entryCount.val()) ){ | |||
| $missionCount.addClass('danger text-danger'); | |||
| $missionCount.after('<span class="danger text-danger">不能大于总任务数</span>'); | |||
| valid = false; | |||
| } else { | |||
| $missionCount.removeClass('danger text-danger'); | |||
| $missionCount.siblings().remove(); | |||
| } | |||
| }); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: updateForm.attr('action'), | |||
| data: new FormData(updateForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function (data) { | |||
| $.notify({message: '保存成功'}); | |||
| window.location.reload(); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $navForm.find('.error').html(data.message); | |||
| }, | |||
| complete: function () { | |||
| $navForm.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }); | |||
| $(".competition-chart-stages").on("click", ".add-new-tab", function () { | |||
| if($(".new-stage-form").length > 0){ | |||
| alert("请先保存上一个tab"); | |||
| } else { | |||
| var count = parseInt($("#large_panel").find(".large_panel_part").length)+1; | |||
| var html = '<form class="stage-update-form new-stage-form flex-1" action="/admins/competitions/'+$(this).attr("data-competition-id")+'/competition_stages" accept-charset="UTF-8" data-remote="true" method="post">' + | |||
| '<div class="large_panel_part" attr_line="'+count+'"><div class="row d-flex mt-3">\n' + | |||
| ' <span class="col-1 mt-2">tab标题</span>\n' + | |||
| ' <div class="col-2 no_padding">\n' + | |||
| ' <input type="text" class="form-control" name="stage_name"/>\n' + | |||
| ' </div>\n' + | |||
| ' <span class="col-1 text-right mt-2 no_padding">总排行榜占比:</span>\n' + | |||
| ' <div class="col-1 no_padding">\n' + | |||
| ' <input type="number" class="form-control" name="score_rate" value="100"/>\n' + | |||
| ' </div><span class=" mt-2">%</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <a href="javascript:void(0)"class="btn btn-outline-primary export-action ml20 add-task-sub">新增子阶段</a>\n' + | |||
| ' </div>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20" onclick="Del_tab(this)">删除</a>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-outline-primary update-stage export-action ml20">保存</a>\n' + | |||
| ' </div>\n' + | |||
| ' <div id="small_panel_'+count+'" class="small_panel">\n' + | |||
| ' <div class="row d-flex small_panel_item" attr_line="sub_new_new" count="1">\n' + | |||
| ' <span class="mt-2 subName mr10">第1阶段</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <div class="row">\n' + | |||
| ' <div class="row col-6"><span class="mt-2 ml20">有效时间:</span>\n' + | |||
| ' <div class="col-4 no_padding">\n' + | |||
| ' <input type="text" name="stage[][start_time]" id="stage__start_time" value="" autocomplete="off" class="section-start-time form-control" placeholder="有效开始时间">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][end_time]" id="stage__end_time" value="" autocomplete="off" class="section-end-time form-control" placeholder="有效结束时间">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding">总任务数:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <input type="number" class="form-control" onchange="change_total(this)" value="3" name="stage[][entry]">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding">成绩来源:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <select class="form-control" name="stage[][score_source]">\n' + | |||
| ' <option value="0">经验值</option>\n' + | |||
| ' <option value="1">预测准确率</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div></div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="row mt-2" id="task_Input_sub_new_new">\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务1</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务2</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务3</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <span>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20 small_panel_item_del">删除</a>\n' + | |||
| ' </span>\n' + | |||
| ' </div>\n' + | |||
| '</div></div></form>'; | |||
| $("#large_panel").append(html); | |||
| $(".stage-update-form .section-start-time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-end-time").datetimepicker(timeOptions); | |||
| } | |||
| }); | |||
| //新增子阶段 | |||
| $(".competition-chart-stages").on("click", ".add-task-sub", function () { | |||
| var index = $(this).parents(".large_panel_part").attr("attr_line"); | |||
| var count= 0; | |||
| console.log("sdfsf"); | |||
| console.log($("#small_panel_"+index).find(".small_panel_item").length > 0); | |||
| if($("#small_panel_"+index).find(".small_panel_item").length > 0){ | |||
| count = parseInt($("#small_panel_"+index).find(".small_panel_item").last().attr("count")) + 1; | |||
| console.log($("#small_panel_"+index).find(".small_panel_item").last().attr("count")); | |||
| }else{ | |||
| count = 1; | |||
| } | |||
| var showCount=parseInt($("#small_panel_"+index).find(".small_panel_item").length) + 1; | |||
| var html='<div class="row d-flex small_panel_item" attr_line="sub_'+index+'_'+count+'" count="'+count+'">\n' + | |||
| ' <span class="mr10 mt-2 subName">第'+showCount+'阶段</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <div class="row">\n' + | |||
| ' <div class="row col-6"><span class="mt-2 ml20 mr10">有效时间:</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][start_time]" id="stage__start_time" value="" autocomplete="off" class="section-start-time form-control" placeholder="有效开始时间">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][end_time]" id="stage__end_time" value="" autocomplete="off" class="section-end-time form-control" placeholder="有效结束时间">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding mr10">总任务数:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <input type="number" class="form-control" onchange="change_total(this)" value="3" name="stage[][entry]">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 mr10 text-right mt-2 no_padding">成绩来源:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <select class="form-control" name="stage[][score_source]">\n' + | |||
| ' <option value="0">经验值</option>\n' + | |||
| ' <option value="1">预测准确率</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div></div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="row mt-2" id="task_Input_sub_'+index+'_'+count+'">\n'+ | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务1</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务2</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务3</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <span>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20 small_panel_item_del">删除</a>\n' + | |||
| ' </span>\n' + | |||
| ' </div>'; | |||
| $("#small_panel_"+index).append(html); | |||
| $(".stage-update-form .section-start-time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-end-time").datetimepicker(timeOptions); | |||
| }); | |||
| // 奖项设置 | |||
| var $prizeContainer = $('#competition-prize-card'); | |||
| var competitionId = $prizeContainer.data('id'); | |||
| $(document).on('prize.save.success', function(){ | |||
| $.ajax({ | |||
| method: 'GET', | |||
| url: '/admins/competitions/' + competitionId + '/competition_prizes', | |||
| dataType: 'script' | |||
| }) | |||
| }); | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $imageElement; | |||
| if(data.suffix === '_member'){ | |||
| $imageElement = $('.prize-member-image-' + data.source_id); | |||
| } else if(data.suffix === '_team'){ | |||
| $imageElement = $('.prize-team-image-' + data.source_id); | |||
| } else { | |||
| $imageElement = $('.prize-teacher-image-' + data.source_id); | |||
| } | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| }) | |||
| // 生成获奖记录 | |||
| $prizeContainer.on('click', '.generate-prize-user-action', function(){ | |||
| var $link = $(this); | |||
| var generateRequest = function(){ | |||
| return $.ajax({ | |||
| method: 'POST', | |||
| url: '/admins/competitions/' + competitionId + '/competition_prize_users', | |||
| dataType: 'json', | |||
| success: function(data){ | |||
| if(data && data.status === 0){ | |||
| show_success_flash(); | |||
| $link.remove(); | |||
| } else { | |||
| showErrorNotify(data.message); | |||
| } | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| showErrorNotify(data.message); | |||
| } | |||
| }) | |||
| } | |||
| customConfirm({ | |||
| content: '确认生成吗?', | |||
| ok: function () { | |||
| customLoading({ | |||
| ajax: generateRequest | |||
| }) | |||
| } | |||
| }) | |||
| }); | |||
| } else { | |||
| $(document).unbind('prize.save.success'); | |||
| } | |||
| }); | |||
| //添加主办方或者开放范围 | |||
| function addSponsor(item){ | |||
| var html='<div class="sponsor_label">\n' + | |||
| ' <input type="hidden" value="school_id" />\n' + | |||
| ' <span>caicai</span>\n' + | |||
| ' <a href="javascript:void(0)" onclick="del_sponsor(this)">×</a>\n' + | |||
| ' </div>'; | |||
| $(item).parents(".sponsorPanel").append(html); | |||
| } | |||
| //删除 | |||
| function del_sponsor(item){ | |||
| $(item).parents(".sponsor_label").remove(); | |||
| } | |||
| // 小阶段修改总任务数 | |||
| function change_total(item) { | |||
| var count=parseInt($(item).val()); | |||
| var index = $(item).parents(".small_panel_item").attr("attr_line"); | |||
| var indexLarge = $(item).parents(".large_panel_part").attr("attr_line"); | |||
| console.log(indexLarge); | |||
| console.log(index); | |||
| var divCount=parseInt($("#task_Input_"+index).find(".task_Input_div").length); | |||
| var html = ""; | |||
| if(count > divCount){ | |||
| for(var i=0;i < count-divCount ;i++){ | |||
| html+='<div class="col-4 row task_Input_div"><span class="col-4 text-right mt-3 no_padding mr10">任务'+(divCount+i+1)+'</span>\n' + | |||
| '<div class="col-6 no_padding">\n' + | |||
| '<input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| '</div>\n' + | |||
| '</div>'; | |||
| } | |||
| $("#task_Input_"+index).append(html); | |||
| }else{ | |||
| var delCount = divCount - count ; | |||
| console.log(divCount); | |||
| console.log(count); | |||
| var _max=parseInt($("#task_Input_"+index).find(".task_Input_div:last").index()); | |||
| console.log(_max); | |||
| var _get= _max - delCount; | |||
| console.log(_get); | |||
| if(count == 0){ | |||
| $("#task_Input_"+index).empty(); | |||
| }else{ | |||
| $("#task_Input_"+index).find(".task_Input_div:gt("+_get+")").remove(); | |||
| } | |||
| } | |||
| } | |||
| //删除tab | |||
| function Del_tab(item) { | |||
| $(item).parents(".large_panel_part").remove(); | |||
| } | |||
| //新增tab | |||
| function addNewTab(competition_id) { | |||
| if($(".new-stage-form").length > 0){ | |||
| alert("请先保存上一个tab"); | |||
| } else { | |||
| var count = parseInt($("#large_panel").find(".large_panel_part").length)+1; | |||
| var html = '<form class="stage-update-form new-stage-form flex-1" action="/admins/competitions/'+competition_id+'/competition_stages" accept-charset="UTF-8" data-remote="true" method="post">' + | |||
| '<div class="large_panel_part" attr_line="'+count+'"><div class="row d-flex mt-3">\n' + | |||
| ' <span class="col-1 mt-2">tab标题</span>\n' + | |||
| ' <div class="col-2 no_padding">\n' + | |||
| ' <input type="text" class="form-control" name="stage_name"/>\n' + | |||
| ' </div>\n' + | |||
| ' <span class="col-1 text-right mt-2 no_padding">总排行榜占比:</span>\n' + | |||
| ' <div class="col-1 no_padding">\n' + | |||
| ' <input type="number" class="form-control" name="score_rate" value="100"/>\n' + | |||
| ' </div><span class=" mt-2">%</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <a href="javascript:void(0)"class="btn btn-outline-primary export-action ml20 add-task-sub">新增子阶段</a>\n' + | |||
| ' </div>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20" onclick="Del_tab(this)">删除</a>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-outline-primary update-stage export-action ml20">保存</a>\n' + | |||
| ' </div>\n' + | |||
| ' <div id="small_panel_'+count+'" class="small_panel">\n' + | |||
| ' <div class="row d-flex small_panel_item" attr_line="sub_new_new" count="1">\n' + | |||
| ' <span class="mt-2 subName mr10">第1阶段</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <div class="row">\n' + | |||
| ' <div class="row col-6"><span class="mt-2 ml20 mr10">有效时间:</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][start_time]" id="stage__start_time" value="" autocomplete="off" class="section-start-time form-control" placeholder="有效开始时间">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-4 no_padding input_middle">\n' + | |||
| ' <input type="text" name="stage[][end_time]" id="stage__end_time" value="" autocomplete="off" class="section-end-time form-control" placeholder="有效结束时间">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding mr10">总任务数:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <input type="number" class="form-control" onchange="change_total(this)" value="3" name="stage[][entry]">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding mr10">成绩来源:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <select class="form-control" name="stage[][score_source]">\n' + | |||
| ' <option value="0">经验值</option>\n' + | |||
| ' <option value="1">预测准确率</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div></div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="row mt-2" id="task_Input_sub_new_new">\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-3 text-right mt-3 no_padding mr10">任务1</span>\n' + | |||
| ' <div class="col-8 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-3 text-right mt-3 no_padding mr10">任务2</span>\n' + | |||
| ' <div class="col-8 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-3 text-right no_padding mr10 mt-3">任务3</span>\n' + | |||
| ' <div class="col-8 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <span>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20 small_panel_item_del">删除</a>\n' + | |||
| ' </span>\n' + | |||
| ' </div>\n' + | |||
| '</div></div></form>'; | |||
| $("#large_panel").append(html); | |||
| } | |||
| } | |||
| @@ -0,0 +1,148 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-competitions-index-page').length > 0) { | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $imageElement = $('.competition-image-' + data.source_id); | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| }); | |||
| } | |||
| $(".admin-competition-list-form").on("change", '.competitions-hot-select', function () { | |||
| var s_value = $(this).get(0).checked ? 1 : 0; | |||
| var json = {}; | |||
| json["hot"] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/competitions/hot_setting", | |||
| type: "POST", | |||
| dataType:'json', | |||
| data: json, | |||
| success: function(){ | |||
| $.notify({ message: '操作成功' }); | |||
| } | |||
| }); | |||
| }); | |||
| // ============== 新增竞赛 =============== | |||
| var $modal = $('.modal.admin-create-competition-modal'); | |||
| var $form = $modal.find('form.admin-create-competition-form'); | |||
| var $competitionNameInput = $form.find('input[name="competition_name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| competition_name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $competitionNameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| // 导入学生 | |||
| var $importScoreModal = $('.modal.admin-import-competition-score-modal'); | |||
| var $importScoreForm = $importScoreModal.find('form.admin-import-competition-score-form'); | |||
| var $competitionIdInput = $importScoreForm.find('input[name="competition_id"]'); | |||
| $importScoreModal.on('show.bs.modal', function(event){ | |||
| resetFileInputFunc($importScoreModal.find('.upload-file-input')); | |||
| $importScoreModal.find('.file-names').html('选择文件'); | |||
| $importScoreModal.find('.upload-file-input').trigger('click'); | |||
| var $link = $(event.relatedTarget); | |||
| var competitionId = $link.data('competition-id'); | |||
| $competitionIdInput.val(competitionId); | |||
| }); | |||
| $importScoreModal.on('change', '.upload-file-input', function(e){ | |||
| var file = $(this)[0].files[0]; | |||
| $importScoreModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }); | |||
| var importUserFormValid = function(){ | |||
| if($importScoreForm.find('input[name="file"]').val() == undefined || $importScoreForm.find('input[name="file"]').val().length == 0){ | |||
| $importScoreForm.find('.error').html('请选择文件'); | |||
| return false; | |||
| } | |||
| return true; | |||
| }; | |||
| var buildResultMessage = function(data){ | |||
| var messageHtml = "<div>导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条</div>"; | |||
| if(data.fail.length > 0){ | |||
| messageHtml += '<table class="table"><thead class="thead-light"><tr><th>数据</th><th>失败原因</th></tr></thead><tbody>'; | |||
| data.fail.forEach(function(item){ | |||
| messageHtml += '<tr><td>' + item.data + '</td><td>' + item.message + '</td></tr>'; | |||
| }); | |||
| messageHtml += '</tbody></table>' | |||
| } | |||
| return messageHtml; | |||
| }; | |||
| $importScoreModal.on('click', '.submit-btn', function(){ | |||
| $importScoreForm.find('.error').html(''); | |||
| if (importUserFormValid()) { | |||
| $('body').mLoading({ text: '正在导入...' }); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/import_competition_scores', | |||
| data: new FormData($importScoreForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function(data){ | |||
| $('body').mLoading('destroy'); | |||
| $importScoreModal.modal('hide'); | |||
| showMessageModal(buildResultMessage(data), function(){ | |||
| window.location.reload(); | |||
| }); | |||
| }, | |||
| error: function(res){ | |||
| $('body').mLoading('destroy'); | |||
| var data = res.responseJSON; | |||
| $importScoreForm.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,96 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-cooperatives-index-page').length > 0) { | |||
| // ------------ 保存链接 ----------- | |||
| $('.coo-img-card').on('click', '.save-url-btn', function(){ | |||
| var $link = $(this); | |||
| var cooId = $link.data('id'); | |||
| var url = $('.coo-img-item-' + cooId).find('.url-input').val(); | |||
| $link.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/cooperatives/' + cooId, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { url: url }, | |||
| success: function(data){ | |||
| $.notify({ message: '保存成功' }); | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $link.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // ------------ 拖拽 ------------- | |||
| var onDropFunc = function(el, _target, _source, sibling){ | |||
| var moveId = $(el).data('id'); | |||
| var insertId = $(sibling).data('id') || ''; | |||
| $.ajax({ | |||
| url: '/admins/cooperatives/drag', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { move_id: moveId, after_id: insertId }, | |||
| success: function(data){ | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $.notify({message: '移动失败,原因:' + data.message}, {type: 'danger'}); | |||
| } | |||
| }) | |||
| }; | |||
| var ele1 = document.getElementById('coo-img-container-alliance_coop'); | |||
| dragula([ele1], { mirrorContainer: ele1 }).on('drop', onDropFunc); | |||
| var ele2 = document.getElementById('coo-img-container-com_coop'); | |||
| dragula([ele2], { mirrorContainer: ele2 }).on('drop', onDropFunc); | |||
| var ele3 = document.getElementById('coo-img-container-edu_coop'); | |||
| dragula([ele3], { mirrorContainer: ele3 }).on('drop', onDropFunc); | |||
| // ----------- 新增 -------------- | |||
| var $createModal = $('.modal.admin-add-cooperative-modal'); | |||
| var $createForm = $createModal.find('form.admin-add-cooperative-form'); | |||
| $createForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "coo_img[image]": { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| $createModal.on('show.bs.modal', function(event){ | |||
| resetFileInputFunc($createModal.find('.img-file-input')); | |||
| $createModal.find('.file-names').html('选择文件'); | |||
| var $link = $(event.relatedTarget); | |||
| var imgType = $link.data('imgType'); | |||
| $createForm.find('input[name="coo_img[img_type]"]').val(imgType); | |||
| }); | |||
| $createModal.on('click', '.submit-btn', function() { | |||
| $createForm.find('.error').html(''); | |||
| if ($createForm.valid()) { | |||
| $createForm.submit(); | |||
| } else { | |||
| $createForm.find('.error').html('请选择图片'); | |||
| } | |||
| }); | |||
| $createModal.on('change', '.img-file-input', function(){ | |||
| var file = $(this)[0].files[0]; | |||
| $createModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| // -------------- 重新上传图片 -------------- | |||
| //replace_image_url | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $cooImgItem = $('.coo-img-item-' + data.source_id); | |||
| $.post('/admins/cooperatives/'+ data.source_id + '/replace_image_url'); | |||
| $cooImgItem.find('.coo-img-item-img img').attr('src', data.url); | |||
| }) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,66 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-courses-index-page').length > 0) { | |||
| let searchContainer = $(".course-list-form"); | |||
| let searchForm = $("form.search-form",searchContainer); | |||
| searchContainer.on('change', '.course-homepage-show', function(){ | |||
| searchForm.find('input[type="submit"]').trigger('click'); | |||
| }); | |||
| //导出 | |||
| searchContainer.on('click', "#course-export", function () { | |||
| window.location.href = "/admins/courses.xlsx?" + searchForm.serialize(); | |||
| }); | |||
| $(".course-list-container").on("change", '.course-setting-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/courses/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| // 清空 | |||
| searchForm.on('click', '.clear-btn', function () { | |||
| searchForm.find('select[name="status"]').val(''); | |||
| searchForm.find('.school-select').val('').trigger('change'); | |||
| searchForm.find('input[name="keyword"]').val(''); | |||
| searchForm.find('#homepage_show').attr('checked', false); | |||
| searchForm.find('input[type="submit"]').trigger('click'); | |||
| }); | |||
| // ************** 学校选择 ************* | |||
| searchForm.find('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择单位', | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function (params) { | |||
| return {keyword: params.term}; | |||
| }, | |||
| processResults: function (data) { | |||
| return {results: data.schools} | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if (!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function (item) { | |||
| if (item.id) { | |||
| } | |||
| return item.name || item.text; | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,12 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| if ($('body.admins-daily-school-statistics-index-page').length > 0) { | |||
| $('.export-action').on('click', function(){ | |||
| var form = $(".daily-school-statistic-list-form .search-form") | |||
| var exportLink = $(this); | |||
| var keyword = form.find("input[name='keyword']").val(); | |||
| var url = exportLink.data("url").split('?')[0] + "?keyword=" + keyword; | |||
| window.open(url); | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,66 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-dashboards-index-page').length > 0) { | |||
| // 月新增用户 | |||
| var monthChart = echarts.init(document.getElementById('month-active-user')); | |||
| monthChart.setOption({ | |||
| tooltip: { | |||
| show: "true", | |||
| trigger: 'item', | |||
| formatter: '{c0}', | |||
| backgroundColor: 'rgba(0,0,0,0.7)', // 背景 | |||
| padding: [8, 10], //内边距 | |||
| extraCssText: 'box-shadow: 0 0 3px rgba(255, 255, 255, 0.4);', //添加阴影 | |||
| axisPointer: { // 坐标轴指示器,坐标轴触发有效 | |||
| type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' | |||
| } | |||
| }, | |||
| series : [ | |||
| { | |||
| name: '访问来源', | |||
| type: 'pie', | |||
| radius: '55%', | |||
| data: [] | |||
| } | |||
| ] | |||
| }); | |||
| monthChart.showLoading(); | |||
| $.get('/admins/dashboards/month_active_user.json').done(function(data){ | |||
| monthChart.setOption({ | |||
| series: [ | |||
| { data: data.data } | |||
| ] | |||
| }); | |||
| monthChart.hideLoading(); | |||
| }); | |||
| // 近七天评测次数 | |||
| // var evaluateChart = echarts.init(document.getElementById('evaluate-pie')); | |||
| // evaluateChart.setOption({ | |||
| // tooltip: { | |||
| // show: "true", | |||
| // trigger: 'item', | |||
| // formatter: '{c0}', | |||
| // backgroundColor: 'rgba(0,0,0,0.7)', // 背景 | |||
| // padding: [8, 10], //内边距 | |||
| // extraCssText: 'box-shadow: 0 0 3px rgba(255, 255, 255, 0.4);', //添加阴影 | |||
| // axisPointer: { // 坐标轴指示器,坐标轴触发有效 | |||
| // type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' | |||
| // } | |||
| // }, | |||
| // xAxis: { type: 'category', boundaryGap: false, data: [] }, | |||
| // yAxis: { type: 'value' }, | |||
| // series: [{ data: [], type: 'line', areaStyle: {} }] | |||
| // }); | |||
| // evaluateChart.showLoading(); | |||
| // $.get('/admins/dashboards/evaluate.json').done(function(data){ | |||
| // evaluateChart.setOption({ | |||
| // xAxis: { data: data.names }, | |||
| // series: [{ data: data.data }] | |||
| // }); | |||
| // | |||
| // evaluateChart.hideLoading(); | |||
| // }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,173 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-departments-index-page').length > 0) { | |||
| var $searchContainer = $('.department-list-form'); | |||
| var $searchForm = $searchContainer.find('form.search-form'); | |||
| var $list = $('.department-list-container'); | |||
| $searchContainer.on('change', '.form-check-input', function(){ | |||
| $searchForm.find('input[type="submit"]').trigger('click'); | |||
| }); | |||
| // ============== 新建部门 =============== | |||
| var $modal = $('.modal.admin-create-department-modal'); | |||
| var $form = $modal.find('form.admin-create-department-form'); | |||
| var $departmentNameInput = $form.find('input[name="department_name"]'); | |||
| var $schoolSelect = $modal.find('.school-select'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| school_id: { | |||
| required: true | |||
| }, | |||
| department_name: { | |||
| required: true | |||
| } | |||
| }, | |||
| messages: { | |||
| school_id: { | |||
| required: '请选择所属单位' | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $departmentNameInput.val(''); | |||
| $schoolSelect.select2('val', ' '); | |||
| }); | |||
| // ************** 学校选择 ************* | |||
| var matcherFunc = function(params, data){ | |||
| if ($.trim(params.term) === '') { | |||
| return data; | |||
| } | |||
| if (typeof data.text === 'undefined') { | |||
| return null; | |||
| } | |||
| if (data.name && data.name.indexOf(params.term) > -1) { | |||
| var modifiedData = $.extend({}, data, true); | |||
| return modifiedData; | |||
| } | |||
| // Return `null` if the term should not be displayed | |||
| return null; | |||
| }; | |||
| var defineSchoolSelect = function(schools) { | |||
| $schoolSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择所属单位', | |||
| minimumInputLength: 1, | |||
| data: schools, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $('#school_id').val(item.id); | |||
| } | |||
| return item.name || item.text; | |||
| }, | |||
| matcher: matcherFunc | |||
| }); | |||
| } | |||
| $.ajax({ | |||
| url: '/api/schools/for_option.json', | |||
| dataType: 'json', | |||
| type: 'GET', | |||
| success: function(data) { | |||
| defineSchoolSelect(data.schools); | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| // ============= 添加部门管理员 ============== | |||
| var $addMemberModal = $('.admin-add-department-member-modal'); | |||
| var $addMemberForm = $addMemberModal.find('.admin-add-department-member-form'); | |||
| var $memberSelect = $addMemberModal.find('.department-member-select'); | |||
| var $departmentIdInput = $addMemberForm.find('input[name="department_id"]') | |||
| $addMemberModal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| var departmentId = $link.data('department-id'); | |||
| $departmentIdInput.val(departmentId); | |||
| $memberSelect.select2('val', ' '); | |||
| }); | |||
| $memberSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的管理员姓名', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/users', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { name: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.users } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.real_name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| $addMemberModal.on('click', '.submit-btn', function(){ | |||
| $addMemberForm.find('.error').html(''); | |||
| var departmentId = $departmentIdInput.val(); | |||
| var memberIds = $memberSelect.val(); | |||
| if (departmentId && memberIds && memberIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| url: '/admins/departments/' + departmentId + '/department_member', | |||
| data: { user_ids: memberIds } | |||
| }); | |||
| } else { | |||
| $addMemberModal.modal('hide'); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,138 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-disciplines-index-page').length > 0) { | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-discipline-modal'); | |||
| var $form = $modal.find('form.admin-create-discipline-form'); | |||
| var $nameInput = $form.find('input[name="name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $nameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| $(".discipline-list-container").on("change", '.discipline-source-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/disciplines/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| // 导入学生 | |||
| var $importDisciplineModal = $('.modal.admin-import-discipline-modal'); | |||
| var $importDisciplineForm = $importDisciplineModal.find('form.admin-import-discipline-form'); | |||
| $importDisciplineModal.on('show.bs.modal', function(){ | |||
| resetFileInputFunc($importDisciplineModal.find('.upload-file-input')); | |||
| $importDisciplineModal.find('.file-names').html('选择文件'); | |||
| $importDisciplineModal.find('.upload-file-input').trigger('click'); | |||
| }); | |||
| $importDisciplineModal.on('change', '.upload-file-input', function(e){ | |||
| var file = $(this)[0].files[0]; | |||
| $importDisciplineModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }); | |||
| var importDisciplineFormValid = function(){ | |||
| if($importDisciplineForm.find('input[name="file"]').val() == undefined || $importDisciplineForm.find('input[name="file"]').val().length == 0){ | |||
| $importDisciplineForm.find('.error').html('请选择文件'); | |||
| return false; | |||
| } | |||
| return true; | |||
| }; | |||
| var buildResultMessage = function(data){ | |||
| var messageHtml = "<div>导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条</div>"; | |||
| return messageHtml; | |||
| }; | |||
| $importDisciplineModal.on('click', '.submit-btn', function(){ | |||
| $importDisciplineForm.find('.error').html(''); | |||
| if (importDisciplineFormValid()) { | |||
| $('body').mLoading({ text: '正在导入...' }); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/import_disciplines', | |||
| data: new FormData($importDisciplineForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function(data){ | |||
| $('body').mLoading('destroy'); | |||
| $importDisciplineModal.modal('hide'); | |||
| showMessageModal(buildResultMessage(data), function(){ | |||
| window.location.reload(); | |||
| }); | |||
| }, | |||
| error: function(res){ | |||
| $('body').mLoading('destroy'); | |||
| var data = res.responseJSON; | |||
| $importDisciplineForm.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| // ------------ 上移/下移 ------------- | |||
| $('.discipline-list-container').on('click', ".move-action", function () { | |||
| var $doAction = $(this); | |||
| var disciplineId = $doAction.data('id'); | |||
| var opr = $doAction.data('opr'); | |||
| $.ajax({ | |||
| url: '/admins/disciplines/' + disciplineId + '/adjust_position', | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| data: {opr: opr} | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,70 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-ec-templates-index-page').length > 0) { | |||
| var add_modal = $(".ec-templates-new-add"); | |||
| var template_file_name = add_modal.find(".template-file-upload"); | |||
| var attachment_id_input = add_modal.find(".template_attachment_id"); | |||
| var template_container = $(".ec-templates-list-container"); | |||
| //编辑附件 | |||
| template_container.on("click", ".edit-template-content", function () { | |||
| var t_id = $(this).attr("data-id"); | |||
| var t_name = $(this).attr("data-name"); | |||
| var template_name = $(this).attr("data-template-name"); | |||
| var t_msg = $(this).attr("data-msg"); | |||
| var template_id = $(this).attr("data-template-id"); | |||
| add_modal.modal("show"); | |||
| add_modal.find(".template_add_title").html(t_msg); | |||
| attachment_id_input.val(template_id); | |||
| add_modal.find(".template_show_id").val(t_id); | |||
| add_modal.find("input[name='name']").val(t_name); | |||
| add_modal.find("i.delete-template-icon").attr("data-id", template_id); | |||
| if(template_id !== "-1"){ | |||
| template_file_name.find("span.template-file-input").hide(); | |||
| template_file_name.find("span.template_file_show").show(); | |||
| template_file_name.find("span.template_file_show_title").html(template_name); | |||
| } | |||
| }); | |||
| //删除附件 | |||
| add_modal.on("click",".delete-template-icon",function () { | |||
| var attachment_id = $(this).attr("data-id"); | |||
| $.ajax({ | |||
| url: "/api/attachments/" + attachment_id, | |||
| type: "delete", | |||
| contentType:"application/json", | |||
| dataType:"json", | |||
| success: function (data) { | |||
| template_file_name.find("span.template-file-input").show(); | |||
| template_file_name.find("span.template_file_show").hide(); | |||
| attachment_id_input.attr("value","-1") | |||
| } | |||
| }) | |||
| }); | |||
| //上传附件 | |||
| add_modal.on("change", "#upload_template_file",function () { | |||
| var template = document.getElementById('upload_template_file').files[0]; | |||
| var file_content = new FormData(); | |||
| file_content.append("file", template); | |||
| $.ajax({ | |||
| type: "POST", | |||
| url: "/api/attachments", | |||
| data:file_content, | |||
| contentType: false, | |||
| processData: false, | |||
| success: function (data) { | |||
| template_file_name.find("span.template-file-input").hide(); | |||
| template_file_name.find("span.template_file_show").show(); | |||
| template_file_name.find("span.template_file_show_title").html(template.name); | |||
| template_file_name.find("i.delete-template-icon").attr("data-id",data.id); | |||
| attachment_id_input.val(data.id) | |||
| } | |||
| }) | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,9 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if($('body.admins-enroll-lists-index-page').length > 0){ | |||
| var search_form = $(".search-form"); | |||
| //导出 | |||
| $(".competition-enroll-list-form").on("click","#enroll-lists-export",function () { | |||
| window.location.href = "/admins/competitions/"+$(this).attr("data-competition-id")+"/enroll_lists/export.xlsx?" + search_form.serialize(); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,22 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-examination-authentications-index-page').length > 0) { | |||
| var $searchFrom = $('.examination-authentication-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $('.batch-action-container').hide(); | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $('.batch-action-container').show(); | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,13 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if($(".admins-graduation-standards-index-page").length > 0){ | |||
| $(".admin-body-container").on("click", ".standard-create-modal", function () { | |||
| var content = $(this).attr("data-content"); | |||
| var g_id = $(this).attr("data-id"); | |||
| var g_msg = $(this).attr("data-msg"); | |||
| $("#graduation-modal-type").html(g_msg); | |||
| $("#graduation_standard_id").val(g_id); | |||
| $("textarea[name='content']").val(content); | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,5 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-help-centers-edit-page, body.admins-help-centers-update-page').length > 0) { | |||
| createMDEditor('help-center-editor', {}); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,50 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-identity-authentications-index-page').length > 0) { | |||
| var $searchFrom = $('.identity-authentication-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $('.batch-action-container').hide(); | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $('.batch-action-container').show(); | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| $('.batch-agree-btn').on('click', function(){ | |||
| if($('.batch-check-box:checked').length === 0){ | |||
| $.notify({ message: '请先选择数据' }, { type: 'info' }); | |||
| return; | |||
| } | |||
| customConfirm({ | |||
| content: '确认审核通过?', | |||
| ok: function(){ | |||
| var ids = $('.batch-check-box:checked').map(function(_, e){ return $(e).val() }).get(); | |||
| $.ajax({ | |||
| url: '/admins/identity_authentications/batch_agree', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { ids: ids }, | |||
| success: function(data){ | |||
| $.notify({ message: '操作成功' }); | |||
| window.location.reload(); | |||
| }, | |||
| error: function(res){ | |||
| $.notify({ message: res.responseJSON.message }, { type: 'danger' }); | |||
| } | |||
| }) | |||
| } | |||
| }) | |||
| }) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,22 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-item-authentications-index-page').length > 0) { | |||
| var $searchFrom = $('.item-authentication-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $('.batch-action-container').hide(); | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $('.batch-action-container').show(); | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,86 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-laboratory-settings-show-page, body.admins-laboratory-settings-update-page').length > 0) { | |||
| var $container = $('.edit-laboratory-setting-container'); | |||
| var $form = $container.find('.edit_laboratory'); | |||
| $('.logo-item-left, .banner-item-bottom').on("change", 'input[type="file"]', function () { | |||
| var $fileInput = $(this); | |||
| var file = this.files[0]; | |||
| var imageType = /image.*/; | |||
| if (file && file.type.match(imageType)) { | |||
| var reader = new FileReader(); | |||
| reader.onload = function () { | |||
| var $box = $fileInput.parent(); | |||
| $box.find('img').attr('src', reader.result).css('display', 'block'); | |||
| $box.addClass('has-img'); | |||
| }; | |||
| reader.readAsDataURL(file); | |||
| } else { | |||
| } | |||
| }); | |||
| createMDEditor('laboratory-footer-editor', { height: 200, placeholder: '请输入备案信息' }); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| errorPlacement:function(error,element){ | |||
| if(element.parent().hasClass("input-group")){ | |||
| element.parent().after(error); | |||
| }else{ | |||
| element.after(error) | |||
| } | |||
| }, | |||
| rules: { | |||
| identifier: { | |||
| required: true, | |||
| checkSite: true | |||
| }, | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| $.validator.addMethod("checkSite",function(value,element,params){ | |||
| var checkSite = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/; | |||
| return this.optional(element)||(checkSite.test(value + '.educoder.com')); | |||
| },"域名不合法!"); | |||
| $form.on('click', '.submit-btn', function(){ | |||
| $form.find('.submit-btn').attr('disabled', 'disabled'); | |||
| $form.find('.error').html(''); | |||
| var valid = $form.valid(); | |||
| $('input[name="navbar[][name]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| if(!valid) return; | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| url: $form.attr('action'), | |||
| data: new FormData($form[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function(data){ | |||
| $.notify({ message: '保存成功' }); | |||
| window.location.reload(); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| }, | |||
| complete: function(){ | |||
| $form.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,189 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-laboratories-index-page').length > 0) { | |||
| var $searchContainer = $('.laboratory-list-form'); | |||
| var $searchForm = $searchContainer.find('form.search-form'); | |||
| var $list = $('.laboratory-list-container'); | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-laboratory-modal'); | |||
| var $form = $modal.find('form.admin-create-laboratory-form'); | |||
| var $schoolSelect = $modal.find('.school-select'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| school_id: { | |||
| required: true | |||
| } | |||
| }, | |||
| messages: { | |||
| school_id: { | |||
| required: '请选择所属单位' | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $schoolSelect.select2('val', ' '); | |||
| }); | |||
| // ************** 学校选择 ************* | |||
| var matcherFunc = function(params, data){ | |||
| if ($.trim(params.term) === '') { | |||
| return data; | |||
| } | |||
| if (typeof data.text === 'undefined') { | |||
| return null; | |||
| } | |||
| if (data.name && data.name.indexOf(params.term) > -1) { | |||
| var modifiedData = $.extend({}, data, true); | |||
| return modifiedData; | |||
| } | |||
| // Return `null` if the term should not be displayed | |||
| return null; | |||
| }; | |||
| var defineSchoolSelect = function(schools) { | |||
| $schoolSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择单位', | |||
| minimumInputLength: 1, | |||
| data: schools, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $('#school_id').val(item.id); | |||
| } | |||
| return item.name || item.text; | |||
| }, | |||
| matcher: matcherFunc | |||
| }); | |||
| }; | |||
| $.ajax({ | |||
| url: '/api/schools/for_option.json', | |||
| dataType: 'json', | |||
| type: 'GET', | |||
| success: function(data) { | |||
| defineSchoolSelect(data.schools); | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| // ============= 添加管理员 ============== | |||
| var $addMemberModal = $('.admin-add-laboratory-user-modal'); | |||
| var $addMemberForm = $addMemberModal.find('.admin-add-laboratory-user-form'); | |||
| var $memberSelect = $addMemberModal.find('.laboratory-user-select'); | |||
| var $laboratoryIdInput = $addMemberForm.find('input[name="laboratory_id"]') | |||
| $addMemberModal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| var laboratoryId = $link.data('laboratory-id'); | |||
| $laboratoryIdInput.val(laboratoryId); | |||
| $memberSelect.select2('val', ' '); | |||
| }); | |||
| $memberSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的管理员姓名', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/users', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { name: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.users } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.hidden_phone + "</span></span>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| $addMemberModal.on('click', '.submit-btn', function(){ | |||
| $addMemberForm.find('.error').html(''); | |||
| var laboratoryId = $laboratoryIdInput.val(); | |||
| var memberIds = $memberSelect.val(); | |||
| if (laboratoryId && memberIds && memberIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| url: '/admins/laboratories/' + laboratoryId + '/laboratory_user', | |||
| data: { user_ids: memberIds } | |||
| }); | |||
| } else { | |||
| $addMemberModal.modal('hide'); | |||
| } | |||
| }); | |||
| $(".laboratory-list-container").on("change", '.laboratory-sync-course', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var json = {}; | |||
| $.ajax({ | |||
| url: "/admins/laboratories/" + s_id + "/update_sync_course", | |||
| type: "POST", | |||
| dataType:'script', | |||
| data: json | |||
| }) | |||
| }); | |||
| $(".laboratory-list-container").on("change", '.laboratory-sync-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/laboratories/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,126 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-laboratory-shixuns-index-page').length > 0) { | |||
| var $searchForm = $('.laboratory-shixun-list-form .search-form'); | |||
| var laboratoryId = $('.laboratory-shixun-list-container').data('id'); | |||
| $searchForm.find('select#tag_id').select2({ | |||
| placeholder: "请选择", | |||
| allowClear: true | |||
| }); | |||
| // 定义状态切换监听事件 | |||
| var defineStatusChangeFunc = function (doElement, undoElement, url, callback) { | |||
| $('.laboratory-shixun-list-container').on('click', doElement, function () { | |||
| var $doAction = $(this); | |||
| var $undoAction = $doAction.siblings(undoElement); | |||
| var laboratoryShixunId = $doAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认进行该操作吗?', | |||
| ok: function () { | |||
| $.ajax({ | |||
| url: '/admins/laboratories/' + laboratoryId + '/laboratory_shixuns/' + laboratoryShixunId + url, | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function () { | |||
| show_success_flash(); | |||
| $doAction.hide(); | |||
| $undoAction.show(); | |||
| if (callback && typeof callback === "function") { | |||
| callback(laboratoryShixunId, url); | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| } | |||
| // 首页展示与取消首页展示 | |||
| var homepageShowCallback = function (laboratoryShixunId, url) { | |||
| var $laboratoryShixunItem = $('.laboratory-shixun-list-container').find('.laboratory-shixun-item-' + laboratoryShixunId); | |||
| if (url === '/homepage') { | |||
| $laboratoryShixunItem.find('.homepage-badge').show(); | |||
| } else { | |||
| $laboratoryShixunItem.find('.homepage-badge').hide(); | |||
| } | |||
| } | |||
| defineStatusChangeFunc('.homepage-show-action', '.homepage-hide-action', '/homepage', homepageShowCallback); | |||
| defineStatusChangeFunc('.homepage-hide-action', '.homepage-show-action', '/cancel_homepage', homepageShowCallback); | |||
| // 添加实训功能 | |||
| var $addModal = $('.modal.admin-add-laboratory-shixun-modal'); | |||
| var $addForm = $addModal.find('form.admin-add-laboratory-user-form'); | |||
| var $shixunSelect = $addForm.find('select.shixun-select'); | |||
| $addModal.on('show.bs.modal', function(){ | |||
| $addModal.find('.error').html(''); | |||
| $shixunSelect.select2('val', ' '); | |||
| }); | |||
| $shixunSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入实训名称/创建者检索', | |||
| multiple: true, | |||
| closeOnSelect: false, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/laboratories/' + laboratoryId + '/shixuns_for_select', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term, page: params.page || 1, per_page: 20 }; | |||
| }, | |||
| processResults: function(data, params){ | |||
| params.page = params.page || 1; | |||
| return { | |||
| results: data.shixuns, | |||
| pagination: { | |||
| more: (params.page * 20) < data.count | |||
| } | |||
| }; | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| var ele = '<span>' | |||
| ele += '<span>' + item.name + '</span>'; | |||
| ele += '<span class="font-12"> -- ' + item.creator_name + '</span>'; | |||
| ele += '<span class="font-12"> -- ' + item.status_text+ '</span>'; | |||
| ele += '</span>'; | |||
| return $(ele); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| var ele = '<span>' + (item.name || item.text) + '<span class="font-12"> -- ' + item.creator_name + '</span></span>' | |||
| return $(ele); | |||
| } | |||
| }); | |||
| $addModal.on('click', '.submit-btn', function(){ | |||
| $addModal.find('.error').html(''); | |||
| var shixunIds = $shixunSelect.val(); | |||
| if (shixunIds && shixunIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/laboratories/' + laboratoryId + '/laboratory_shixuns', | |||
| data: { shixun_ids: shixunIds }, | |||
| success: function(){ | |||
| show_success_flash(); | |||
| window.location.reload(); | |||
| }, | |||
| error: function(res){ | |||
| $addModal.find('.error').html(res.responseJSON.message); | |||
| } | |||
| }); | |||
| } else { | |||
| $addModal.find('.error').html('请选择实训'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,148 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-laboratory-subjects-index-page').length > 0) { | |||
| var $searchForm = $('.laboratory-subject-list-form .search-form'); | |||
| var laboratoryId = $('.laboratory-subject-list-container').data('id'); | |||
| // ************** 学校选择 ************* | |||
| $searchForm.find('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择创建者单位', | |||
| allowClear: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function (params) { | |||
| return {keyword: params.term}; | |||
| }, | |||
| processResults: function (data) { | |||
| return {results: data.schools} | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if (!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function (item) { | |||
| if (item.id) { | |||
| } | |||
| return item.name || item.text; | |||
| } | |||
| }); | |||
| // 定义状态切换监听事件 | |||
| var defineStatusChangeFunc = function (doElement, undoElement, url, callback) { | |||
| $('.laboratory-subject-list-container').on('click', doElement, function () { | |||
| var $doAction = $(this); | |||
| var $undoAction = $doAction.siblings(undoElement); | |||
| var laboratorySubjectId = $doAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认进行该操作吗?', | |||
| ok: function () { | |||
| $.ajax({ | |||
| url: '/admins/laboratories/' + laboratoryId + '/laboratory_subjects/' + laboratorySubjectId + url, | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function () { | |||
| show_success_flash(); | |||
| $doAction.hide(); | |||
| $undoAction.show(); | |||
| if (callback && typeof callback === "function") { | |||
| callback(laboratorySubjectId, url); | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| } | |||
| // 首页展示与取消首页展示 | |||
| var homepageShowCallback = function (laboratoryShixunId, url) { | |||
| var $laboratoryShixunItem = $('.laboratory-subject-list-container').find('.laboratory-subject-item-' + laboratoryShixunId); | |||
| if (url === '/homepage') { | |||
| $laboratoryShixunItem.find('.homepage-badge').show(); | |||
| } else { | |||
| $laboratoryShixunItem.find('.homepage-badge').hide(); | |||
| } | |||
| } | |||
| defineStatusChangeFunc('.homepage-show-action', '.homepage-hide-action', '/homepage', homepageShowCallback); | |||
| defineStatusChangeFunc('.homepage-hide-action', '.homepage-show-action', '/cancel_homepage', homepageShowCallback); | |||
| // 添加实践课程功能 | |||
| var $addModal = $('.modal.admin-add-laboratory-subject-modal'); | |||
| var $addForm = $addModal.find('form.admin-add-laboratory-user-form'); | |||
| var $subjectSelect = $addForm.find('select.subject-select'); | |||
| $addModal.on('show.bs.modal', function(){ | |||
| $addModal.find('.error').html(''); | |||
| $subjectSelect.select2('val', ' '); | |||
| }); | |||
| $subjectSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入课程名称/创建者检索', | |||
| multiple: false, | |||
| closeOnSelect: true, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/laboratories/' + laboratoryId + '/subjects_for_select', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term, page: params.page || 1, per_page: 20 } | |||
| }, | |||
| processResults: function(data, params){ | |||
| params.page = params.page || 1; | |||
| return { | |||
| results: data.subjects, | |||
| pagination: { | |||
| more: (params.page * 20) < data.count | |||
| } | |||
| }; | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| var ele = '<span>'; | |||
| ele += '<span>' + item.name + '</span>'; | |||
| ele += '<span class="font-12"> -- ' + item.creator_name + '</span>'; | |||
| ele += '<span class="font-12"> -- ' + item.status_text+ '</span>'; | |||
| ele += '</span>'; | |||
| return $(ele); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if(!item.id || item.id === '') return item.text; | |||
| var ele = '<span>' + (item.name || item.text) + '<span class="font-12"> -- ' + item.creator_name + '</span></span>'; | |||
| return $(ele); | |||
| } | |||
| }); | |||
| $addModal.on('click', '.submit-btn', function(){ | |||
| $addModal.find('.error').html(''); | |||
| var subjectIds = $subjectSelect.val(); | |||
| if (subjectIds && subjectIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/laboratories/' + laboratoryId + '/laboratory_subjects', | |||
| data: { subject_id: subjectIds }, | |||
| success: function(){ | |||
| show_success_flash(); | |||
| window.location.reload(); | |||
| }, | |||
| error: function(res){ | |||
| $addModal.find('.error').html(res.responseJSON.message); | |||
| } | |||
| }); | |||
| } else { | |||
| $addModal.find('.error').html('请选择课程'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,20 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-library-applies-index-page').length > 0) { | |||
| var $searchFrom = $('.library-applies-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,13 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-major-informations-index-page').length > 0) { | |||
| var box_contain = $(".major-informations-list-container"); | |||
| box_contain.on("click",".collapse-item",function () { | |||
| var a_fa = $(this).find("i"); | |||
| if(a_fa.hasClass("fa-caret-right")){ | |||
| a_fa.removeClass("fa-caret-right").addClass("fa-caret-down"); | |||
| }else{ | |||
| a_fa.removeClass("fa-caret-down").addClass("fa-caret-right"); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,22 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-message-modal'); | |||
| var $submitBtn = $modal.find('.submit-btn'); | |||
| if ($modal.length > 0) { | |||
| $modal.on('hide.bs.modal', function(){ | |||
| $modal.find('.modal-body').html(''); | |||
| $submitBtn.unbind(); | |||
| }); | |||
| } | |||
| }); | |||
| function showMessageModal(html, callback) { | |||
| var $modal = $('.modal.admin-message-modal'); | |||
| var $submitBtn = $modal.find('.submit-btn'); | |||
| $submitBtn.unbind(); | |||
| if(callback !== undefined && typeof callback === 'function'){ | |||
| $submitBtn.on('click', callback); | |||
| } | |||
| $modal.find('.modal-body').html(html); | |||
| $modal.modal('show'); | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-mirror-repositories-edit-page, body.admins-mirror-repositories-update-page').length > 0) { | |||
| var $form = $('form.edit-mirror'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "mirror_repository[type_name]": { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| $form.submit(function(e){ | |||
| if(!$form.valid()){ e.preventDefault(); } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,4 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-mirror-repositories-index-page').length > 0) { | |||
| } | |||
| }); | |||
| @@ -0,0 +1,33 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-mirror-scripts-edit-page, body.admins-mirror-scripts-update-page, body.admins-mirror-scripts-new-page, body.admins-mirror-scripts-create-page').length > 0) { | |||
| var $form = $('form.script-form'); | |||
| // codemirror编辑器 | |||
| var scriptEditor = CodeMirror.fromTextArea(document.getElementById('mirror_script_script'), { | |||
| lineNumbers: true, | |||
| mode: 'shell', | |||
| theme: "default", | |||
| indentUnit: 4, //代码缩进为一个tab的距离 | |||
| matchBrackets: true, | |||
| autoRefresh: true, | |||
| smartIndent: true,//智能换行 | |||
| styleActiveLine: true, | |||
| lint: true | |||
| }); | |||
| scriptEditor.setSize('auto', '600px'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "mirror_script[script_type]": { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| $form.submit(function(e){ | |||
| if(!$form.valid()){ e.preventDefault(); } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,32 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-choose-mirror-modal', function(){ | |||
| var $modal = $('.modal.admin-choose-mirror-modal'); | |||
| var $form = $modal.find('form.admin-choose-mirror-form'); | |||
| var validateForm = function(){ | |||
| var checkedValue = $form.find('input[name="mirror_number"]:checked').val(); | |||
| if(checkedValue == undefined){ | |||
| $modal.find('.error').html('必须选择一种镜像保存!'); | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if (validateForm()) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| }).done(function(){ | |||
| $modal.modal('hide'); | |||
| }); | |||
| } | |||
| }); | |||
| }) | |||
| }); | |||
| @@ -0,0 +1,34 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-department-modal', function(){ | |||
| var $modal = $('.modal.admin-edit-department-modal'); | |||
| var $form = $modal.find('form.admin-edit-department-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'department[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| }, | |||
| 'department[host_count]': { | |||
| digits: true | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| }); | |||
| }) | |||
| }); | |||
| @@ -0,0 +1,42 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-discipline-modal', function () { | |||
| var $modal = $('.modal.admin-edit-discipline-modal'); | |||
| var $form = $modal.find('form.admin-edit-discipline-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'discipline[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', submit_edit_form); | |||
| $form.find("#discipline_name").keydown(function (e) { | |||
| var ev = e || event; | |||
| var keycode = ev.which || ev.keyCode; | |||
| if (keycode == 13) { | |||
| submit_edit_form(); | |||
| return false; | |||
| } | |||
| }); | |||
| function submit_edit_form() { | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| } | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,31 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-repertoire-modal', function(){ | |||
| var $modal = $('.modal.admin-edit-repertoire-modal'); | |||
| var $form = $modal.find('form.admin-edit-repertoire-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'repertoire[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,43 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-sub-discipline-modal', function () { | |||
| var $modal = $('.modal.admin-edit-sub-discipline-modal'); | |||
| var $form = $modal.find('form.admin-edit-sub-discipline-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'sub_discipline[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', submit_edit_form); | |||
| $form.find("#sub_discipline_name").keydown(function (e) { | |||
| var ev = e || event; | |||
| var keycode = ev.which || ev.keyCode; | |||
| if (keycode == 13) { | |||
| submit_edit_form(); | |||
| return false; | |||
| } | |||
| }); | |||
| function submit_edit_form() { | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| } | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,31 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-sub-repertoire-modal', function(){ | |||
| var $modal = $('.modal.admin-edit-sub-repertoire-modal'); | |||
| var $form = $modal.find('form.admin-edit-sub-repertoire-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'sub_repertoire[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,18 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-subject-modal', function () { | |||
| var $modal = $('.modal.admin-edit-subject-modal'); | |||
| var $form = $modal.find('form.admin-edit-subject-form'); | |||
| $modal.on('click', '.submit-btn', function () { | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| }); | |||
| }) | |||
| }); | |||
| @@ -0,0 +1,42 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-tag-discipline-modal', function () { | |||
| var $modal = $('.modal.admin-edit-tag-discipline-modal'); | |||
| var $form = $modal.find('form.admin-edit-tag-discipline-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'tag_discipline[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', submit_edit_form); | |||
| $form.find("#tag_discipline_name").keydown(function (e) { | |||
| var ev = e || event; | |||
| var keycode = ev.which || ev.keyCode; | |||
| if (keycode == 13) { | |||
| submit_edit_form(); | |||
| return false; | |||
| } | |||
| }); | |||
| function submit_edit_form() { | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| } | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,31 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-tag-repertoire-modal', function(){ | |||
| var $modal = $('.modal.admin-edit-tag-repertoire-modal'); | |||
| var $form = $modal.find('form.admin-edit-tag-repertoire-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'tag_repertoire[name]': { | |||
| required: true, | |||
| maxlength: 20 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: 'PATCH', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize() | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,78 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-import-course-member-modal'); | |||
| if ($modal.length > 0) { | |||
| var $form = $modal.find('form.admin-import-course-member-form'); | |||
| var resetFileInputFunc = function(file){ | |||
| file.after(file.clone().val("")); | |||
| file.remove(); | |||
| } | |||
| $modal.on('show.bs.modal', function(){ | |||
| $modal.find('.file-names').html('选择文件'); | |||
| $modal.find('.upload-file-input').trigger('click'); | |||
| }); | |||
| $modal.on('hide.bs.modal', function(){ | |||
| resetFileInputFunc($modal.find('.upload-file-input')); | |||
| }); | |||
| $modal.on('change', '.upload-file-input', function(e){ | |||
| var file = $(this)[0].files[0]; | |||
| $modal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| var importFormValid = function(){ | |||
| if($form.find('input[name="file"]').val() == undefined || $form.find('input[name="file"]').val().length == 0){ | |||
| $form.find('.error').html('请选择文件'); | |||
| return false; | |||
| } | |||
| return true; | |||
| }; | |||
| var buildResultMessage = function(data){ | |||
| var messageHtml = "<div>导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条</div>"; | |||
| if(data.fail.length > 0){ | |||
| messageHtml += '<table class="table"><thead class="thead-light"><tr><th>数据</th><th>失败原因</th></tr></thead><tbody>'; | |||
| data.fail.forEach(function(item){ | |||
| messageHtml += '<tr><td>' + item.data + '</td><td>' + item.message + '</td></tr>'; | |||
| }); | |||
| messageHtml += '</tbody></table>' | |||
| } | |||
| return messageHtml; | |||
| } | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if (importFormValid()) { | |||
| $('body').mLoading({ text: '正在导入...' }); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/import_course_members', | |||
| data: new FormData($form[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function(data){ | |||
| $('body').mLoading('destroy'); | |||
| $modal.modal('hide'); | |||
| showMessageModal(buildResultMessage(data), function(){ | |||
| window.location.reload(); | |||
| }); | |||
| }, | |||
| error: function(res){ | |||
| $('body').mLoading('destroy'); | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,60 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-merge-course-list-modal'); | |||
| if ($modal.length > 0) { | |||
| var $form = $modal.find('form.admin-merge-course-list-form'); | |||
| var $originCourseListIdInput = $form.find('input[name="origin_course_list_id"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| course_list_name: { | |||
| required: true | |||
| } | |||
| }, | |||
| messages: { | |||
| course_list_name: { | |||
| required: '请输入课程名称' | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function (event) { | |||
| var $link = $(event.relatedTarget); | |||
| var couresListId = $link.data('courseListId'); | |||
| var url = $link.data('url'); | |||
| $originCourseListIdInput.val(couresListId); | |||
| $form.data('url', url); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '操作成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,111 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-merge-department-modal'); | |||
| if ($modal.length > 0) { | |||
| var $form = $modal.find('form.admin-merge-department-form'); | |||
| var $schoolIdInput = $form.find('input[name="school_id"]'); | |||
| var $originDepartmentIdInput = $form.find('input[name="origin_department_id"]'); | |||
| var $departmentSelect = $modal.find('.department-select'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| department_id: { | |||
| required: true | |||
| } | |||
| }, | |||
| messages: { | |||
| department_id: { | |||
| required: '请选择部门' | |||
| } | |||
| } | |||
| }); | |||
| // ************** 学校选择 ************* | |||
| var matcherFunc = function(params, data){ | |||
| if ($.trim(params.term) === '') { | |||
| return data; | |||
| } | |||
| if (typeof data.text === 'undefined') { | |||
| return null; | |||
| } | |||
| if (data.name && data.name.indexOf(params.term) > -1) { | |||
| var modifiedData = $.extend({}, data, true); | |||
| return modifiedData; | |||
| } | |||
| // Return `null` if the term should not be displayed | |||
| return null; | |||
| }; | |||
| var defineDepartmentSelect = function(departments) { | |||
| $departmentSelect.empty(); | |||
| $departmentSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择所属部门', | |||
| data: departments, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $form.find('#department_id').val(item.id); | |||
| } | |||
| return item.name || item.text; | |||
| }, | |||
| matcher: matcherFunc | |||
| }); | |||
| $departmentSelect.select2('val', ' '); | |||
| }; | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function (event) { | |||
| var $link = $(event.relatedTarget); | |||
| var schoolId = $link.data('schoolId'); | |||
| var url = $link.data('url'); | |||
| $schoolIdInput.val(schoolId); | |||
| $originDepartmentIdInput.val($link.data('departmentId')); | |||
| $form.data('url', url); | |||
| $.ajax({ | |||
| url: '/api/schools/' + schoolId + '/departments/for_option.json', | |||
| dataType: 'json', | |||
| type: 'GET', | |||
| success: function(data) { | |||
| defineDepartmentSelect(data.departments); | |||
| } | |||
| }); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '操作成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,89 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-replace-mirror-modal'); | |||
| if ($modal.length > 0) { | |||
| var $form = $modal.find('form.admin-replace-mirror-form'); | |||
| var $mirrorIdInput = $modal.find('.modal-body input[name="mirror_id"]'); | |||
| var $mirrorSelect = $modal.find('.new-mirror-select'); | |||
| var setMirror = function(id, name){ | |||
| $mirrorIdInput.val(id); | |||
| $form.find('.mirror-id-container').html(id); | |||
| $form.find('.mirror-name-container').html(name); | |||
| } | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| new_mirror_id: { | |||
| required: true | |||
| }, | |||
| }, | |||
| messages: { | |||
| new_mirror_id: { | |||
| required: '请选择新镜像' | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function (event) { | |||
| var $link = $(event.relatedTarget); | |||
| var mirrorId = $link.data('id'); | |||
| var mirrorName = $link.data('name'); | |||
| setMirror(mirrorId, mirrorName); | |||
| $mirrorSelect.select2('val', ' '); | |||
| }); | |||
| $modal.on('hide.bs.modal', function () { | |||
| setMirror('', ''); | |||
| $mirrorSelect.select2('val', ' '); | |||
| $('#new_mirror_id-error').remove(); | |||
| }); | |||
| $mirrorSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '输入要合并的镜像名', | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| url: '/admins/mirror_repositories/for_select', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.mirrors } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $('#new_mirror_id-error').remove(); | |||
| $('#new_mirror_id').val(item.id); | |||
| } | |||
| return item.name || item.text; | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| }).done(function(){ | |||
| $modal.modal('hide'); | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,46 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| $('.admin-modal-container').on('show.bs.modal', '.admin-save-competition-prize-modal', function(event){ | |||
| var $modal = $('.modal.admin-save-competition-prize-modal'); | |||
| var $form = $modal.find('form.admin-save-competition-prize-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| 'competition_prize[name]': { | |||
| required: true, | |||
| maxlength: 10 | |||
| }, | |||
| 'competition_prize[num]': { | |||
| required: true, | |||
| digits: true, | |||
| min: 1 | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| var url = $form.attr('action'); | |||
| var formMethod = $form.data('form-method') | |||
| if ($form.valid()) { | |||
| $.ajax({ | |||
| method: formMethod, | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(data){ | |||
| if(data && data.status === 0) { | |||
| show_success_flash(); | |||
| $(document).trigger('prize.save.success'); | |||
| $modal.modal('hide'); | |||
| } else { | |||
| $modal.find('.error').html(data.message) | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }) | |||
| }); | |||
| @@ -0,0 +1,90 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-select-school-modal'); | |||
| if ($modal.length > 0) { | |||
| var $link = null; | |||
| var $form = $modal.find('form.admin-select-school-form'); | |||
| var multiple = $form.data('multiple'); | |||
| $form.find('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择', | |||
| multiple: multiple, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function (params) { | |||
| return {keyword: params.term}; | |||
| }, | |||
| processResults: function (data) { | |||
| return {results: data.schools} | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if (!item.id || item.id === '') return item.text; | |||
| var html = "<span>" + item.name + "<span class='ml-4 font-12'>"; | |||
| if(item.province){ html += item.province } | |||
| html += "</span></span>"; | |||
| return $(html); | |||
| }, | |||
| templateSelection: function (item) { | |||
| if (item.id) { | |||
| } | |||
| return item.name || item.text; | |||
| } | |||
| }); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| school_ids: { | |||
| required: true | |||
| } | |||
| }, | |||
| messages: { | |||
| school_ids: { | |||
| required: '请选择' | |||
| } | |||
| } | |||
| }); | |||
| $modal.on('show.bs.modal', function(event){ | |||
| $link = $(event.relatedTarget); | |||
| }); | |||
| $modal.on('hide.bs.modal', function(){ | |||
| $form.find('.error').html(''); | |||
| $form.find('.school-select').select2('val', ' '); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if($form.valid()){ | |||
| var url = $form.data('url'); | |||
| var schoolIds = $form.find('#school_ids').val(); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: { school_ids: schoolIds }, | |||
| success: function(){ | |||
| $.notify({ message: '操作成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,66 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $modal = $('.modal.admin-upload-file-modal'); | |||
| if ($modal.length > 0) { | |||
| var $form = $modal.find('form.admin-upload-file-form') | |||
| var $sourceIdInput = $modal.find('input[name="source_id"]'); | |||
| var $sourceTypeInput = $modal.find('input[name="source_type"]'); | |||
| var $suffixInput = $modal.find('input[name="suffix"]'); | |||
| $modal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| var sourceId = $link.data('sourceId'); | |||
| var sourceType = $link.data('sourceType'); | |||
| var suffix = $link.data('suffix'); | |||
| $sourceIdInput.val(sourceId); | |||
| $sourceTypeInput.val(sourceType); | |||
| if(suffix != undefined){ $suffixInput.val(suffix); } | |||
| $modal.find('.upload-file-input').trigger('click'); | |||
| }); | |||
| $modal.find('.upload-file-input').on('change', function(e){ | |||
| var file = $(this)[0].files[0]; | |||
| if(file){ | |||
| $modal.find('.file-names').html(file.name); | |||
| $modal.find('.submit-btn').trigger('click'); | |||
| } | |||
| }) | |||
| var formValid = function(){ | |||
| if($form.find('input[name="file"]').val() == undefined || $form.find('input[name="file"]').val().length == 0){ | |||
| $form.find('.error').html('请选择文件'); | |||
| return false; | |||
| } | |||
| return true; | |||
| }; | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if (formValid()) { | |||
| var formDataString = $form.serialize(); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/files?' + formDataString, | |||
| data: new FormData($form[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function(data){ | |||
| $.notify({ message: '上传成功' }); | |||
| $modal.find('.file-names').html(''); | |||
| $modal.trigger('upload:success', data); | |||
| $modal.modal('hide'); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,50 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-professional-authentications-index-page').length > 0) { | |||
| var $searchFrom = $('.professional-authentication-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $('.batch-action-container').hide(); | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $('.batch-action-container').show(); | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| $('.batch-agree-btn').on('click', function(){ | |||
| if($('.batch-check-box:checked').length === 0){ | |||
| $.notify({ message: '请先选择数据' }, { type: 'info' }); | |||
| return; | |||
| } | |||
| customConfirm({ | |||
| content: '确认审核通过?', | |||
| ok: function(){ | |||
| var ids = $('.batch-check-box:checked').map(function(_, e){ return $(e).val() }).get(); | |||
| $.ajax({ | |||
| url: '/admins/professional_authentications/batch_agree', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { ids: ids }, | |||
| success: function(data){ | |||
| $.notify({ message: '操作成功' }); | |||
| window.location.reload(); | |||
| }, | |||
| error: function(res){ | |||
| $.notify({ message: res.responseJSON.message }, { type: 'danger' }); | |||
| } | |||
| }) | |||
| } | |||
| }) | |||
| }) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,20 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-project-package-applies-index-page').length > 0) { | |||
| var $searchFrom = $('.project-package-applies-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('all'); | |||
| if($link.data('value') === 'all'){ | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,65 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-repertoires-index-page').length > 0) { | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-repertoire-modal'); | |||
| var $form = $modal.find('form.admin-create-repertoire-form'); | |||
| var $nameInput = $form.find('input[name="name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $nameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| $(".repertoire-list-container").on("change", '.repertoire-source-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/repertoires/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,119 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-salesman-channels-index-page').length > 0) { | |||
| // ============= 添加销售人员 ============== | |||
| var $addMemberModal = $('.admin-add-salesman-channel-user-modal'); | |||
| var $addMemberForm = $addMemberModal.find('.admin-add-salesman-channel-user-form'); | |||
| var $memberSelect = $addMemberModal.find('.salesman-channel-user-select'); | |||
| var $form = $addMemberModal.find('form.admin-add-salesman-user-form'); | |||
| // 搜索 | |||
| var searchscForm = $(".saleman-channel-list-form .search-form"); | |||
| $addMemberModal.on('show.bs.modal', function(event){ | |||
| $memberSelect.select2('val', ' '); | |||
| }); | |||
| $memberSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的单位', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/schools', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.schools } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return ''; | |||
| return $("<span>" + item.name + "</span>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.name || ''; | |||
| } | |||
| }); | |||
| $addMemberModal.on('click', '.submit-btn', function(){ | |||
| $addMemberForm.find('.error').html(''); | |||
| // var salesmanId = $salesmanIdInput.val(); | |||
| var memberIds = $memberSelect.val(); | |||
| if (memberIds && memberIds.length > 0) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $addMemberModal.modal('hide'); | |||
| searchscForm.find('input[name="keyword"]').val(''); | |||
| setTimeout(function(){ | |||
| submitForm(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $addMemberForm.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } else { | |||
| $addMemberModal.modal('hide'); | |||
| } | |||
| }); | |||
| // 清空 | |||
| searchscForm.on('click', '.clear-btn', function () { | |||
| searchscForm.find('.start_date').val(''); | |||
| searchscForm.find('.end_date').val('').trigger('change'); | |||
| searchscForm.find('input[name="keyword"]').val(''); | |||
| }); | |||
| // 时间跨度 | |||
| var baseOptions = { | |||
| autoclose: true, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd', | |||
| startDate: '2017-04-01' | |||
| }; | |||
| var defineDateRangeSelect = function(element){ | |||
| var options = $.extend({inputs: $(element).find('.start-date, .end-date')}, baseOptions); | |||
| $(element).datepicker(options); | |||
| $(element).find('.start-date').datepicker().on('changeDate', function(e){ | |||
| $(element).find('.end-date').datepicker('setStartDate', e.date); | |||
| }); | |||
| }; | |||
| defineDateRangeSelect('.grow-date-input-daterange'); | |||
| // 区间搜索 | |||
| searchscForm.on('click', ".search-btn", function(){ | |||
| submitForm(); | |||
| }); | |||
| var submitForm = function(){ | |||
| var url = searchscForm.data('search-form-url'); | |||
| var form = searchscForm; | |||
| $.ajax({ | |||
| url: url, | |||
| data: form.serialize(), | |||
| dataType: "script" | |||
| }) | |||
| }; | |||
| } | |||
| }); | |||
| @@ -0,0 +1,82 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-salesman-customers-index-page').length > 0) { | |||
| // ============= 添加销售人员 ============== | |||
| var $addMemberModal = $('.admin-add-salesman-customer-user-modal'); | |||
| var $addMemberForm = $addMemberModal.find('.admin-add-salesman-customer-user-form'); | |||
| var $memberSelect = $addMemberModal.find('.salesman-customer-user-select'); | |||
| var $salesmanIdInput = $('.salesman-customer-list-form').find(".btn-primary"); | |||
| $addMemberModal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| // var salesmanId = $link.data('salesman_id'); | |||
| // $salesmanIdInput.val(salesmanId); | |||
| $memberSelect.select2('val', ' '); | |||
| }); | |||
| $memberSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的销售姓名', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/users', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { name: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.users } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.hidden_phone + "</span></span>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| $addMemberModal.on('click', '.submit-btn', function(){ | |||
| $addMemberForm.find('.error').html(''); | |||
| // var salesmanId = $salesmanIdInput.val(); | |||
| var memberIds = $memberSelect.val(); | |||
| if (memberIds && memberIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/salesman_customers/batch_add', | |||
| data: { salesman_id: $salesmanIdInput.data("salesman-id"), user_ids: memberIds }, | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $addMemberModal.modal('hide'); | |||
| setTimeout(function(){ | |||
| listForm(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } else { | |||
| $addMemberModal.modal('hide'); | |||
| } | |||
| }); | |||
| var listForm = function(){ | |||
| $.ajax({ | |||
| url: '/admins/salesman_customers?salesman_id='+ $salesmanIdInput.data("salesman-id"), | |||
| dataType: "script" | |||
| }); | |||
| }; | |||
| } | |||
| }); | |||
| @@ -0,0 +1,99 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-salesmans-index-page').length > 0) { | |||
| // ============= 添加销售人员 ============== | |||
| var $addMemberModal = $('.admin-add-salesman-user-modal'); | |||
| var $addMemberForm = $addMemberModal.find('.admin-add-salesman-user-form'); | |||
| var $memberSelect = $addMemberModal.find('.salesman-user-select'); | |||
| // var $salesmanIdInput = $addMemberForm.find('input[name="salesman_id"]') | |||
| $addMemberModal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| // var salesmanId = $link.data('salesman-id'); | |||
| // $salesmanIdInput.val(salesmanId); | |||
| $memberSelect.select2('val', ' '); | |||
| }); | |||
| $memberSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的销售姓名', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/admins/users', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { name: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.users } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.hidden_phone + "</span></span>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| $addMemberModal.on('click', '.submit-btn', function(){ | |||
| $addMemberForm.find('.error').html(''); | |||
| // var salesmanId = $salesmanIdInput.val(); | |||
| var memberIds = $memberSelect.val(); | |||
| if (memberIds && memberIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/salesmans/batch_add', | |||
| data: { user_ids: memberIds }, | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $addMemberModal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } else { | |||
| $addMemberModal.modal('hide'); | |||
| } | |||
| }); | |||
| $(".salesman-list-container").on("change", '.salesman-sync-course', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var json = {}; | |||
| $.ajax({ | |||
| url: "/admins/salesmans/" + s_id + "/update_sync_course", | |||
| type: "POST", | |||
| dataType:'script', | |||
| data: json | |||
| }) | |||
| }); | |||
| $(".salesman-list-container").on("change", '.salesman-sync-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/salesmans/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,135 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| if ($('body.admins-school-statistics-index-page').length > 0) { | |||
| var searchForm = $(".school-statistic-list-form .search-form"); | |||
| var growFormUrl = searchForm.data('grow-form-url'); | |||
| var contrastFormUrl = searchForm.data('contrast-form-url'); | |||
| var dataTypeInput = searchForm.find("input[name='data_type']"); | |||
| var keywordInput = searchForm.find("input[name='keyword']"); | |||
| var contrastBtn = searchForm.find(".contrast-btn"); | |||
| var growBtn = searchForm.find(".grow-btn"); | |||
| var contrastDateContainer = searchForm.find('.contrast-date-container'); | |||
| var growDateContainer = searchForm.find('.grow-date-container'); | |||
| // 数据对比日期输入框 | |||
| var beginDateInput = searchForm.find("input[name='begin_date']"); | |||
| var endDateInput = searchForm.find("input[name='end_date']"); | |||
| var otherBeginDateInput = searchForm.find("input[name='other_begin_date']"); | |||
| var otherEndDateInput = searchForm.find("input[name='other_end_date']"); | |||
| // 新增数据日期输入框 | |||
| var growBeginDateInput = searchForm.find("input[name='grow_begin_date']"); | |||
| var growEndDateInput = searchForm.find("input[name='grow_end_date']"); | |||
| // 数据展示切换: 数据对比、新增数据 | |||
| searchForm.on('click', ".contrast-btn", function(){ | |||
| if(contrastBtn.hasClass("active")) { return } | |||
| changeDataType("contrast"); | |||
| submitForm(); | |||
| }); | |||
| searchForm.on('click', ".grow-btn", function(){ | |||
| if(growBtn.hasClass("active")) { return } | |||
| changeDataType("grow"); | |||
| submitForm(); | |||
| }); | |||
| // 搜索按钮 | |||
| searchForm.on('click', ".search-btn", function(){ | |||
| console.log('submit'); | |||
| submitForm(); | |||
| }); | |||
| $('.school-statistic-list-container').on('change', '.contrast-column-select', function() { | |||
| searchForm.find("input[name='contrast_column']").val($('.contrast-column-select').val()); | |||
| submitForm(); | |||
| }); | |||
| var submitForm = function(){ | |||
| if(!validateFrom()) { return } | |||
| var form = searchForm; | |||
| var url = dataTypeInput.val() == "contrast" ? contrastFormUrl : growFormUrl; | |||
| $.ajax({ | |||
| url: url, | |||
| data: form.serialize(), | |||
| dataType: "script" | |||
| }) | |||
| }; | |||
| var validateFrom = function(){ | |||
| if (dataTypeInput.val() != "contrast") { return true; } | |||
| // 全部为空时,需要展示空数据页 | |||
| if (beginDateInput.val() == "" && endDateInput.val() == "" && | |||
| otherBeginDateInput.val() == "" && otherBeginDateInput.val() == "") { | |||
| return true; | |||
| } | |||
| if (beginDateInput.val() != "" && endDateInput.val() != "" && | |||
| otherBeginDateInput.val() != "" && otherBeginDateInput.val() != "") { | |||
| return true; | |||
| } | |||
| return false; | |||
| }; | |||
| var changeDataType = function(dataType){ | |||
| if (dataTypeInput.val() == dataType) { return } | |||
| if (dataType == "contrast") { | |||
| contrastBtn.addClass("active"); | |||
| growBtn.removeClass("active"); | |||
| dataTypeInput.val('contrast'); | |||
| growDateContainer.hide(); | |||
| contrastDateContainer.show(); | |||
| clearGrowDateInput(); | |||
| } else { | |||
| contrastBtn.removeClass("active"); | |||
| growBtn.addClass("active"); | |||
| dataTypeInput.val('grow'); | |||
| growDateContainer.show(); | |||
| contrastDateContainer.hide(); | |||
| clearContrastDateInput(); | |||
| } | |||
| }; | |||
| var clearGrowDateInput = function() { | |||
| searchForm.find("input[name='grow_begin_date']").val(''); | |||
| searchForm.find("input[name='grow_end_date']").val(''); | |||
| searchForm.find("input[name='grow_date_input']").val(''); | |||
| }; | |||
| var clearContrastDateInput = function(){ | |||
| searchForm.find("input[name='begin_date']").val(''); | |||
| searchForm.find("input[name='end_date']").val(''); | |||
| searchForm.find("input[name='other_begin_date']").val(''); | |||
| searchForm.find("input[name='other_end_date']").val(''); | |||
| searchForm.find("input[name='date_input']").val(''); | |||
| searchForm.find("input[name='other_date_input']").val(''); | |||
| }; | |||
| var baseOptions = { | |||
| autoclose: true, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd', | |||
| startDate: '2017-04-01', | |||
| endDate: '-1d' | |||
| } | |||
| var defineDateRangeSelect = function(element){ | |||
| var options = $.extend({inputs: $(element).find('.start-date, .end-date')}, baseOptions); | |||
| $(element).datepicker(options); | |||
| $(element).find('.start-date').datepicker().on('changeDate', function(e){ | |||
| $(element).find('.end-date').datepicker('setStartDate', e.date); | |||
| }) | |||
| }; | |||
| defineDateRangeSelect('.grow-date-input-daterange'); | |||
| defineDateRangeSelect('.date-input-daterange'); | |||
| defineDateRangeSelect('.other-date-input-daterange'); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,4 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-schools-index-page').length > 0) { | |||
| } | |||
| }); | |||
| @@ -0,0 +1,10 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| var $tabs = $('.search-form-container .search-form-tabs'); | |||
| if ($tabs.length > 0) { | |||
| $tabs.on('click', '.search-form-tab', function(){ | |||
| var $activeTab = $(this); | |||
| $tabs.find('.search-form-tab').removeClass('active'); | |||
| $activeTab.addClass('active'); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,20 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-shixun-authorizations-index-page').length > 0) { | |||
| var $searchFrom = $('.shixun-authorization-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,24 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| if ($('body.admins-shixun-feedback-messages-index-page').length > 0) { | |||
| $(".content-img img").addClass("w-20").addClass("preview-image"); | |||
| var baseOptions = { | |||
| autoclose: true, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd 00:00:00', | |||
| startDate: '2017-04-01' | |||
| }; | |||
| var defineDateRangeSelect = function(element){ | |||
| var options = $.extend({inputs: $(element).find('.start-date, .end-date')}, baseOptions); | |||
| $(element).datepicker(options); | |||
| $(element).find('.start-date').datepicker().on('changeDate', function(e){ | |||
| $(element).find('.end-date').datepicker('setStartDate', e.date); | |||
| }); | |||
| }; | |||
| defineDateRangeSelect('.grow-date-input-daterange'); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,70 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-shixun-settings-index-page').length > 0) { | |||
| let searchContainer = $(".shixun-settings-list-form"); | |||
| let searchForm = $("form.search-form",searchContainer); | |||
| searchContainer.on('change', '.shixun-settings-select', function(){ | |||
| searchForm.find('input[type="submit"]').trigger('click'); | |||
| }); | |||
| //导出 | |||
| searchContainer.on('click',"#shixun-settings-export",function () { | |||
| window.location.href = "/admins/shixun_settings.xls?" + searchForm.serialize(); | |||
| }); | |||
| // 基础数据导出 | |||
| searchContainer.on('click', "#shixun-settings-base-export", function () { | |||
| window.location.href = "/admins/shixun_settings.xls?base_data=1" + searchForm.serialize(); | |||
| }); | |||
| $(".shixun-settings-list-container").on("change", '.shixun-setting-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| var s_index = $(this).parent("td").siblings(".shixun-line-no").text(); | |||
| json[s_name] = s_value; | |||
| json["page_no"] = s_index; | |||
| $.ajax({ | |||
| url: "/admins/shixun_settings/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| $(".shixun-settings-list-container").on("change", '.repertoire-setting-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/shixun_settings/" + s_id + "/update_tag_repertoires", | |||
| type: "POST", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| $("select#settings-tag-choosed").select2({ | |||
| placeholder: "请选择分类", | |||
| allowClear: true | |||
| }); | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| if(data.suffix == '_weapp'){ | |||
| var $imageElement = $('.shixun-weapp-image-' + data.source_id); | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| } else { | |||
| var $imageElement = $('.shixun-image-' + data.source_id); | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| } | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,14 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if($('body.admins-shixuns-index-page').length > 0){ | |||
| $('select#tag-choosed').select2({ | |||
| placeholder: "请选择分类", | |||
| allowClear: true | |||
| }); | |||
| var search_form = $(".search-form"); | |||
| //导出 | |||
| $(".shixuns-list-form").on("click","#shixuns-export",function () { | |||
| window.location.href = "/admins/shixuns.xls?" + search_form.serialize(); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,16 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| $('#sidebarCollapse').on('click', function () { | |||
| $(this).toggleClass('active'); | |||
| $('#sidebar').toggleClass('active'); | |||
| $.cookie('admin_sidebar_collapse', $(this).hasClass('active'), {path: '/admins'}); | |||
| }); | |||
| var sidebarController = $('#sidebar').data('current-controller'); | |||
| if (sidebarController.length > 0) { | |||
| $('#sidebar a.active').removeClass('active'); | |||
| $('#sidebar ul.collapse.show').removeClass('show'); | |||
| var activeLi = $('#sidebar a[data-controller="' + sidebarController + '"]'); | |||
| activeLi.addClass('active'); | |||
| activeLi.parent().parent('ul.collapse').addClass('show'); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,89 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| if ($('body.admins-sub-disciplines-index-page').length > 0) { | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-sub-discipline-modal'); | |||
| var $form = $modal.find('form.admin-create-sub-discipline-form'); | |||
| var $nameInput = $form.find('input[name="name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $nameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', submit_create_form); | |||
| $nameInput.keydown(function (e) { | |||
| var ev = e || event; | |||
| var keycode = ev.which || ev.keyCode; | |||
| if (keycode == 13) { | |||
| submit_create_form(); | |||
| return false; | |||
| } | |||
| }); | |||
| function submit_create_form() { | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function () { | |||
| $.notify({message: '创建成功'}); | |||
| $modal.modal('hide'); | |||
| setTimeout(function () { | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| $(".sub-discipline-list-container").on("change", '.sub-discipline-source-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/sub_disciplines/" + s_id, | |||
| type: "PUT", | |||
| dataType: 'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| // ------------ 上移/下移 ------------- | |||
| $('.sub-discipline-list-container').on('click', ".move-action", function () { | |||
| var $doAction = $(this); | |||
| var objectId = $doAction.data('id'); | |||
| var opr = $doAction.data('opr'); | |||
| $.ajax({ | |||
| url: '/admins/sub_disciplines/' + objectId + '/adjust_position', | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| data: {opr: opr} | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,65 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-sub-repertoires-index-page').length > 0) { | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-sub-repertoire-modal'); | |||
| var $form = $modal.find('form.admin-create-sub-repertoire-form'); | |||
| var $nameInput = $form.find('input[name="name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $nameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| $(".sub-repertoire-list-container").on("change", '.sub-repertoire-source-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/sub_repertoires/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,20 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-subject-authorizations-index-page').length > 0) { | |||
| var $searchFrom = $('.subject-authorization-list-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('processed'); | |||
| if($link.data('value') === 'processed'){ | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,72 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| if ($('body.admins-subject-settings-index-page').length > 0) { | |||
| var $form = $('.subject-setting-list-form'); | |||
| // ************** 学校选择 ************* | |||
| $form.find('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择创建者单位', | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function (params) { | |||
| return {keyword: params.term}; | |||
| }, | |||
| processResults: function (data) { | |||
| return {results: data.schools} | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if (!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function (item) { | |||
| if (item.id) { | |||
| } | |||
| return item.name || item.text; | |||
| } | |||
| }); | |||
| $(".subject-setting-list-container").on("change", '.subject-setting-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/subject_settings/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }) | |||
| }); | |||
| // 清空 | |||
| $form.on('click', '.clear-btn', function () { | |||
| $form.find('select[name="status"]').val(''); | |||
| $form.find('.school-select').val('').trigger('change'); | |||
| $form.find('input[name="keyword"]').val(''); | |||
| $form.find('#homepage_show').attr('checked', false); | |||
| $form.find('#excellent').attr('checked', false); | |||
| $form.find('input[type="submit"]').trigger('click'); | |||
| }); | |||
| // 上传图片 | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function (e, data) { | |||
| if(data.suffix == '_qrcode'){ | |||
| var $imageElement = $('.subject-weapp-image-' + data.source_id); | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| } else { | |||
| var $imageElement = $('.subject-image-' + data.source_id); | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,99 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| if ($('body.admins-subjects-index-page').length > 0) { | |||
| var $form = $('.subject-list-form'); | |||
| // ************** 学校选择 ************* | |||
| $form.find('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请选择创建者单位', | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function (params) { | |||
| return {keyword: params.term}; | |||
| }, | |||
| processResults: function (data) { | |||
| return {results: data.schools} | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if (!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function (item) { | |||
| if (item.id) { | |||
| } | |||
| return item.name || item.text; | |||
| } | |||
| }); | |||
| // 清空 | |||
| $form.on('click', '.clear-btn', function () { | |||
| $form.find('select[name="status"]').val(''); | |||
| $form.find('.school-select').val('').trigger('change'); | |||
| $form.find('input[name="keyword"]').val(''); | |||
| $form.find('#homepage_show').attr('checked', false); | |||
| $form.find('#excellent').attr('checked', false); | |||
| $form.find('input[type="submit"]').trigger('click'); | |||
| }); | |||
| // 定义状态切换监听事件 | |||
| var defineStatusChangeFunc = function (doElement, undoElement, url, callback) { | |||
| $('.subject-list-container').on('click', doElement, function () { | |||
| var $doAction = $(this); | |||
| var $undoAction = $doAction.siblings(undoElement); | |||
| var subjectId = $doAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认进行该操作吗?', | |||
| ok: function () { | |||
| $.ajax({ | |||
| url: '/admins/subjects/' + subjectId + url, | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function () { | |||
| show_success_flash(); | |||
| $doAction.hide(); | |||
| $undoAction.show(); | |||
| if (callback && typeof callback === "function") { | |||
| callback(subjectId, url); | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| } | |||
| // 隐藏与取消隐藏 | |||
| defineStatusChangeFunc('.hide-action', '.active-action', '/hide'); | |||
| defineStatusChangeFunc('.active-action', '.hide-action', '/cancel_hide'); | |||
| // 首页展示与取消首页展示 | |||
| var homepageShowCallback = function (subjectId, url) { | |||
| var $subjectItem = $('.subject-list-container').find('.subject-item-' + subjectId); | |||
| if (url === '/homepage_show') { | |||
| $subjectItem.find('.homepage-show-badge').show(); | |||
| } else { | |||
| $subjectItem.find('.homepage-show-badge').hide(); | |||
| } | |||
| } | |||
| defineStatusChangeFunc('.homepage-show-action', '.homepage-hide-action', '/homepage_show', homepageShowCallback); | |||
| defineStatusChangeFunc('.homepage-hide-action', '.homepage-show-action', '/cancel_homepage_show', homepageShowCallback); | |||
| // 设为金课与取消金课 | |||
| var excellentCallback = function (subjectId, url) { | |||
| var $subjectItem = $('.subject-list-container').find('.subject-item-' + subjectId); | |||
| if (url === '/excellent') { | |||
| $subjectItem.find('.excellent-badge').show(); | |||
| } else { | |||
| $subjectItem.find('.excellent-badge').hide(); | |||
| } | |||
| } | |||
| defineStatusChangeFunc('.excellent-action', '.cancel-excellent-action', '/excellent', excellentCallback); | |||
| defineStatusChangeFunc('.cancel-excellent-action', '.excellent-action', '/cancel_excellent', excellentCallback); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,90 @@ | |||
| $(document).on('turbolinks:load', function () { | |||
| if ($('body.admins-tag-disciplines-index-page').length > 0) { | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-tag-discipline-modal'); | |||
| var $form = $modal.find('form.admin-create-tag-discipline-form'); | |||
| var $nameInput = $form.find('input[name="name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $nameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', submit_create_form); | |||
| $nameInput.keydown(function (e) { | |||
| var ev = e || event; | |||
| var keycode = ev.which || ev.keyCode; | |||
| if (keycode == 13) { | |||
| submit_create_form(); | |||
| return false; | |||
| } | |||
| }); | |||
| function submit_create_form() { | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function () { | |||
| $.notify({message: '创建成功'}); | |||
| $modal.modal('hide'); | |||
| setTimeout(function () { | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| $(".tag-discipline-list-container").on("change", '.tag-discipline-source-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/tag_disciplines/" + s_id, | |||
| type: "PUT", | |||
| dataType: 'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| // ------------ 上移/下移 ------------- | |||
| $('.tag-discipline-list-container').on('click', ".move-action", function () { | |||
| var $doAction = $(this); | |||
| var objectId = $doAction.data('id'); | |||
| var opr = $doAction.data('opr'); | |||
| $.ajax({ | |||
| url: '/admins/tag_disciplines/' + objectId + '/adjust_position', | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| data: {opr: opr} | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,65 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-tag-repertoires-index-page').length > 0) { | |||
| // ============== 新建 =============== | |||
| var $modal = $('.modal.admin-create-tag-repertoire-modal'); | |||
| var $form = $modal.find('form.admin-create-tag-repertoire-form'); | |||
| var $nameInput = $form.find('input[name="name"]'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $modal.on('show.bs.modal', function () { | |||
| $nameInput.val(''); | |||
| }); | |||
| $modal.on('click', '.submit-btn', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var url = $form.data('url'); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: url, | |||
| data: $form.serialize(), | |||
| success: function(){ | |||
| $.notify({ message: '创建成功' }); | |||
| $modal.modal('hide'); | |||
| setTimeout(function(){ | |||
| window.location.reload(); | |||
| }, 500); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $form.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| $(".tag-repertoire-list-container").on("change", '.tag-repertoire-source-form', function () { | |||
| var s_id = $(this).attr("data-id"); | |||
| var s_value = $(this).val(); | |||
| var s_name = $(this).attr("name"); | |||
| var json = {}; | |||
| json[s_name] = s_value; | |||
| $.ajax({ | |||
| url: "/admins/tag_repertoires/" + s_id, | |||
| type: "PUT", | |||
| dataType:'script', | |||
| data: json | |||
| }); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,73 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-user-statistics-index-page').length > 0) { | |||
| var $form = $('.user-statistic-list-form'); | |||
| // ************** 学校选择 ************* | |||
| var matcherFunc = function(params, data){ | |||
| if ($.trim(params.term) === '') { | |||
| return data; | |||
| } | |||
| if (typeof data.text === 'undefined') { | |||
| return null; | |||
| } | |||
| if (data.name && data.name.indexOf(params.term) > -1) { | |||
| var modifiedData = $.extend({}, data, true); | |||
| return modifiedData; | |||
| } | |||
| // Return `null` if the term should not be displayed | |||
| return null; | |||
| } | |||
| var defineSchoolSelect = function (schools) { | |||
| $form.find('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '选择学校/单位', | |||
| minimumInputLength: 1, | |||
| data: schools, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $form.find('#school_id').val(item.id); | |||
| } | |||
| return item.name || item.text; | |||
| }, | |||
| matcher: matcherFunc | |||
| }); | |||
| }; | |||
| // 初始化学校选择器 | |||
| $.ajax({ | |||
| url: '/api/schools/for_option.json', | |||
| dataType: 'json', | |||
| type: 'GET', | |||
| success: function(data) { | |||
| defineSchoolSelect(data.schools); | |||
| } | |||
| }); | |||
| // 清空 | |||
| $form.on('click', '.clear-btn', function(){ | |||
| $form.find('select[name="date"]').val(''); | |||
| $form.find('.school-select').val('').trigger('change'); | |||
| $form.find('input[type="submit"]').trigger('click'); | |||
| }) | |||
| // 导出 | |||
| $('.export-action').on('click', function(){ | |||
| var form = $(".user-statistic-list-form .search-form") | |||
| var exportLink = $(this); | |||
| var date = form.find("select[name='date']").val(); | |||
| var schoolId = form.find('input[name="school_id"]').val(); | |||
| var url = exportLink.data("url").split('?')[0] + "?date=" + date + "&school_id=" + schoolId; | |||
| window.open(url); | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,156 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-users-edit-page, body.admins-users-update-page').length > 0) { | |||
| var initDepartmentSelect = true; | |||
| // ************** 学校选择 ************* | |||
| var matcherFunc = function(params, data){ | |||
| if ($.trim(params.term) === '') { | |||
| return data; | |||
| } | |||
| if (typeof data.text === 'undefined') { | |||
| return null; | |||
| } | |||
| if (data.name && data.name.indexOf(params.term) > -1) { | |||
| var modifiedData = $.extend({}, data, true); | |||
| return modifiedData; | |||
| } | |||
| // Return `null` if the term should not be displayed | |||
| return null; | |||
| } | |||
| var defineSchoolSelect = function (schools) { | |||
| $('.school-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '查询学校/单位', | |||
| minimumInputLength: 1, | |||
| data: schools, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $('#user_school_id').val(item.id); | |||
| getDepartmentsData(item.id, defineDepartmentSelect2); | |||
| } | |||
| return item.name || item.text; | |||
| }, | |||
| matcher: matcherFunc | |||
| }); | |||
| }; | |||
| var defineDepartmentSelect2 = function(departments){ | |||
| departments.unshift({ id: '-1', name: '未选择' }); // 可不选 | |||
| if (!initDepartmentSelect) { $('.department-select').empty(); } // 为了能够回填部门 | |||
| initDepartmentSelect = false; | |||
| $('.department-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '查询学院/部门', | |||
| minimumInputLength: 0, | |||
| data: departments, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name; | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| $('#user_department_id').val(item.id); | |||
| } | |||
| return item.name || item.text; | |||
| }, | |||
| matcher: matcherFunc | |||
| }); | |||
| }; | |||
| var getDepartmentsData = function(school_id, callback){ | |||
| $.ajax({ | |||
| url: '/api/schools/' + school_id + '/departments/for_option.json', | |||
| dataType: 'json', | |||
| type: 'GET', | |||
| success: function(data) { | |||
| callback(data.departments); | |||
| } | |||
| }) | |||
| } | |||
| // 初始化学校选择器 | |||
| $.ajax({ | |||
| url: '/api/schools/for_option.json', | |||
| dataType: 'json', | |||
| type: 'GET', | |||
| success: function(data) { | |||
| defineSchoolSelect(data.schools); | |||
| } | |||
| }); | |||
| // **************** 地区选择 **************** | |||
| $('.province-city-select').cxSelect({ | |||
| url: '/javascripts/educoder/province-data.json', | |||
| selects: ['province-select', 'city-select'] | |||
| }); | |||
| // *********** 职业选择 ************ | |||
| var identityData = [ | |||
| { | |||
| "v": "teacher", | |||
| "n": "教师", | |||
| "s": [{"n": "教授", "v": "教授"},{"n": "副教授", "v": "副教授"},{"n": "讲师", "v": "讲师"},{"n": "助教", "v": "助教"}] | |||
| }, | |||
| { | |||
| "v": "student", | |||
| "n": "学生", | |||
| "s": [] | |||
| }, | |||
| { | |||
| "v": "professional", | |||
| "n": "专业人士", | |||
| "s": [{"n": "企业管理者", "v": "企业管理者"},{"n": "部门管理者", "v": "部门管理者"},{"n": "高级工程师", "v": "高级工程师"},{"n": "工程师", "v": "工程师"},{"n": "助理工程师", "v": "助理工程师"}] | |||
| } | |||
| ]; | |||
| $('.user-identity-select').cxSelect({ | |||
| data: identityData, | |||
| jsonValue: 'v', | |||
| selects: ['identity-select', 'technical-title-select'] | |||
| }); | |||
| $('.identity-select').on('change', function(){ | |||
| if($(this).val() === 'student'){ | |||
| $('.technical-title-select-wrapper').hide(); | |||
| $('.form-group.user_student_id').show(); | |||
| } else { | |||
| $('.technical-title-select-wrapper').show(); | |||
| $('.form-group.user_student_id').hide(); | |||
| } | |||
| }) | |||
| var $form = $('form.edit_user') | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "user[password]": { | |||
| required: false, | |||
| minlength: 5 | |||
| }, | |||
| "user[password_confirmation]": { | |||
| required: false, | |||
| minlength: 5, | |||
| equalTo: "#user_password" | |||
| }, | |||
| }, | |||
| messages: { | |||
| "user[password_confirmation]": { | |||
| equalTo: "两次密码输入不一致" | |||
| } | |||
| } | |||
| }) | |||
| $form.submit(function(e){ | |||
| if(!$form.valid()){ e.preventDefault(); } | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,218 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| if ($('body.admins-users-index-page').length > 0) { | |||
| var showSuccessNotify = function() { | |||
| $.notify({ | |||
| message: '操作成功' | |||
| },{ | |||
| type: 'success' | |||
| }); | |||
| } | |||
| // lock user | |||
| $('.users-list-container').on('click', '.lock-action', function(){ | |||
| var $lockAction = $(this); | |||
| var $unlockAction = $lockAction.siblings('.unlock-action'); | |||
| var userId = $lockAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认加锁吗?', | |||
| ok: function(){ | |||
| $.ajax({ | |||
| url: '/admins/users/' + userId + '/lock', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function() { | |||
| showSuccessNotify(); | |||
| $lockAction.hide(); | |||
| $unlockAction.show(); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| // unlock user | |||
| $('.users-list-container').on('click', '.unlock-action', function(){ | |||
| var $unlockAction = $(this); | |||
| var $lockAction = $unlockAction.siblings('.lock-action'); | |||
| var userId = $unlockAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认解锁吗?', | |||
| ok: function () { | |||
| $.ajax({ | |||
| url: '/admins/users/' + userId + '/unlock', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function() { | |||
| showSuccessNotify(); | |||
| $lockAction.show(); | |||
| $unlockAction.hide(); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| }); | |||
| // active user | |||
| $('.users-list-container').on('click', '.active-action', function(){ | |||
| var $activeAction = $(this); | |||
| var $unlockAction = $activeAction.siblings('.unlock-action'); | |||
| var $lockAction = $activeAction.siblings('.lock-action'); | |||
| var userId = $activeAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认激活吗?', | |||
| ok: function () { | |||
| $.ajax({ | |||
| url: '/admins/users/' + userId + '/unlock', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function() { | |||
| showSuccessNotify(); | |||
| $activeAction.hide(); | |||
| $lockAction.show(); | |||
| $unlockAction.hide(); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| }); | |||
| // reset user login times | |||
| $('.users-list-container').on('click', '.reset-login-times-action', function(){ | |||
| var $action = $(this); | |||
| var userId = $action.data('id'); | |||
| $.ajax({ | |||
| url: '/admins/users/' + userId + '/reset_login_times', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| success: function() { | |||
| showSuccessNotify(); | |||
| } | |||
| }); | |||
| }); | |||
| // ***************** reward grade modal ***************** | |||
| var $rewardGradeModal = $('.admin-users-reward-grade-modal'); | |||
| var $form = $rewardGradeModal.find('form.admin-users-reward-grade-form'); | |||
| $form.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| grade: { | |||
| required: true, | |||
| digits: true | |||
| }, | |||
| } | |||
| }); | |||
| // modal ready fire | |||
| $rewardGradeModal.on('show.bs.modal', function (event) { | |||
| var $link = $(event.relatedTarget); | |||
| var userId = $link.data('id'); | |||
| $rewardGradeModal.find('.modal-body input[name="user_id"]').val(userId); | |||
| }); | |||
| // modal visited fire | |||
| $rewardGradeModal.on('shown.bs.modal', function(){ | |||
| $rewardGradeModal.find('.modal-body input[name="grade"]').focus(); | |||
| }); | |||
| $('.admin-users-reward-grade-modal .submit-btn').on('click', function(){ | |||
| $form.find('.error').html(''); | |||
| if ($form.valid()) { | |||
| var userId = $form.find('input[name="user_id"]').val(); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: "/admins/users/" + userId + "/reward_grade", | |||
| data: $form.serialize(), | |||
| success: function(data) { | |||
| showSuccessNotify(); | |||
| $('.users-list-container .user-item-' + userId + ' td.grade-content').html(data.grade); | |||
| $rewardGradeModal.modal('hide'); | |||
| }, | |||
| error: function(res) { | |||
| $rewardGradeModal.find('.error').html(res.responseJSON.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| // 导入学生 | |||
| var $importUserModal = $('.modal.admin-import-user-modal'); | |||
| var $importUserForm = $importUserModal.find('form.admin-import-user-form') | |||
| $importUserModal.on('show.bs.modal', function(){ | |||
| resetFileInputFunc($importUserModal.find('.upload-file-input')); | |||
| $importUserModal.find('.file-names').html('选择文件'); | |||
| $importUserModal.find('.upload-file-input').trigger('click'); | |||
| }); | |||
| $importUserModal.on('change', '.upload-file-input', function(e){ | |||
| var file = $(this)[0].files[0]; | |||
| $importUserModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| var importUserFormValid = function(){ | |||
| if($importUserForm.find('input[name="file"]').val() == undefined || $importUserForm.find('input[name="file"]').val().length == 0){ | |||
| $importUserForm.find('.error').html('请选择文件'); | |||
| return false; | |||
| } | |||
| return true; | |||
| }; | |||
| var buildResultMessage = function(data){ | |||
| var messageHtml = "<div>导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条</div>"; | |||
| if(data.fail.length > 0){ | |||
| messageHtml += '<table class="table"><thead class="thead-light"><tr><th>数据</th><th>失败原因</th></tr></thead><tbody>'; | |||
| data.fail.forEach(function(item){ | |||
| messageHtml += '<tr><td>' + item.data + '</td><td>' + item.message + '</td></tr>'; | |||
| }); | |||
| messageHtml += '</tbody></table>' | |||
| } | |||
| return messageHtml; | |||
| } | |||
| $importUserModal.on('click', '.submit-btn', function(){ | |||
| $importUserForm.find('.error').html(''); | |||
| if (importUserFormValid()) { | |||
| $('body').mLoading({ text: '正在导入...' }); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: '/admins/import_users', | |||
| data: new FormData($importUserForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function(data){ | |||
| $('body').mLoading('destroy'); | |||
| $importUserModal.modal('hide'); | |||
| showMessageModal(buildResultMessage(data), function(){ | |||
| window.location.reload(); | |||
| }); | |||
| }, | |||
| error: function(res){ | |||
| $('body').mLoading('destroy'); | |||
| var data = res.responseJSON; | |||
| $importUserForm.find('.error').html(data.message); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,20 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-video-applies-index-page').length > 0) { | |||
| var $searchFrom = $('.video-applies-form'); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| $searchFrom.on('click', '.search-form-tab', function(){ | |||
| var $link = $(this); | |||
| $searchFrom.find('input[name="keyword"]').val(''); | |||
| $searchFrom.find('select[name="status"]').val('all'); | |||
| if($link.data('value') === 'all'){ | |||
| $searchFrom.find('.status-filter').show(); | |||
| } else { | |||
| $searchFrom.find('.status-filter').hide(); | |||
| $searchFrom.find('select[name="status"]').val('pending'); | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| @@ -0,0 +1,124 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-weapp-adverts-index-page').length > 0) { | |||
| var resetNo = function(){ | |||
| $('#adverts-container .advert-item-no').each(function(index, ele){ | |||
| $(ele).html(index + 1); | |||
| }) | |||
| } | |||
| // ------------ 保存链接 ----------- | |||
| $('.adverts-card').on('click', '.save-data-btn', function(){ | |||
| var $link = $(this); | |||
| var id = $link.data('id'); | |||
| var link = $('.advert-item-' + id).find('.link-input').val(); | |||
| $link.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/weapp_adverts/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { link: link }, | |||
| success: function(data){ | |||
| $.notify({ message: '操作成功' }); | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $link.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // -------------- 是否在首页展示 -------------- | |||
| $('.adverts-card').on('change', '.online-check-box', function(){ | |||
| var $checkbox = $(this); | |||
| var id = $checkbox.data('id'); | |||
| var checked = $checkbox.is(':checked'); | |||
| $checkbox.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/weapp_adverts/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { online: checked }, | |||
| success: function(data){ | |||
| $.notify({ message: '保存成功' }); | |||
| var box = $('.advert-item-' + id).find('.drag'); | |||
| if(checked){ | |||
| box.removeClass('not_active'); | |||
| }else{ | |||
| box.addClass('not_active'); | |||
| } | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $checkbox.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // ------------ 拖拽 ------------- | |||
| var onDropFunc = function(el, _target, _source, sibling){ | |||
| var moveId = $(el).data('id'); | |||
| var insertId = $(sibling).data('id') || ''; | |||
| $.ajax({ | |||
| url: '/admins/weapp_adverts/drag', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { move_id: moveId, after_id: insertId }, | |||
| success: function(data){ | |||
| resetNo(); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $.notify({message: '移动失败,原因:' + data.message}, {type: 'danger'}); | |||
| } | |||
| }) | |||
| }; | |||
| var ele1 = document.getElementById('adverts-container'); | |||
| dragula([ele1], { mirrorContainer: ele1 }).on('drop', onDropFunc); | |||
| // ----------- 新增 -------------- | |||
| var $createModal = $('.modal.admin-add-weapp-advert-modal'); | |||
| var $createForm = $createModal.find('form.admin-add-weapp-advert-form'); | |||
| $createForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "weapp_settings_advert[image]": { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| $createModal.on('show.bs.modal', function(event){ | |||
| resetFileInputFunc($createModal.find('.img-file-input')); | |||
| $createModal.find('.file-names').html('选择文件'); | |||
| }); | |||
| $createModal.on('click', '.submit-btn', function() { | |||
| $createForm.find('.error').html(''); | |||
| if ($createForm.valid()) { | |||
| $createForm.submit(); | |||
| } else { | |||
| $createForm.find('.error').html('请选择图片'); | |||
| } | |||
| }); | |||
| $createModal.on('change', '.img-file-input', function(){ | |||
| var file = $(this)[0].files[0]; | |||
| $createModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| // -------------- 重新上传图片 -------------- | |||
| //replace_image_url | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $advertItem = $('.advert-item-' + data.source_id); | |||
| $advertItem.find('.advert-item-img img').attr('src', data.url); | |||
| }) | |||
| // 删除后 | |||
| $(document).on('delete_success', resetNo) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,123 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-weapp-carousels-index-page').length > 0) { | |||
| var resetNo = function(){ | |||
| $('#carousels-container .custom-carousel-item-no').each(function(index, ele){ | |||
| $(ele).html(index + 1); | |||
| }) | |||
| } | |||
| // ------------ 保存链接 ----------- | |||
| $('.carousels-card').on('click', '.save-data-btn', function(){ | |||
| var $link = $(this); | |||
| var id = $link.data('id'); | |||
| var link = $('.custom-carousel-item-' + id).find('.link-input').val(); | |||
| $link.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/weapp_carousels/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { link: link }, | |||
| success: function(data){ | |||
| $.notify({ message: '操作成功' }); | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $link.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // -------------- 是否在首页展示 -------------- | |||
| $('.carousels-card').on('change', '.online-check-box', function(){ | |||
| var $checkbox = $(this); | |||
| var id = $checkbox.data('id'); | |||
| var checked = $checkbox.is(':checked'); | |||
| $checkbox.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/admins/weapp_carousels/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { online: checked }, | |||
| success: function(data){ | |||
| $.notify({ message: '保存成功' }); | |||
| var box = $('.custom-carousel-item-' + id).find('.drag'); | |||
| if(checked){ | |||
| box.removeClass('not_active'); | |||
| }else{ | |||
| box.addClass('not_active'); | |||
| } | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $checkbox.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // ------------ 拖拽 ------------- | |||
| var onDropFunc = function(el, _target, _source, sibling){ | |||
| var moveId = $(el).data('id'); | |||
| var insertId = $(sibling).data('id') || ''; | |||
| $.ajax({ | |||
| url: '/admins/weapp_carousels/drag', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { move_id: moveId, after_id: insertId }, | |||
| success: function(data){ | |||
| resetNo(); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $.notify({message: '移动失败,原因:' + data.message}, {type: 'danger'}); | |||
| } | |||
| }) | |||
| }; | |||
| var ele1 = document.getElementById('carousels-container'); | |||
| dragula([ele1], { mirrorContainer: ele1 }).on('drop', onDropFunc); | |||
| // ----------- 新增 -------------- | |||
| var $createModal = $('.modal.admin-add-weapp-carousel-modal'); | |||
| var $createForm = $createModal.find('form.admin-add-weapp-carousel-form'); | |||
| $createForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "weapp_settings_carousel[image]": { | |||
| required: true | |||
| } | |||
| } | |||
| }); | |||
| $createModal.on('show.bs.modal', function(event){ | |||
| resetFileInputFunc($createModal.find('.img-file-input')); | |||
| $createModal.find('.file-names').html('选择文件'); | |||
| }); | |||
| $createModal.on('click', '.submit-btn', function() { | |||
| $createForm.find('.error').html(''); | |||
| if ($createForm.valid()) { | |||
| $createForm.submit(); | |||
| } else { | |||
| $createForm.find('.error').html('请选择图片'); | |||
| } | |||
| }); | |||
| $createModal.on('change', '.img-file-input', function(){ | |||
| var file = $(this)[0].files[0]; | |||
| $createModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| // -------------- 重新上传图片 -------------- | |||
| //replace_image_url | |||
| $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $carouselItem = $('.custom-carousel-item-' + data.source_id); | |||
| $carouselItem.find('.custom-carousel-item-img img').attr('src', data.url); | |||
| }) | |||
| // 删除后 | |||
| $(document).on('delete_success', resetNo) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,20 @@ | |||
| // This is a manifest file that'll be compiled into application.js, which will include all the files | |||
| // listed below. | |||
| // | |||
| // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's | |||
| // vendor/assets/javascripts directory can be referenced here using a relative path. | |||
| // | |||
| // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the | |||
| // compiled file. JavaScript code in this file should be added after the last require_* statement. | |||
| // | |||
| // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details | |||
| // about supported directives. | |||
| // | |||
| //= require rails-ujs | |||
| //= require activestorage | |||
| //= require turbolinks | |||
| //= require jquery3 | |||
| //= require popper | |||
| //= require bootstrap-sprockets | |||
| //= require chartkick | |||
| //= require Chart.bundle | |||
| @@ -0,0 +1,350 @@ | |||
| /* | |||
| * Project: Bootstrap Notify = v3.1.3 | |||
| * Description: Turns standard Bootstrap alerts into "Growl-like" notifications. | |||
| * Author: Mouse0270 aka Robert McIntosh | |||
| * License: MIT License | |||
| * Website: https://github.com/mouse0270/bootstrap-growl | |||
| */ | |||
| (function (factory) { | |||
| if (typeof define === 'function' && define.amd) { | |||
| // AMD. Register as an anonymous module. | |||
| define(['jquery'], factory); | |||
| } else if (typeof exports === 'object') { | |||
| // Node/CommonJS | |||
| factory(require('jquery')); | |||
| } else { | |||
| // Browser globals | |||
| factory(jQuery); | |||
| } | |||
| }(function ($) { | |||
| // Create the defaults once | |||
| var defaults = { | |||
| element: 'body', | |||
| position: null, | |||
| type: "info", | |||
| allow_dismiss: true, | |||
| newest_on_top: false, | |||
| showProgressbar: false, | |||
| placement: { | |||
| from: "top", | |||
| align: "right" | |||
| }, | |||
| offset: 20, | |||
| spacing: 10, | |||
| z_index: 1031, | |||
| delay: 1000, | |||
| timer: 1000, | |||
| url_target: '_blank', | |||
| mouse_over: null, | |||
| animate: { | |||
| enter: 'animated fadeInDown', | |||
| exit: 'animated fadeOutUp' | |||
| }, | |||
| onShow: null, | |||
| onShown: null, | |||
| onClose: null, | |||
| onClosed: null, | |||
| icon_type: 'class', | |||
| template: '<div data-notify="container" class="col-xs-4 col-sm-2 alert alert-{0}" role="alert"><button type="button" aria-hidden="true" class="close" data-notify="dismiss">×</button><span data-notify="icon"></span> <span data-notify="title">{1}</span> <span data-notify="message">{2}</span><div class="progress" data-notify="progressbar"><div class="progress-bar progress-bar-{0}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div></div><a href="{3}" target="{4}" data-notify="url"></a></div>' | |||
| }; | |||
| String.format = function() { | |||
| var str = arguments[0]; | |||
| for (var i = 1; i < arguments.length; i++) { | |||
| str = str.replace(RegExp("\\{" + (i - 1) + "\\}", "gm"), arguments[i]); | |||
| } | |||
| return str; | |||
| }; | |||
| function Notify ( element, content, options ) { | |||
| // Setup Content of Notify | |||
| var content = { | |||
| content: { | |||
| message: typeof content == 'object' ? content.message : content, | |||
| title: content.title ? content.title : '', | |||
| icon: content.icon ? content.icon : '', | |||
| url: content.url ? content.url : '#', | |||
| target: content.target ? content.target : '-' | |||
| } | |||
| }; | |||
| options = $.extend(true, {}, content, options); | |||
| this.settings = $.extend(true, {}, defaults, options); | |||
| this._defaults = defaults; | |||
| if (this.settings.content.target == "-") { | |||
| this.settings.content.target = this.settings.url_target; | |||
| } | |||
| this.animations = { | |||
| start: 'webkitAnimationStart oanimationstart MSAnimationStart animationstart', | |||
| end: 'webkitAnimationEnd oanimationend MSAnimationEnd animationend' | |||
| } | |||
| if (typeof this.settings.offset == 'number') { | |||
| this.settings.offset = { | |||
| x: this.settings.offset, | |||
| y: this.settings.offset | |||
| }; | |||
| } | |||
| this.init(); | |||
| }; | |||
| $.extend(Notify.prototype, { | |||
| init: function () { | |||
| var self = this; | |||
| this.buildNotify(); | |||
| if (this.settings.content.icon) { | |||
| this.setIcon(); | |||
| } | |||
| if (this.settings.content.url != "#") { | |||
| this.styleURL(); | |||
| } | |||
| this.placement(); | |||
| this.bind(); | |||
| this.notify = { | |||
| $ele: this.$ele, | |||
| update: function(command, update) { | |||
| var commands = {}; | |||
| if (typeof command == "string") { | |||
| commands[command] = update; | |||
| }else{ | |||
| commands = command; | |||
| } | |||
| for (var command in commands) { | |||
| switch (command) { | |||
| case "type": | |||
| this.$ele.removeClass('alert-' + self.settings.type); | |||
| this.$ele.find('[data-notify="progressbar"] > .progress-bar').removeClass('progress-bar-' + self.settings.type); | |||
| self.settings.type = commands[command]; | |||
| this.$ele.addClass('alert-' + commands[command]).find('[data-notify="progressbar"] > .progress-bar').addClass('progress-bar-' + commands[command]); | |||
| break; | |||
| case "icon": | |||
| var $icon = this.$ele.find('[data-notify="icon"]'); | |||
| if (self.settings.icon_type.toLowerCase() == 'class') { | |||
| $icon.removeClass(self.settings.content.icon).addClass(commands[command]); | |||
| }else{ | |||
| if (!$icon.is('img')) { | |||
| $icon.find('img'); | |||
| } | |||
| $icon.attr('src', commands[command]); | |||
| } | |||
| break; | |||
| case "progress": | |||
| var newDelay = self.settings.delay - (self.settings.delay * (commands[command] / 100)); | |||
| this.$ele.data('notify-delay', newDelay); | |||
| this.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', commands[command]).css('width', commands[command] + '%'); | |||
| break; | |||
| case "url": | |||
| this.$ele.find('[data-notify="url"]').attr('href', commands[command]); | |||
| break; | |||
| case "target": | |||
| this.$ele.find('[data-notify="url"]').attr('target', commands[command]); | |||
| break; | |||
| default: | |||
| this.$ele.find('[data-notify="' + command +'"]').html(commands[command]); | |||
| }; | |||
| } | |||
| var posX = this.$ele.outerHeight() + parseInt(self.settings.spacing) + parseInt(self.settings.offset.y); | |||
| self.reposition(posX); | |||
| }, | |||
| close: function() { | |||
| self.close(); | |||
| } | |||
| }; | |||
| }, | |||
| buildNotify: function () { | |||
| var content = this.settings.content; | |||
| this.$ele = $(String.format(this.settings.template, this.settings.type, content.title, content.message, content.url, content.target)); | |||
| this.$ele.attr('data-notify-position', this.settings.placement.from + '-' + this.settings.placement.align); | |||
| if (!this.settings.allow_dismiss) { | |||
| this.$ele.find('[data-notify="dismiss"]').css('display', 'none'); | |||
| } | |||
| if ((this.settings.delay <= 0 && !this.settings.showProgressbar) || !this.settings.showProgressbar) { | |||
| this.$ele.find('[data-notify="progressbar"]').remove(); | |||
| } | |||
| }, | |||
| setIcon: function() { | |||
| if (this.settings.icon_type.toLowerCase() == 'class') { | |||
| this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon); | |||
| }else{ | |||
| if (this.$ele.find('[data-notify="icon"]').is('img')) { | |||
| this.$ele.find('[data-notify="icon"]').attr('src', this.settings.content.icon); | |||
| }else{ | |||
| this.$ele.find('[data-notify="icon"]').append('<img src="'+this.settings.content.icon+'" alt="Notify Icon" />'); | |||
| } | |||
| } | |||
| }, | |||
| styleURL: function() { | |||
| this.$ele.find('[data-notify="url"]').css({ | |||
| backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)', | |||
| height: '100%', | |||
| left: '0px', | |||
| position: 'absolute', | |||
| top: '0px', | |||
| width: '100%', | |||
| zIndex: this.settings.z_index + 1 | |||
| }); | |||
| this.$ele.find('[data-notify="dismiss"]').css({ | |||
| position: 'absolute', | |||
| right: '10px', | |||
| top: '5px', | |||
| zIndex: this.settings.z_index + 2 | |||
| }); | |||
| }, | |||
| placement: function() { | |||
| var self = this, | |||
| offsetAmt = this.settings.offset.y, | |||
| css = { | |||
| display: 'inline-block', | |||
| margin: '0px auto', | |||
| position: this.settings.position ? this.settings.position : (this.settings.element === 'body' ? 'fixed' : 'absolute'), | |||
| transition: 'all .5s ease-in-out', | |||
| zIndex: this.settings.z_index | |||
| }, | |||
| hasAnimation = false, | |||
| settings = this.settings; | |||
| $('[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])').each(function() { | |||
| return offsetAmt = Math.max(offsetAmt, parseInt($(this).css(settings.placement.from)) + parseInt($(this).outerHeight()) + parseInt(settings.spacing)); | |||
| }); | |||
| if (this.settings.newest_on_top == true) { | |||
| offsetAmt = this.settings.offset.y; | |||
| } | |||
| css[this.settings.placement.from] = offsetAmt+'px'; | |||
| switch (this.settings.placement.align) { | |||
| case "left": | |||
| case "right": | |||
| css[this.settings.placement.align] = this.settings.offset.x+'px'; | |||
| break; | |||
| case "center": | |||
| css.left = 0; | |||
| css.right = 0; | |||
| break; | |||
| } | |||
| this.$ele.css(css).addClass(this.settings.animate.enter); | |||
| $.each(Array('webkit', 'moz', 'o', 'ms', ''), function(index, prefix) { | |||
| self.$ele[0].style[prefix+'AnimationIterationCount'] = 1; | |||
| }); | |||
| $(this.settings.element).append(this.$ele); | |||
| if (this.settings.newest_on_top == true) { | |||
| offsetAmt = (parseInt(offsetAmt)+parseInt(this.settings.spacing)) + this.$ele.outerHeight(); | |||
| this.reposition(offsetAmt); | |||
| } | |||
| if ($.isFunction(self.settings.onShow)) { | |||
| self.settings.onShow.call(this.$ele); | |||
| } | |||
| this.$ele.one(this.animations.start, function(event) { | |||
| hasAnimation = true; | |||
| }).one(this.animations.end, function(event) { | |||
| if ($.isFunction(self.settings.onShown)) { | |||
| self.settings.onShown.call(this); | |||
| } | |||
| }); | |||
| setTimeout(function() { | |||
| if (!hasAnimation) { | |||
| if ($.isFunction(self.settings.onShown)) { | |||
| self.settings.onShown.call(this); | |||
| } | |||
| } | |||
| }, 600); | |||
| }, | |||
| bind: function() { | |||
| var self = this; | |||
| this.$ele.find('[data-notify="dismiss"]').on('click', function() { | |||
| self.close(); | |||
| }) | |||
| this.$ele.mouseover(function(e) { | |||
| $(this).data('data-hover', "true"); | |||
| }).mouseout(function(e) { | |||
| $(this).data('data-hover', "false"); | |||
| }); | |||
| this.$ele.data('data-hover', "false"); | |||
| if (this.settings.delay > 0) { | |||
| self.$ele.data('notify-delay', self.settings.delay); | |||
| var timer = setInterval(function() { | |||
| var delay = parseInt(self.$ele.data('notify-delay')) - self.settings.timer; | |||
| if ((self.$ele.data('data-hover') === 'false' && self.settings.mouse_over == "pause") || self.settings.mouse_over != "pause") { | |||
| var percent = ((self.settings.delay - delay) / self.settings.delay) * 100; | |||
| self.$ele.data('notify-delay', delay); | |||
| self.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', percent).css('width', percent + '%'); | |||
| } | |||
| if (delay <= -(self.settings.timer)) { | |||
| clearInterval(timer); | |||
| self.close(); | |||
| } | |||
| }, self.settings.timer); | |||
| } | |||
| }, | |||
| close: function() { | |||
| var self = this, | |||
| $successors = null, | |||
| posX = parseInt(this.$ele.css(this.settings.placement.from)), | |||
| hasAnimation = false; | |||
| this.$ele.data('closing', 'true').addClass(this.settings.animate.exit); | |||
| self.reposition(posX); | |||
| if ($.isFunction(self.settings.onClose)) { | |||
| self.settings.onClose.call(this.$ele); | |||
| } | |||
| this.$ele.one(this.animations.start, function(event) { | |||
| hasAnimation = true; | |||
| }).one(this.animations.end, function(event) { | |||
| $(this).remove(); | |||
| if ($.isFunction(self.settings.onClosed)) { | |||
| self.settings.onClosed.call(this); | |||
| } | |||
| }); | |||
| setTimeout(function() { | |||
| if (!hasAnimation) { | |||
| self.$ele.remove(); | |||
| if (self.settings.onClosed) { | |||
| self.settings.onClosed(self.$ele); | |||
| } | |||
| } | |||
| }, 600); | |||
| }, | |||
| reposition: function(posX) { | |||
| var self = this, | |||
| notifies = '[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])', | |||
| $elements = this.$ele.nextAll(notifies); | |||
| if (this.settings.newest_on_top == true) { | |||
| $elements = this.$ele.prevAll(notifies); | |||
| } | |||
| $elements.each(function() { | |||
| $(this).css(self.settings.placement.from, posX); | |||
| posX = (parseInt(posX)+parseInt(self.settings.spacing)) + $(this).outerHeight(); | |||
| }); | |||
| } | |||
| }); | |||
| $.notify = function ( content, options ) { | |||
| var plugin = new Notify( this, content, options ); | |||
| return plugin.notify; | |||
| }; | |||
| $.notifyDefaults = function( options ) { | |||
| defaults = $.extend(true, {}, defaults, options); | |||
| return defaults; | |||
| }; | |||
| $.notifyClose = function( command ) { | |||
| if (typeof command === "undefined" || command == "all") { | |||
| $('[data-notify]').find('[data-notify="dismiss"]').trigger('click'); | |||
| }else{ | |||
| $('[data-notify-position="'+command+'"]').find('[data-notify="dismiss"]').trigger('click'); | |||
| } | |||
| }; | |||
| })); | |||
| @@ -0,0 +1,78 @@ | |||
| /* | |||
| * Copyright 2018-2018 the original author or authors. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * WebSite: http://bootstrap-viewer.leftso.com | |||
| */ | |||
| $.fn.bootstrapViewer = function (options) { | |||
| $(this).on('click', function () { | |||
| var opts = $.extend({}, $.fn.bootstrapViewer.defaults, options); | |||
| var viewer = $('<div class="modal fade bs-example-modal-lg text-center" id="bootstrapViewer" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" >\n' + | |||
| ' <div class="modal-dialog modal-lg" style="display: inline-block; width: auto;">\n' + | |||
| ' <div class="modal-content">\n' + | |||
| ' <img' + | |||
| '\t\t\t class="carousel-inner img-responsive img-rounded img-viewer" draggable="false"\n' + | |||
| '\t\t\t onclick="/*$(\'#bootstrapViewer\').modal(\'hide\');setTimeout(function(){$(\'#bootstrapViewer\').remove();},200);*/"\n' + | |||
| '\t\t\t onmouseover="this.style.cursor=\'move\';" \n' + | |||
| '\t\t\t onmouseout="this.style.cursor=\'default\'" \n' + | |||
| '\t\t\t />\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>'); | |||
| $('body').append(viewer); | |||
| if ($(this).attr(opts.src)) { | |||
| $("#bootstrapViewer").find(".img-viewer").attr("src", $(this).attr(opts.src)); | |||
| $("#bootstrapViewer").modal(); | |||
| } else { | |||
| throw "图片不存在" | |||
| } | |||
| $('#bootstrapViewer').on('hidden.bs.modal', function(){ | |||
| $('#bootstrapViewer').remove(); | |||
| }); | |||
| var $moveDiv = $('#bootstrapViewer .modal-dialog'); | |||
| var isMove = false; | |||
| var div_x = $moveDiv.offset().left; | |||
| var div_y = $moveDiv.offset().top; | |||
| var mousedownFunc = function (e) { | |||
| if (isMove) { | |||
| var left = e.pageX - div_x; | |||
| var top = e.pageY - div_y; | |||
| if(left < 0){ left = 0} | |||
| if(top < 0){ top = 0} | |||
| $moveDiv.css({"left": left, "top":top}); | |||
| } | |||
| } | |||
| $moveDiv.mousedown(function (e) { | |||
| $moveDiv.css({ left: $moveDiv[0].offsetLeft, top: $moveDiv[0].offsetTop, marginTop: 0, position: 'absolute' }); | |||
| isMove = true; | |||
| div_x = e.pageX - $moveDiv.offset().left; | |||
| div_y = e.pageY - $moveDiv.offset().top; | |||
| $(document).mousemove(mousedownFunc); | |||
| }).mouseup(function () { | |||
| isMove = false; | |||
| $(document).unbind('mousemove', mousedownFunc); | |||
| }); | |||
| }) | |||
| $(this).on('mouseover', function () { | |||
| $(this).css('cursor', 'zoom-in'); | |||
| }) | |||
| } | |||
| $.fn.bootstrapViewer.defaults = { | |||
| src: 'src' | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| //= require rails-ujs | |||
| //= require turbolinks | |||
| //= require jquery3 | |||
| //= require popper | |||
| //= require bootstrap-sprockets | |||
| //= require jquery.validate.min | |||
| //= require additional-methods.min | |||
| //= require bootstrap-notify | |||
| //= require select2 | |||
| //= require common | |||
| //= require echarts | |||
| //= require ./i18n/jquery-validate-message-zh | |||
| //= require ./i18n/select2-i18n.zh-CN | |||
| //= require_tree ./colleges | |||
| Turbolinks.setProgressBarDelay(200); | |||
| // ******** select2 global config ******** | |||
| $.fn.select2.defaults.set('theme', 'bootstrap4'); | |||
| $.fn.select2.defaults.set('language', 'zh-CN'); | |||
| $(document).on('turbolinks:load', function() { | |||
| $('[data-toggle="tooltip"]').tooltip(); | |||
| $('[data-toggle="popover"]').popover(); | |||
| }) | |||
| $(document).on("turbolinks:before-cache", function () { | |||
| $('[data-toggle="tooltip"]').tooltip('hide'); | |||
| $('[data-toggle="popover"]').popover('hide'); | |||
| }); | |||
| @@ -0,0 +1,28 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.partners-customers-page').length > 0) { | |||
| var $customerContainer = $('.customer-list-container'); | |||
| var partnerId = $customerContainer.find('.customer-list-body').data('id'); | |||
| $customerContainer.on('change', '.manager-group-select', function(){ | |||
| console.log('manager-group-select change', $(this).val()); | |||
| var $select = $(this); | |||
| var customerId = $select.data('id'); | |||
| var managerGroupId = $select.val(); | |||
| $.ajax({ | |||
| url: '/partners/' + partnerId + '/customer_manager_group.json', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { customer_id: customerId, manager_group_id: managerGroupId }, | |||
| success: function(){ | |||
| showSuccessFlash(); | |||
| $select.data('last', managerGroupId); | |||
| }, | |||
| error: function(res){ | |||
| showErrorNotify(res.responseJSON.message); | |||
| $select.val($select.data('last')); | |||
| } | |||
| }) | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,125 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.partners-partner-manager-groups-page').length > 0) { | |||
| var $container = $('.manager-group-list-container'); | |||
| var partnerId = $container.find('.manager-group-list-body').data('id'); | |||
| // ------- 新建编辑权限组弹窗 -------- | |||
| var $managerGroupModal = $('.modal.partner-save-manager-group-modal'); | |||
| var $managerGroupForm = $managerGroupModal.find('form.partner-save-manager-group-form'); | |||
| var $managerGroupIdInput = $managerGroupForm.find('input[name="manager_group_id"]'); | |||
| var $managerGroupNameInput = $managerGroupForm.find('input[name="manager_group_name"]'); | |||
| $managerGroupForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| manager_group_name: { | |||
| required: true, | |||
| maxlength: 20 | |||
| }, | |||
| } | |||
| }); | |||
| $managerGroupModal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| var managerGroupId = $link.data('id'); | |||
| var managerGroupName = $link.data('name'); | |||
| if(managerGroupId && managerGroupId !== ''){ | |||
| $managerGroupModal.find('.modal-title').html('重命名'); | |||
| $managerGroupIdInput.val(managerGroupId); | |||
| $managerGroupNameInput.val(managerGroupName) | |||
| } else { | |||
| $managerGroupModal.find('.modal-title').html('新建'); | |||
| $managerGroupIdInput.val(''); | |||
| $managerGroupNameInput.val(''); | |||
| } | |||
| }); | |||
| $managerGroupModal.on('hide.bs.modal', function(){ | |||
| $managerGroupIdInput.val(''); | |||
| $managerGroupNameInput.val(''); | |||
| }); | |||
| $managerGroupModal.on('click', '.submit-btn', function(){ | |||
| $managerGroupForm.find('.error').html(''); | |||
| var url = $managerGroupForm.data('url'); | |||
| if ($managerGroupForm.valid()) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| url: url, | |||
| data: $managerGroupForm.serialize() | |||
| }); | |||
| } | |||
| }); | |||
| // ---------- 添加管理员弹窗 ------------ | |||
| var $partnerManagerModal = $('.modal.partner-add-partner-manager-modal'); | |||
| var $partnerManagerForm = $partnerManagerModal.find('form.partner-add-partner-manager-form'); | |||
| var $managerGroupIdInput = $partnerManagerForm.find('input[name="manager_group_id"]'); | |||
| var $userSelect = $partnerManagerForm.find('.partner-manager-select'); | |||
| $userSelect.select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的管理员姓名', | |||
| multiple: true, | |||
| closeOnSelect: false, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/users_for_partners', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { name: params.term, partner_id: partnerId, page: params.page || 1, per_page: 20 }; | |||
| }, | |||
| processResults: function(data, params){ | |||
| params.page = params.page || 1; | |||
| return { | |||
| results: data.users, | |||
| pagination: { | |||
| more: (params.page * 20) < data.count | |||
| } | |||
| }; | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.identity + "</span></span>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| $partnerManagerModal.on('show.bs.modal', function(event){ | |||
| var $link = $(event.relatedTarget); | |||
| var managerGroupId = $link.data('id'); | |||
| $managerGroupIdInput.val(managerGroupId); | |||
| $userSelect.select2('val', ' '); | |||
| $partnerManagerModal.find('.error').html(''); | |||
| }); | |||
| $partnerManagerModal.on('click', '.submit-btn', function(){ | |||
| $partnerManagerModal.find('.error').html(''); | |||
| var managerGroupId = $managerGroupIdInput.val(); | |||
| var userIds = $userSelect.val(); | |||
| if (userIds && userIds.length > 0) { | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'script', | |||
| url: '/partners/' + partnerId + '/partner_managers', | |||
| data: { user_ids: userIds, manager_group_id: managerGroupId } | |||
| }); | |||
| } else { | |||
| $partnerManagerModal.modal('hide'); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| @@ -0,0 +1,156 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if($('body.colleges-statistics-page').length > 0) { | |||
| var $statisticBody = $('.statistics-body'); | |||
| var $statisticBase = $('.statistic-base'); | |||
| var schoolId = $statisticBody.data('id'); | |||
| var $statisticCourse = $statisticBody.find('.statistic-course') | |||
| var $shixunChart = $statisticBody.find('.shixun-chart'); | |||
| $.get('/colleges/' + schoolId + '/shixun_time', function(data){ | |||
| $statisticBase.find('.shixun-time').html("<span>" + data.shixun_time + "</span>天"); | |||
| }); | |||
| $.get('/colleges/' + schoolId + '/shixun_report_count', function(data){ | |||
| $statisticBase.find('.shixun-report-count').html("<span>" + data.shixun_report_count + "</span>个"); | |||
| }); | |||
| $.ajax({ url: '/colleges/' + schoolId + '/course_statistics', method: 'GET', dataType: 'script' }); | |||
| $.ajax({ url: '/colleges/' + schoolId + '/teachers', method: 'GET', dataType: 'script' }); | |||
| var initShixunChart = function(names, data){ | |||
| var shixunChart = echarts.init(document.getElementById('shixun-chart')); | |||
| var options = { | |||
| series : [ | |||
| { | |||
| name: '访问来源', | |||
| type: 'pie', | |||
| radius: '55%', | |||
| data: data | |||
| } | |||
| ] | |||
| }; | |||
| shixunChart.setOption(options); | |||
| }; | |||
| $.get('/colleges/' + schoolId + '/shixun_chart_data', function(data){ | |||
| $statisticBody.find('.shixun-chart-loading').hide(); | |||
| if (data.data.length > 0) { | |||
| $shixunChart.css('height', '400px').css('width', '100%'); | |||
| initShixunChart(data.names, data.data); | |||
| } else { | |||
| $statisticBody.find('.shixun-chart-empty').show(); | |||
| } | |||
| }); | |||
| $.ajax({ url: '/colleges/' + schoolId + '/student_shixun', method: 'GET', dataType: 'script' }); | |||
| var initHotEvaluating = function(names, values){ | |||
| var Color = ['#962e66', '#623363', '#CCCCCC', '#9A9A9A', '#FF8080', '#FF80C2', '#B980FF', '#80B9FF', '#6FE9FF', '#4DE8B4', '#F8EF63', '#FFB967']; | |||
| var option = { | |||
| backgroundColor: '#fff', | |||
| grid: { | |||
| left: '3%', | |||
| right: '4%', | |||
| bottom: '10%', | |||
| containLabel: true | |||
| }, | |||
| tooltip: { | |||
| show: "true", | |||
| trigger: 'item', | |||
| formatter: '{c0}', | |||
| backgroundColor: 'rgba(0,0,0,0.7)', // 背景 | |||
| padding: [8, 10], //内边距 | |||
| extraCssText: 'box-shadow: 0 0 3px rgba(255, 255, 255, 0.4);', //添加阴影 | |||
| axisPointer: { // 坐标轴指示器,坐标轴触发有效 | |||
| type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' | |||
| } | |||
| }, | |||
| xAxis: { | |||
| type: 'value', | |||
| axisTick: { | |||
| show: false | |||
| }, | |||
| axisLine: { | |||
| show: true, | |||
| lineStyle: { | |||
| color: '#CCCCCC' | |||
| } | |||
| }, | |||
| splitLine: { | |||
| show: false, | |||
| lineStyle: { | |||
| color: '#CCCCCC' | |||
| } | |||
| }, | |||
| axisLabel: { | |||
| textStyle: { | |||
| color: '#656565', | |||
| fontWeight: 'normal', | |||
| fontSize: '12' | |||
| }, | |||
| formatter: '{value}' | |||
| } | |||
| }, | |||
| yAxis: { | |||
| type: 'category', | |||
| axisLine: { | |||
| lineStyle: { | |||
| color: '#cccccc' | |||
| } | |||
| }, | |||
| splitLine: { | |||
| show: false | |||
| }, | |||
| axisTick: { | |||
| show: false | |||
| }, | |||
| splitArea: { | |||
| show: false | |||
| }, | |||
| axisLabel: { | |||
| inside: false, | |||
| textStyle: { | |||
| color: '#656565', | |||
| fontWeight: 'normal', | |||
| fontSize: '12' | |||
| } | |||
| }, | |||
| data: names | |||
| }, | |||
| series: [{ | |||
| name: '', | |||
| type: 'bar', | |||
| itemStyle: { | |||
| normal: { | |||
| show: true, | |||
| color: function(params) { | |||
| return Color[params.dataIndex] | |||
| }, | |||
| barBorderRadius: 50, | |||
| borderWidth: 0, | |||
| borderColor: '#333' | |||
| } | |||
| }, | |||
| barGap: '0%', | |||
| barCategoryGap: '50%', | |||
| data: values | |||
| } | |||
| ] | |||
| }; | |||
| var myChart = echarts.init(document.getElementById('hot-chart')); | |||
| myChart.setOption(option); | |||
| } | |||
| $.get('/colleges/' + schoolId + '/student_hot_evaluations', function(data){ | |||
| $statisticBody.find('.hot-chart-loading').hide(); | |||
| if (data.names.length > 0) { | |||
| $statisticBody.find('.hot-chart').css('height', '400px').css('width', '100%'); | |||
| initHotEvaluating(data.names.reverse(), data.values.reverse()); | |||
| } else { | |||
| $statisticBody.find('.hot-chart-empty').show(); | |||
| } | |||
| }) | |||
| } | |||
| }); | |||
| @@ -0,0 +1,2 @@ | |||
| // Place all the behaviors and hooks related to the matching controller here. | |||
| // All this logic will automatically be available in application.js. | |||
| @@ -0,0 +1,105 @@ | |||
| function createMDEditor(element, opts){ | |||
| var defaults = { | |||
| height: 600, | |||
| path: '/editormd/lib/', | |||
| syncScrolling: "single", | |||
| tex: true, | |||
| tocm: true, | |||
| emoji: true, | |||
| taskList: true, | |||
| codeFold: true, | |||
| searchReplace: true, | |||
| htmlDecode: "style,script,iframe", | |||
| sequenceDiagram: true, | |||
| autoFocus: false, | |||
| toolbarIcons: function () { | |||
| // Or return editormd.toolbarModes[name]; // full, simple, mini | |||
| // Using "||" set icons align right. | |||
| return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "image", "table", '|', "watch", "clear"] | |||
| }, | |||
| //这个配置在simple.html中并没有,但是为了能够提交表单,使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中,方便post提交表单。 | |||
| saveHTMLToTextarea: true, | |||
| dialogMaskOpacity: 0.6, | |||
| imageUpload: true, | |||
| imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"], | |||
| imageUploadURL: '/api/attachments.json' | |||
| } | |||
| var options = $.extend({}, defaults, opts); | |||
| return editormd(element, options); | |||
| } | |||
| function ajaxErrorNotifyHandler(res) { | |||
| var message = ''; | |||
| if(res.status !== 500){ | |||
| message = res.responseJSON.message; | |||
| } else { | |||
| message = '系统错误'; | |||
| } | |||
| return $.notify({message: message}, {type: 'danger'}); | |||
| } | |||
| function resetFileInputFunc(file){ | |||
| file.after(file.clone().val("")); | |||
| file.remove(); | |||
| } | |||
| function customConfirm(opts){ | |||
| var okCallback = opts.ok; | |||
| var cancelCallback = opts.cancel; | |||
| var defaultOpts = { | |||
| title: '提示', | |||
| buttons: { | |||
| ok: { | |||
| text: '确认', | |||
| btnClass: 'btn btn-primary', | |||
| action: okCallback | |||
| }, | |||
| cancel: { | |||
| text: '取消', | |||
| btnClass: 'btn btn-secondary', | |||
| action: cancelCallback | |||
| }, | |||
| } | |||
| } | |||
| return $.confirm($.extend({}, defaultOpts, opts)) | |||
| } | |||
| function customLoading(opts) { | |||
| var loading; | |||
| var defaultOpts = { | |||
| content: opts.ajax, | |||
| contentLoaded: function(){ | |||
| setTimeout(function(){ | |||
| loading.close() | |||
| }, 200); | |||
| } | |||
| } | |||
| loading = $.confirm($.extend({}, defaultOpts, opts)); | |||
| return loading; | |||
| } | |||
| function show_success_flash(message){ | |||
| $.notify({ | |||
| message: message || '操作成功' | |||
| },{ | |||
| type: 'success' | |||
| }); | |||
| } | |||
| function showSuccessFlash(message){ | |||
| $.notify({ | |||
| message: message || '操作成功' | |||
| },{ | |||
| type: 'success' | |||
| }); | |||
| } | |||
| function showErrorNotify(message){ | |||
| $.notify({ | |||
| message: message || '操作失败' | |||
| },{ | |||
| type: 'danger' | |||
| }); | |||
| } | |||
| @@ -0,0 +1,92 @@ | |||
| //= require rails-ujs | |||
| //= require activestorage | |||
| //= require turbolinks | |||
| //= require jquery3 | |||
| //= require popper | |||
| //= require bootstrap-sprockets | |||
| //= require jquery.validate.min | |||
| //= require additional-methods.min | |||
| //= require bootstrap-notify | |||
| //= require jquery.cookie.min | |||
| //= require select2 | |||
| //= require jquery.cxselect | |||
| //= require bootstrap-datepicker | |||
| //= require bootstrap-datetimepicker | |||
| //= require bootstrap.viewer | |||
| //= require jquery.mloading | |||
| //= require jquery-confirm.min | |||
| //= require common | |||
| //= require echarts | |||
| //= require codemirror/lib/codemirror | |||
| //= require codemirror/mode/shell/shell | |||
| //= require editormd/editormd | |||
| //= require editormd/languages/zh-tw | |||
| //= require dragula/dragula | |||
| //= require_tree ./i18n | |||
| //= require_tree ./cooperative | |||
| $.ajaxSetup({ | |||
| beforeSend: function(xhr) { | |||
| xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); | |||
| } | |||
| }); | |||
| // ******** select2 global config ******** | |||
| $.fn.select2.defaults.set('theme', 'bootstrap4'); | |||
| $.fn.select2.defaults.set('language', 'zh-CN'); | |||
| Turbolinks.setProgressBarDelay(200); | |||
| $.notifyDefaults({ | |||
| type: 'success', | |||
| z_index: 9999, | |||
| delay: 2000 | |||
| }); | |||
| $(document).on('turbolinks:load', function(){ | |||
| $('[data-toggle="tooltip"]').tooltip({ trigger : 'hover' }); | |||
| $('[data-toggle="popover"]').popover(); | |||
| // 图片查看大图 | |||
| $('img.preview-image').bootstrapViewer(); | |||
| // flash alert提示框自动关闭 | |||
| if($('.cooperative-alert-container .alert').length > 0){ | |||
| setTimeout(function(){ | |||
| $('.cooperative-alert-container .alert:not(.alert-danger)').alert('close'); | |||
| }, 2000); | |||
| setTimeout(function(){ | |||
| $('.cooperative-alert-container .alert.alert-danger').alert('close'); | |||
| }, 5000); | |||
| } | |||
| }); | |||
| $(document).on("turbolinks:before-cache", function () { | |||
| $('[data-toggle="tooltip"]').tooltip('hide'); | |||
| $('[data-toggle="popover"]').popover('hide'); | |||
| }); | |||
| // var progressBar = new Turbolinks.ProgressBar(); | |||
| // $(document).on('ajax:send', function(event){ | |||
| // console.log('ajax send', event); | |||
| // progressBar.setValue(0) | |||
| // progressBar.show() | |||
| // }); | |||
| // | |||
| // $(document).on('ajax:complete', function(event){ | |||
| // console.log('ajax complete', event); | |||
| // progressBar.setValue(1) | |||
| // progressBar.hide() // 分页时不触发,奇怪 | |||
| // }); | |||
| // $(document).on('ajax:success', function(event){ | |||
| // console.log('ajax success', event); | |||
| // }); | |||
| // $(document).on('ajax:error', function(event){ | |||
| // console.log('ajax error', event); | |||
| // }); | |||
| $(function () { | |||
| }); | |||
| @@ -0,0 +1,130 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.cooperative-carousels-index-page').length > 0) { | |||
| var resetNo = function(){ | |||
| $('#carousels-container .custom-carousel-item-no').each(function(index, ele){ | |||
| $(ele).html(index + 1); | |||
| }) | |||
| } | |||
| // 删除后 | |||
| $(document).on('delete_success', resetNo); | |||
| // ------------ 保存链接 ----------- | |||
| $('.carousels-card').on('click', '.save-data-btn', function(){ | |||
| var $link = $(this); | |||
| var id = $link.data('id'); | |||
| var link = $('.custom-carousel-item-' + id).find('.link-input').val(); | |||
| var name = $('.custom-carousel-item-' + id).find('.name-input').val(); | |||
| if(!name || name.length == 0){ | |||
| $.notify({ message: '名称不能为空' },{ type: 'danger' }); | |||
| return; | |||
| } | |||
| $link.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/cooperative/carousels/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { link: link, name: name }, | |||
| success: function(data){ | |||
| $.notify({ message: '操作成功' }); | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $link.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // -------------- 是否在首页展示 -------------- | |||
| $('.carousels-card').on('change', '.online-check-box', function(){ | |||
| var $checkbox = $(this); | |||
| var id = $checkbox.data('id'); | |||
| var checked = $checkbox.is(':checked'); | |||
| $checkbox.attr('disabled', true); | |||
| $.ajax({ | |||
| url: '/cooperative/carousels/' + id, | |||
| method: 'PATCH', | |||
| dataType: 'json', | |||
| data: { status: checked }, | |||
| success: function(data){ | |||
| $.notify({ message: '保存成功' }); | |||
| var box = $('.custom-carousel-item-' + id).find('.drag'); | |||
| if(checked){ | |||
| box.removeClass('not_active'); | |||
| }else{ | |||
| box.addClass('not_active'); | |||
| } | |||
| }, | |||
| error: ajaxErrorNotifyHandler, | |||
| complete: function(){ | |||
| $checkbox.removeAttr('disabled'); | |||
| } | |||
| }) | |||
| }); | |||
| // ------------ 拖拽 ------------- | |||
| var onDropFunc = function(el, _target, _source, sibling){ | |||
| var moveId = $(el).data('id'); | |||
| var insertId = $(sibling).data('id') || ''; | |||
| $.ajax({ | |||
| url: '/cooperative/carousels/drag', | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| data: { move_id: moveId, after_id: insertId }, | |||
| success: function(data){ | |||
| resetNo(); | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| $.notify({message: '移动失败,原因:' + data.message}, {type: 'danger'}); | |||
| } | |||
| }) | |||
| }; | |||
| var ele1 = document.getElementById('carousels-container'); | |||
| dragula([ele1], { mirrorContainer: ele1 }).on('drop', onDropFunc); | |||
| // ----------- 新增 -------------- | |||
| var $createModal = $('.modal.cooperative-add-carousel-modal'); | |||
| var $createForm = $createModal.find('form.cooperative-add-carousel-form'); | |||
| $createForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| "portal_image[image]": { | |||
| required: true | |||
| }, | |||
| "portal_image[name]": { | |||
| required: true | |||
| }, | |||
| } | |||
| }); | |||
| $createModal.on('show.bs.modal', function(event){ | |||
| resetFileInputFunc($createModal.find('.img-file-input')); | |||
| $createModal.find('.file-names').html('选择文件'); | |||
| }); | |||
| $createModal.on('click', '.submit-btn', function() { | |||
| $createForm.find('.error').html(''); | |||
| if ($createForm.valid()) { | |||
| $createForm.submit(); | |||
| } else { | |||
| $createForm.find('.error').html('请选择图片'); | |||
| } | |||
| }); | |||
| $createModal.on('change', '.img-file-input', function(){ | |||
| var file = $(this)[0].files[0]; | |||
| $createModal.find('.file-names').html(file ? file.name : '请选择文件'); | |||
| }) | |||
| // -------------- 重新上传图片 -------------- | |||
| //replace_image_url | |||
| $('.modal.cooperative-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $carouselItem = $('.custom-carousel-item-' + data.source_id); | |||
| $carouselItem.find('.custom-carousel-item-img img').attr('src', data.url); | |||
| }) | |||
| } | |||
| }) | |||
| @@ -0,0 +1,803 @@ | |||
| $(document).on('turbolinks:load', function(){ | |||
| if ($('body.cooperative-competition-settings-index-page').length > 0) { | |||
| var dateOptions = { | |||
| autoclose: true, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd', | |||
| startDate: '2017-04-01' | |||
| }; | |||
| var timeOptions = { | |||
| autoclose: 1, | |||
| language: 'zh-CN', | |||
| format: 'yyyy-mm-dd hh:ii', | |||
| minuteStep: 30 | |||
| }; | |||
| var defineDateRangeSelect = function (element) { | |||
| var options = $.extend({inputs: $(element).find('.start-date, .end-date')}, dateOptions); | |||
| $(element).datepicker(options); | |||
| $(element).find('.start-date').datepicker().on('changeDate', function (e) { | |||
| $(element).find('.end-date').datepicker('setStartDate', e.date); | |||
| }); | |||
| }; | |||
| $(".competition-start-end-date .start-date").datetimepicker(timeOptions); | |||
| $(".competition-start-end-date .end-date").datetimepicker(timeOptions); | |||
| $(".nav-setting-form .enroll_end_time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-start-time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-end-time").datetimepicker(timeOptions); | |||
| defineDateRangeSelect('.teaching-mode-date'); | |||
| // defineTimeRangeSelect('.competition-start-end-date'); | |||
| var $basicForm = $('form.basic-setting-form'); | |||
| $basicForm.validate({ | |||
| errorElement: 'span', | |||
| errorClass: 'danger text-danger', | |||
| rules: { | |||
| name: "required", | |||
| subTitle: "required", | |||
| startTime: "required", | |||
| endTime: "required", | |||
| mode: "required", | |||
| identifier: "required" | |||
| } | |||
| }); | |||
| // 保存按钮 | |||
| $basicForm.on('click', ".submit-btn", function () { | |||
| $basicForm.find('.submit-btn').attr('disabled', 'disabled'); | |||
| $basicForm.find('.error').html(''); | |||
| var valid = $basicForm.valid(); | |||
| if ($("input[name='mode']:checked").val() == 2) { | |||
| var $courseId = $("input[name='course_id']"); | |||
| if ($courseId.val() === undefined || $courseId.val().length === 0) { | |||
| $courseId.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $courseId.removeClass('danger text-danger'); | |||
| } | |||
| } else if ($("input[name='mode']:checked").val() == 3) { | |||
| var $techStartTime = $("input[name='teach_start_time']"); | |||
| var $techEndTime = $("input[name='teach_end_time']"); | |||
| if ($techStartTime.val() === undefined || $techStartTime.val().length === 0) { | |||
| $techStartTime.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $techStartTime.removeClass('danger text-danger'); | |||
| } | |||
| if ($techEndTime.val() === undefined || $techEndTime.val().length === 0) { | |||
| $techEndTime.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $techEndTime.removeClass('danger text-danger'); | |||
| } | |||
| } else { | |||
| $("input[name='course_id']").removeClass('danger text-danger'); | |||
| $("input[name='teach_start_time']").removeClass('danger text-danger'); | |||
| $("input[name='teach_end_time']").removeClass('danger text-danger'); | |||
| } | |||
| if (!valid) return; | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: $basicForm.attr('action'), | |||
| data: new FormData($basicForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function (data) { | |||
| $.notify({message: '保存成功'}); | |||
| // window.location.reload(); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $basicForm.find('.error').html(data.message); | |||
| }, | |||
| complete: function () { | |||
| $basicForm.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }); | |||
| var selectOptions = { | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的单位名称', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/api/schools/search.json', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.schools } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return item.name || item.text; | |||
| }, | |||
| templateSelection: function(item){ | |||
| return item.name || item.text; | |||
| } | |||
| }; | |||
| $('.sponsor-select').select2(selectOptions); | |||
| $('.allow-school-select').select2(selectOptions); | |||
| $('.manager-select').select2({ | |||
| theme: 'bootstrap4', | |||
| placeholder: '请输入要添加的管理员姓名', | |||
| multiple: true, | |||
| minimumInputLength: 1, | |||
| ajax: { | |||
| delay: 500, | |||
| url: '/cooperative/users', | |||
| dataType: 'json', | |||
| data: function(params){ | |||
| return { keyword: params.term }; | |||
| }, | |||
| processResults: function(data){ | |||
| return { results: data.users } | |||
| } | |||
| }, | |||
| templateResult: function (item) { | |||
| if(!item.id || item.id === '') return item.text; | |||
| return $("<div class='row px-0'><span class='col-3'>" + item.real_name + "</span><span class='col-5 font-12'>" + item.school_name + "</span><span class='col-4 font-12'>" + item.hidden_phone + "</span></div>"); | |||
| }, | |||
| templateSelection: function(item){ | |||
| if (item.id) { | |||
| } | |||
| return item.real_name || item.text; | |||
| } | |||
| }); | |||
| // 排行榜 | |||
| //链接 | |||
| $(".nav-setting-form").on("click",".add_linkBtn",function () { | |||
| var length=$(".nav-setting-form").find(".linkFormItem").length + 1; | |||
| var html='<div class="row mt-2 align-items-center linkFormItem">\n' + | |||
| ' <div class="col-1 text-right">\n' + | |||
| ' <label class="checkbox checkbox-primary mt-1">\n' + | |||
| ' <input type="checkbox" name="navbar[][hidden]" value="0" hidden class="font-16" checked="checked">\n' + | |||
| ' <input type="checkbox" value="0" class="font-16 module_hidden" checked="checked">\n' + | |||
| ' </label>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-md-label mt-1"><input type="hidden" value="md" name="navbar[][module_type]">\n' + | |||
| ' <input type="text" name="navbar[][name]" value="" class="form-control" placeholder="模块名称"></div>\n' + | |||
| ' <div class="col-md-1 mt-1"><input type="text" name="navbar[][position]" value="" class="form-control" placeholder="位置"></div>\n' + | |||
| ' <div class="col-md-3 mt-1"><input type="text" name="navbar[][url]" value="" class="form-control" placeholder="请输入资料下载地址"></div>\n' + | |||
| ' <a class="mt-1 btn btn-primary waves-effect waves-light btn-xs setBtn_s add_linkBtn" href="javascript:void(0)">+</a>\n' + | |||
| ' <a class="mt-1 btn btn-icon waves-effect btn-default waves-light setBtn_s ml10 del_linkBtn" href="javascript:void(0)">×</a>\n' + | |||
| ' </div>'; | |||
| $(this).parents(".linkFormItem").after(html); | |||
| }); | |||
| $(".nav-setting-form").on("click", ".del_linkBtn", function () { | |||
| $(this).parents(".linkFormItem").remove(); | |||
| }); | |||
| //有关报名要求 | |||
| $(".addRequireBtn").on("click",function () { | |||
| var length=$("#requireForm").find(".requireForm_item").length + 1; | |||
| var html='<div class="row mt-2 mb-4 requireForm_item">\n' + | |||
| ' <div class="col-1 text-right"> </div>\n' + | |||
| ' <div class="col-1 text-left mt-1">\n' + | |||
| ' <input type="text" class="form-control" name="competition_staffs[][minimum]" value="0">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-1 mt-1">\n' + | |||
| ' <input type="text" class="form-control" name="competition_staffs[][maximum]" value="1">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">人</span>\n' + | |||
| ' <div class="col-2 mt-1">\n' + | |||
| ' <select class="form-control" name="competition_staffs[][category]">\n' + | |||
| ' <option value="student">学生</option>\n' + | |||
| ' <option value="teacher">教师</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-2 mt-1">\n' + | |||
| ' <label class="radio checkbox-primary mt-1" value="require_'+length+'_1">\n' + | |||
| ' <input id="require_'+length+'_1" class="mutiple-limited-radio" value="false" checked name="competition_staffs[][mutiple_limited]" type="checkbox">\n' + | |||
| ' <label for="require_'+length+'_1">可多次报名</label>\n' + | |||
| ' </label>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-2 mt-1">\n' + | |||
| ' <label class="radio checkbox-primary mt-1" value="require_'+length+'_2">\n' + | |||
| ' <input id="require_'+length+'_2" class="mutiple-limited-radio" value="true" name="competition_staffs[][mutiple_limited]" type="checkbox">\n' + | |||
| ' <label for="require_'+length+'_2">不可多次报名</label>\n' + | |||
| ' </label>\n' + | |||
| ' <a href="javascript:void(0)" class="ml20 delRequrieBtn">\n' + | |||
| ' <i class="fa fa-times-circle font-20 color-grey-c"></i>\n' + | |||
| ' </a>\n' + | |||
| ' </div>\n' + | |||
| ' </div>'; | |||
| $("#requireForm").append(html); | |||
| }); | |||
| $("#requireForm").on("click",".delRequrieBtn",function () { | |||
| $(this).parents(".requireForm_item").remove(); | |||
| }); | |||
| $('.nav-setting-form').on('click', '.module_hidden', function(){ | |||
| var checkEle = $(this); | |||
| if (checkEle.is(':checked')) { | |||
| checkEle.prev().val(0); | |||
| } else { | |||
| checkEle.prev().val(1); | |||
| } | |||
| }); | |||
| $('.competition-staff-settings').on('click', '.mutiple-limited-radio', function(){ | |||
| var radio = $(this); | |||
| if (radio.is(':checked')) { | |||
| radio.parent().parent().siblings().find('.mutiple-limited-radio').attr('checked', false) | |||
| } else { | |||
| radio.parent().parent().siblings().find('.mutiple-limited-radio').attr('checked', true) | |||
| } | |||
| }); | |||
| var $navForm = $('form.nav-setting-form'); | |||
| $navForm.on('click', ".submit-btn", function () { | |||
| $navForm.find('.submit-btn').attr('disabled', 'disabled'); | |||
| $navForm.find('.error').html(''); | |||
| var valid = $navForm.valid(); | |||
| if (!valid) return; | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: $navForm.attr('action'), | |||
| data: new FormData($navForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function (data) { | |||
| $.notify({message: '保存成功'}); | |||
| // window.location.reload(); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $navForm.find('.error').html(data.message); | |||
| }, | |||
| complete: function () { | |||
| $navForm.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }); | |||
| // 排行榜设置 | |||
| //删除小阶段 | |||
| $("#large_panel").on("click",".small_panel_item_del",function () { | |||
| var list = $(this).parents(".small_panel"); | |||
| $(this).parents(".small_panel_item").remove(); | |||
| for(var i=0;i < $(list).find(".subName").length;i++){ | |||
| console.log(i); | |||
| $(list).find(".subName").eq(i).html("第"+parseInt(i+1)+"阶段"); | |||
| } | |||
| }); | |||
| // $('form.stage-update-form').validate({ | |||
| // errorElement: 'span', | |||
| // errorClass: 'danger text-danger', | |||
| // rules: { | |||
| // stage_name: "required", | |||
| // "stage[][start_time]": "required", | |||
| // "stage[][end_time]": "required", | |||
| // "stage[][mission_count]": { | |||
| // required: true, | |||
| // min: 1 | |||
| // }, | |||
| // "stage[][entry]": { | |||
| // required: true, | |||
| // min: 1 | |||
| // }, | |||
| // score_rate: { | |||
| // required: true, | |||
| // range: [0, 100] | |||
| // } | |||
| // }, | |||
| // messages: { | |||
| // "stage[][mission_count]": { | |||
| // min: ">=1" | |||
| // }, | |||
| // "stage[][entry]": { | |||
| // min: ">=1" | |||
| // }, | |||
| // } | |||
| // }); | |||
| $('.competition-chart-setting').on('click', ".update-stage", function () { | |||
| var updateForm = $(this).parents("form"); | |||
| $(this).attr('disabled', 'disabled'); | |||
| updateForm.find('.error').html(''); | |||
| // var valid = updateForm.valid(); | |||
| var valid = true; | |||
| var $stageName = updateForm.find('input[name="stage_name"]'); | |||
| if($stageName.val() === undefined || $stageName.val().length === 0){ | |||
| $stageName.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $stageName.removeClass('danger text-danger'); | |||
| } | |||
| var $scoreRate = updateForm.find('input[name="score_rate"]'); | |||
| if($scoreRate.val() === undefined || $scoreRate.val().length === 0){ | |||
| $scoreRate.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else if (parseInt($scoreRate.val()) > 100 || parseInt($scoreRate.val()) < 0) { | |||
| $scoreRate.addClass('danger text-danger'); | |||
| $scoreRate.after('<span class="danger text-danger">0-100之间的数值</span>'); | |||
| valid = false; | |||
| } else { | |||
| $scoreRate.removeClass('danger text-danger'); | |||
| $scoreRate.siblings().remove(); | |||
| } | |||
| updateForm.find('input[name="stage[][start_time]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][end_time]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][mission_count]"]').each(function(i, e){ | |||
| var $ele = $(e); | |||
| var $entry = updateForm.find('input[name="stage[][entry]"]').eq(i); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else if (parseInt($ele.val()) < 1) { | |||
| $ele.addClass('danger text-danger'); | |||
| $ele.after('<span class="danger text-danger">大于等于1</span>'); | |||
| valid = false; | |||
| } else if (parseInt($ele.val()) > parseInt($entry.val())) { | |||
| $ele.addClass('danger text-danger'); | |||
| $ele.after('<span class="danger text-danger">不能大于总任务数</span>'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| $ele.siblings().remove(); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][entry]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else if (parseInt($ele.val()) < 1) { | |||
| $ele.addClass('danger text-danger'); | |||
| $ele.after('<span class="danger text-danger">大于等于1</span>'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| $ele.siblings().remove(); | |||
| } | |||
| }); | |||
| updateForm.find('input[name="stage[][identifiers][]"]').each(function(_, e){ | |||
| var $ele = $(e); | |||
| if($ele.val() === undefined || $ele.val().length === 0){ | |||
| $ele.addClass('danger text-danger'); | |||
| valid = false; | |||
| } else { | |||
| $ele.removeClass('danger text-danger'); | |||
| } | |||
| }); | |||
| if (!valid) return; | |||
| updateForm.find('input[name="stage[][mission_count]"]').each(function(_, e){ | |||
| var $missionCount = $(e); | |||
| var $entryCount = $(e).parents("div.row").find('input[name="stage[][mission_count]"]'); | |||
| if(parseInt($missionCount.val()) > parseInt($entryCount.val()) ){ | |||
| $missionCount.addClass('danger text-danger'); | |||
| $missionCount.after('<span class="danger text-danger">不能大于总任务数</span>'); | |||
| valid = false; | |||
| } else { | |||
| $missionCount.removeClass('danger text-danger'); | |||
| $missionCount.siblings().remove(); | |||
| } | |||
| }); | |||
| $.ajax({ | |||
| method: 'POST', | |||
| dataType: 'json', | |||
| url: updateForm.attr('action'), | |||
| data: new FormData(updateForm[0]), | |||
| processData: false, | |||
| contentType: false, | |||
| success: function (data) { | |||
| $.notify({message: '保存成功'}); | |||
| window.location.reload(); | |||
| }, | |||
| error: function (res) { | |||
| var data = res.responseJSON; | |||
| $navForm.find('.error').html(data.message); | |||
| }, | |||
| complete: function () { | |||
| $navForm.find('.submit-btn').attr('disabled', false); | |||
| } | |||
| }); | |||
| }); | |||
| $(".competition-chart-stages").on("click", ".add-new-tab", function () { | |||
| if($(".new-stage-form").length > 0){ | |||
| alert("请先保存上一个tab"); | |||
| } else { | |||
| var count = parseInt($("#large_panel").find(".large_panel_part").length)+1; | |||
| var html = '<form class="stage-update-form new-stage-form flex-1" action="/cooperative/competitions/'+$(this).attr("data-competition-id")+'/competition_stages" accept-charset="UTF-8" data-remote="true" method="post">' + | |||
| '<div class="large_panel_part" attr_line="'+count+'"><div class="row d-flex mt-3">\n' + | |||
| ' <span class="col-1 mt-2">tab标题</span>\n' + | |||
| ' <div class="col-2 no_padding">\n' + | |||
| ' <input type="text" class="form-control" name="stage_name"/>\n' + | |||
| ' </div>\n' + | |||
| ' <span class="col-1 text-right mt-2 no_padding">总排行榜占比:</span>\n' + | |||
| ' <div class="col-1 no_padding">\n' + | |||
| ' <input type="number" class="form-control" name="score_rate" value="100"/>\n' + | |||
| ' </div><span class=" mt-2">%</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <a href="javascript:void(0)"class="btn btn-outline-primary export-action ml20 add-task-sub">新增子阶段</a>\n' + | |||
| ' </div>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20" onclick="Del_tab(this)">删除</a>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-outline-primary update-stage export-action ml20">保存</a>\n' + | |||
| ' </div>\n' + | |||
| ' <div id="small_panel_'+count+'" class="small_panel">\n' + | |||
| ' <div class="row d-flex small_panel_item" attr_line="sub_new_new" count="1">\n' + | |||
| ' <span class="mt-2 subName mr10">第1阶段</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <div class="row">\n' + | |||
| ' <div class="row col-6"><span class="mt-2 ml20">有效时间:</span>\n' + | |||
| ' <div class="col-4 no_padding">\n' + | |||
| ' <input type="text" name="stage[][start_time]" id="stage__start_time" value="" autocomplete="off" class="section-start-time form-control" placeholder="有效开始时间">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][end_time]" id="stage__end_time" value="" autocomplete="off" class="section-end-time form-control" placeholder="有效结束时间">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding">总任务数:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <input type="number" class="form-control" onchange="change_total(this)" value="3" name="stage[][entry]">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding">成绩来源:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <select class="form-control" name="stage[][score_source]">\n' + | |||
| ' <option value="0">经验值</option>\n' + | |||
| ' <option value="1">预测准确率</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div></div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="row mt-2" id="task_Input_sub_new_new">\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务1</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务2</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务3</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <span>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20 small_panel_item_del">删除</a>\n' + | |||
| ' </span>\n' + | |||
| ' </div>\n' + | |||
| '</div></div></form>'; | |||
| $("#large_panel").append(html); | |||
| $(".stage-update-form .section-start-time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-end-time").datetimepicker(timeOptions); | |||
| } | |||
| }); | |||
| //新增子阶段 | |||
| $(".competition-chart-stages").on("click", ".add-task-sub", function () { | |||
| var index = $(this).parents(".large_panel_part").attr("attr_line"); | |||
| var count= 0; | |||
| console.log("sdfsf"); | |||
| console.log($("#small_panel_"+index).find(".small_panel_item").length > 0); | |||
| if($("#small_panel_"+index).find(".small_panel_item").length > 0){ | |||
| count = parseInt($("#small_panel_"+index).find(".small_panel_item").last().attr("count")) + 1; | |||
| console.log($("#small_panel_"+index).find(".small_panel_item").last().attr("count")); | |||
| }else{ | |||
| count = 1; | |||
| } | |||
| var showCount=parseInt($("#small_panel_"+index).find(".small_panel_item").length) + 1; | |||
| var html='<div class="row d-flex small_panel_item" attr_line="sub_'+index+'_'+count+'" count="'+count+'">\n' + | |||
| ' <span class="mr10 mt-2 subName">第'+showCount+'阶段</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <div class="row">\n' + | |||
| ' <div class="row col-6"><span class="mt-2 ml20 mr10">有效时间:</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][start_time]" id="stage__start_time" value="" autocomplete="off" class="section-start-time form-control" placeholder="有效开始时间">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][end_time]" id="stage__end_time" value="" autocomplete="off" class="section-end-time form-control" placeholder="有效结束时间">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding mr10">总任务数:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <input type="number" class="form-control" onchange="change_total(this)" value="3" name="stage[][entry]">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 mr10 text-right mt-2 no_padding">成绩来源:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <select class="form-control" name="stage[][score_source]">\n' + | |||
| ' <option value="0">经验值</option>\n' + | |||
| ' <option value="1">预测准确率</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div></div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="row mt-2" id="task_Input_sub_'+index+'_'+count+'">\n'+ | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务1</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务2</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-4 text-right mt-3 no_padding mr10">任务3</span>\n' + | |||
| ' <div class="col-6 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <span>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20 small_panel_item_del">删除</a>\n' + | |||
| ' </span>\n' + | |||
| ' </div>'; | |||
| $("#small_panel_"+index).append(html); | |||
| $(".stage-update-form .section-start-time").datetimepicker(timeOptions); | |||
| $(".stage-update-form .section-end-time").datetimepicker(timeOptions); | |||
| }); | |||
| // 奖项设置 | |||
| var $prizeContainer = $('#competition-prize-card'); | |||
| var competitionId = $prizeContainer.data('id'); | |||
| $(document).on('prize.save.success', function(){ | |||
| $.ajax({ | |||
| method: 'GET', | |||
| url: '/cooperative/competitions/' + competitionId + '/competition_prizes', | |||
| dataType: 'script' | |||
| }) | |||
| }); | |||
| $('.modal.cooperative-upload-file-modal').on('upload:success', function(e, data){ | |||
| var $imageElement; | |||
| if(data.suffix === '_member'){ | |||
| $imageElement = $('.prize-member-image-' + data.source_id); | |||
| } else if(data.suffix === '_team'){ | |||
| $imageElement = $('.prize-team-image-' + data.source_id); | |||
| } else { | |||
| $imageElement = $('.prize-teacher-image-' + data.source_id); | |||
| } | |||
| $imageElement.attr('src', data.url); | |||
| $imageElement.show(); | |||
| $imageElement.next().html('重新上传'); | |||
| }) | |||
| // 生成获奖记录 | |||
| $prizeContainer.on('click', '.generate-prize-user-action', function(){ | |||
| var $link = $(this); | |||
| var generateRequest = function(){ | |||
| return $.ajax({ | |||
| method: 'POST', | |||
| url: '/cooperative/competitions/' + competitionId + '/competition_prize_users', | |||
| dataType: 'json', | |||
| success: function(data){ | |||
| if(data && data.status === 0){ | |||
| show_success_flash(); | |||
| $link.remove(); | |||
| } else { | |||
| showErrorNotify(data.message); | |||
| } | |||
| }, | |||
| error: function(res){ | |||
| var data = res.responseJSON; | |||
| showErrorNotify(data.message); | |||
| } | |||
| }) | |||
| } | |||
| customConfirm({ | |||
| content: '确认生成吗?', | |||
| ok: function () { | |||
| customLoading({ | |||
| ajax: generateRequest | |||
| }) | |||
| } | |||
| }) | |||
| }); | |||
| } else { | |||
| $(document).unbind('prize.save.success'); | |||
| } | |||
| }); | |||
| //添加主办方或者开放范围 | |||
| function addSponsor(item){ | |||
| var html='<div class="sponsor_label">\n' + | |||
| ' <input type="hidden" value="school_id" />\n' + | |||
| ' <span>caicai</span>\n' + | |||
| ' <a href="javascript:void(0)" onclick="del_sponsor(this)">×</a>\n' + | |||
| ' </div>'; | |||
| $(item).parents(".sponsorPanel").append(html); | |||
| } | |||
| //删除 | |||
| function del_sponsor(item){ | |||
| $(item).parents(".sponsor_label").remove(); | |||
| } | |||
| // 小阶段修改总任务数 | |||
| function change_total(item) { | |||
| var count=parseInt($(item).val()); | |||
| var index = $(item).parents(".small_panel_item").attr("attr_line"); | |||
| var indexLarge = $(item).parents(".large_panel_part").attr("attr_line"); | |||
| console.log(indexLarge); | |||
| console.log(index); | |||
| var divCount=parseInt($("#task_Input_"+index).find(".task_Input_div").length); | |||
| var html = ""; | |||
| if(count > divCount){ | |||
| for(var i=0;i < count-divCount ;i++){ | |||
| html+='<div class="col-4 row task_Input_div"><span class="col-4 text-right mt-3 no_padding mr10">任务'+(divCount+i+1)+'</span>\n' + | |||
| '<div class="col-6 no_padding">\n' + | |||
| '<input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| '</div>\n' + | |||
| '</div>'; | |||
| } | |||
| $("#task_Input_"+index).append(html); | |||
| }else{ | |||
| var delCount = divCount - count ; | |||
| console.log(divCount); | |||
| console.log(count); | |||
| var _max=parseInt($("#task_Input_"+index).find(".task_Input_div:last").index()); | |||
| console.log(_max); | |||
| var _get= _max - delCount; | |||
| console.log(_get); | |||
| if(count == 0){ | |||
| $("#task_Input_"+index).empty(); | |||
| }else{ | |||
| $("#task_Input_"+index).find(".task_Input_div:gt("+_get+")").remove(); | |||
| } | |||
| } | |||
| } | |||
| //删除tab | |||
| function Del_tab(item) { | |||
| $(item).parents(".large_panel_part").remove(); | |||
| } | |||
| //新增tab | |||
| function addNewTab(competition_id) { | |||
| if($(".new-stage-form").length > 0){ | |||
| alert("请先保存上一个tab"); | |||
| } else { | |||
| var count = parseInt($("#large_panel").find(".large_panel_part").length)+1; | |||
| var html = '<form class="stage-update-form new-stage-form flex-1" action="/cooperative/competitions/'+competition_id+'/competition_stages" accept-charset="UTF-8" data-remote="true" method="post">' + | |||
| '<div class="large_panel_part" attr_line="'+count+'"><div class="row d-flex mt-3">\n' + | |||
| ' <span class="col-1 mt-2">tab标题</span>\n' + | |||
| ' <div class="col-2 no_padding">\n' + | |||
| ' <input type="text" class="form-control" name="stage_name"/>\n' + | |||
| ' </div>\n' + | |||
| ' <span class="col-1 text-right mt-2 no_padding">总排行榜占比:</span>\n' + | |||
| ' <div class="col-1 no_padding">\n' + | |||
| ' <input type="number" class="form-control" name="score_rate" value="100"/>\n' + | |||
| ' </div><span class=" mt-2">%</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <a href="javascript:void(0)"class="btn btn-outline-primary export-action ml20 add-task-sub">新增子阶段</a>\n' + | |||
| ' </div>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20" onclick="Del_tab(this)">删除</a>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-outline-primary update-stage export-action ml20">保存</a>\n' + | |||
| ' </div>\n' + | |||
| ' <div id="small_panel_'+count+'" class="small_panel">\n' + | |||
| ' <div class="row d-flex small_panel_item" attr_line="sub_new_new" count="1">\n' + | |||
| ' <span class="mt-2 subName mr10">第1阶段</span>\n' + | |||
| ' <div class="flex-1">\n' + | |||
| ' <div class="row">\n' + | |||
| ' <div class="row col-6"><span class="mt-2 ml20 mr10">有效时间:</span>\n' + | |||
| ' <div class="col-4 no_padding ">\n' + | |||
| ' <input type="text" name="stage[][start_time]" id="stage__start_time" value="" autocomplete="off" class="section-start-time form-control" placeholder="有效开始时间">\n' + | |||
| ' </div>\n' + | |||
| ' <span class="mt-2">~</span>\n' + | |||
| ' <div class="col-4 no_padding input_middle">\n' + | |||
| ' <input type="text" name="stage[][end_time]" id="stage__end_time" value="" autocomplete="off" class="section-end-time form-control" placeholder="有效结束时间">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding mr10">总任务数:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <input type="number" class="form-control" onchange="change_total(this)" value="3" name="stage[][entry]">\n' + | |||
| ' </div></div>\n' + | |||
| ' <div class="row col-3"><span class="col-4 text-right mt-2 no_padding mr10">成绩来源:</span>\n' + | |||
| ' <div class="col-6 no_padding ">\n' + | |||
| ' <select class="form-control" name="stage[][score_source]">\n' + | |||
| ' <option value="0">经验值</option>\n' + | |||
| ' <option value="1">预测准确率</option>\n' + | |||
| ' </select>\n' + | |||
| ' </div></div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="row mt-2" id="task_Input_sub_new_new">\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-3 text-right mt-3 no_padding mr10">任务1</span>\n' + | |||
| ' <div class="col-8 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-3 text-right mt-3 no_padding mr10">任务2</span>\n' + | |||
| ' <div class="col-8 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <div class="col-4 row task_Input_div">\n' + | |||
| ' <span class="col-3 text-right no_padding mr10 mt-3">任务3</span>\n' + | |||
| ' <div class="col-8 no_padding">\n' + | |||
| ' <input type="text" class="form-control mt-2" name="stage[][identifiers][]" placeholder="请填写实训ID">\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' </div>\n' + | |||
| ' <span>\n' + | |||
| ' <a href="javascript:void(0)" class="btn btn-default ml20 small_panel_item_del">删除</a>\n' + | |||
| ' </span>\n' + | |||
| ' </div>\n' + | |||
| '</div></div></form>'; | |||
| $("#large_panel").append(html); | |||
| } | |||
| } | |||