@@ -154,7 +154,8 @@ class EducoderLogin extends Component {
"width": "100%"
}}>
- {
+ {this.props.mygetHelmetapi === null ? "" :
this.props.mygetHelmetapi===undefined|| this.props.mygetHelmetapi.footer===null||this.props.mygetHelmetapi.footer===undefined?
© 2019 EduCoder
diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js
index ad3f517d7..b5f35e1ad 100644
--- a/public/react/src/modules/tpm/TPMIndexHOC.js
+++ b/public/react/src/modules/tpm/TPMIndexHOC.js
@@ -84,7 +84,7 @@ export function TPMIndexHOC(WrappedComponent) {
globalLoading: false,
dataquerys:{},
isloginCancel:undefined,
- mygetHelmetapi:undefined,
+ mygetHelmetapi: null,
}
}
@@ -306,6 +306,9 @@ export function TPMIndexHOC(WrappedComponent) {
}
document.head.appendChild(link);
}else {
+ this.setState({
+ mygetHelmetapi: undefined
+ });
document.title = "EduCoder";
var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon');
@@ -319,6 +322,9 @@ export function TPMIndexHOC(WrappedComponent) {
}
}else{
+ this.setState({
+ mygetHelmetapi: undefined
+ });
document.title = "EduCoder";
var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon');
@@ -332,6 +338,9 @@ export function TPMIndexHOC(WrappedComponent) {
}
}).catch((error) => {
+ this.setState({
+ mygetHelmetapi: undefined
+ });
document.title = "EduCoder";
var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon');
From 10ffcf9a5a66eb1d3b41bc5a7d4e21807d045373 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Thu, 17 Oct 2019 10:35:10 +0800
Subject: [PATCH 4/4] cooperative manage admin
---
app/assets/javascripts/common.js | 8 +
app/assets/javascripts/cooperative.js | 91 +
.../cooperative/laboratory_settings/edit.js | 86 +
app/assets/javascripts/cooperative/sidebar.js | 16 +
.../stylesheets/admins/laboratories.scss | 1 +
app/assets/stylesheets/application.css | 16 -
app/assets/stylesheets/cooperative.scss | 54 +
.../stylesheets/cooperative/common.scss | 126 +
.../cooperative/laboratory_settings.scss | 76 +
.../stylesheets/cooperative/sidebar.scss | 235 +
app/controllers/admins/base_controller.rb | 4 +-
.../concerns/admins/render_helper.rb | 34 +-
.../{admins => base}/error_rescue_handler.rb | 2 +-
.../{admins => base}/paginate_helper.rb | 2 +-
.../concerns/base/render_helper.rb | 37 +
.../concerns/cooperative/render_helper.rb | 16 +
.../cooperative/base_controller.rb | 58 +
.../cooperative/dashboards_controller.rb | 4 +
.../laboratory_settings_controller.rb | 14 +
app/helpers/admins/base_helper.rb | 109 +-
app/helpers/cooperative/base_helper.rb | 3 +
app/helpers/manage_back_helper.rb | 115 +
app/models/laboratory.rb | 2 +
app/views/admins/shared/error.js.erb | 2 +-
.../cooperative/dashboards/show.html.erb | 3 +
.../cooperative/kaminari/_first_page.html.erb | 11 +
app/views/cooperative/kaminari/_gap.html.erb | 13 +
.../cooperative/kaminari/_last_page.html.erb | 11 +
.../cooperative/kaminari/_next_page.html.erb | 11 +
app/views/cooperative/kaminari/_page.html.erb | 19 +
.../cooperative/kaminari/_paginator.html.erb | 27 +
.../cooperative/kaminari/_prev_page.html.erb | 11 +
.../laboratory_settings/edit.html.erb | 129 +
.../shared/_no_data_for_table.html.erb | 1 +
.../cooperative/shared/_paginate.html.erb | 6 +
.../cooperative/shared/_sidebar.html.erb | 20 +
.../shared/after_render_js_hook.js.erb | 4 +
app/views/cooperative/shared/delete.js.erb | 27 +
app/views/cooperative/shared/error.js.erb | 10 +
.../shared/modal/_message_modal.html.erb | 18 +
.../shared/modal/_upload_file_modal.html.erb | 32 +
app/views/layouts/admin.html.erb | 4 +-
app/views/layouts/cooperative.html.erb | 42 +
app/views/{admins => }/shared/403.html.erb | 0
app/views/{admins => }/shared/404.html.erb | 0
app/views/{admins => }/shared/422.html.erb | 0
app/views/{admins => }/shared/500.html.erb | 0
app/views/{admins => }/shared/_alert.html.erb | 0
.../{admins => }/shared/_breadcrumb.html.erb | 6 +-
.../shared/_flash_notice.html.erb | 0
config/initializers/assets.rb | 2 +-
config/routes.rb | 8 +
...fest-4627fa5586ef7fed55ca286af7c028e9.json | 2 +-
...d78be4066fc7593ba53ee92aa17068a199d6d.css} | 17 +-
...be4066fc7593ba53ee92aa17068a199d6d.css.gz} | Bin 73577 -> 73582 bytes
...1ced127244ba401ef5b7d677cab9741688d2.js.gz | Bin 961106 -> 0 bytes
...5a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js} | 8 +
...1adbbaadaa07fd74e2655e64d44b4b97fc4a.js.gz | Bin 0 -> 961157 bytes
...b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css | 11976 ++
...cbbc0d6c7c6e85c8a6f42f39ac618943de8.css.gz | Bin 0 -> 31662 bytes
...e1c2b2e60336f0f01e19f0581663918708fb.js.gz | Bin 146867 -> 146867 bytes
...75b6e1b118c55b4c7d165665c488fac80c4997.css | 57528 -------
...6e1b118c55b4c7d165665c488fac80c4997.css.gz | Bin 158415 -> 0 bytes
...7815c096c25e0ab74aba341ae916166cd287.js.gz | Bin 711176 -> 711176 bytes
...b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js | 134018 +++++++++++++++
...004e1d0bcd87c132fb1a7bab6144c1deb8d7.js.gz | Bin 0 -> 951536 bytes
...7012ffcde429187983e2aea5657abb56b9b4f3.css | 25429 +++
...2ffcde429187983e2aea5657abb56b9b4f3.css.gz | Bin 0 -> 71782 bytes
68 files changed, 172799 insertions(+), 57705 deletions(-)
create mode 100644 app/assets/javascripts/cooperative.js
create mode 100644 app/assets/javascripts/cooperative/laboratory_settings/edit.js
create mode 100644 app/assets/javascripts/cooperative/sidebar.js
delete mode 100644 app/assets/stylesheets/application.css
create mode 100644 app/assets/stylesheets/cooperative.scss
create mode 100644 app/assets/stylesheets/cooperative/common.scss
create mode 100644 app/assets/stylesheets/cooperative/laboratory_settings.scss
create mode 100644 app/assets/stylesheets/cooperative/sidebar.scss
rename app/controllers/concerns/{admins => base}/error_rescue_handler.rb (94%)
rename app/controllers/concerns/{admins => base}/paginate_helper.rb (94%)
create mode 100644 app/controllers/concerns/base/render_helper.rb
create mode 100644 app/controllers/concerns/cooperative/render_helper.rb
create mode 100644 app/controllers/cooperative/base_controller.rb
create mode 100644 app/controllers/cooperative/dashboards_controller.rb
create mode 100644 app/controllers/cooperative/laboratory_settings_controller.rb
create mode 100644 app/helpers/cooperative/base_helper.rb
create mode 100644 app/helpers/manage_back_helper.rb
create mode 100644 app/views/cooperative/dashboards/show.html.erb
create mode 100644 app/views/cooperative/kaminari/_first_page.html.erb
create mode 100644 app/views/cooperative/kaminari/_gap.html.erb
create mode 100644 app/views/cooperative/kaminari/_last_page.html.erb
create mode 100644 app/views/cooperative/kaminari/_next_page.html.erb
create mode 100644 app/views/cooperative/kaminari/_page.html.erb
create mode 100644 app/views/cooperative/kaminari/_paginator.html.erb
create mode 100644 app/views/cooperative/kaminari/_prev_page.html.erb
create mode 100644 app/views/cooperative/laboratory_settings/edit.html.erb
create mode 100644 app/views/cooperative/shared/_no_data_for_table.html.erb
create mode 100644 app/views/cooperative/shared/_paginate.html.erb
create mode 100644 app/views/cooperative/shared/_sidebar.html.erb
create mode 100644 app/views/cooperative/shared/after_render_js_hook.js.erb
create mode 100644 app/views/cooperative/shared/delete.js.erb
create mode 100644 app/views/cooperative/shared/error.js.erb
create mode 100644 app/views/cooperative/shared/modal/_message_modal.html.erb
create mode 100644 app/views/cooperative/shared/modal/_upload_file_modal.html.erb
create mode 100644 app/views/layouts/cooperative.html.erb
rename app/views/{admins => }/shared/403.html.erb (100%)
rename app/views/{admins => }/shared/404.html.erb (100%)
rename app/views/{admins => }/shared/422.html.erb (100%)
rename app/views/{admins => }/shared/500.html.erb (100%)
rename app/views/{admins => }/shared/_alert.html.erb (100%)
rename app/views/{admins => }/shared/_breadcrumb.html.erb (61%)
rename app/views/{admins => }/shared/_flash_notice.html.erb (100%)
rename public/assets/{admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css => admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css} (99%)
rename public/assets/{admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css.gz => admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css.gz} (97%)
delete mode 100644 public/assets/admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js.gz
rename public/assets/{admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js => admin-c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js} (99%)
create mode 100644 public/assets/admin-c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js.gz
create mode 100644 public/assets/application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css
create mode 100644 public/assets/application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css.gz
delete mode 100644 public/assets/application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css
delete mode 100644 public/assets/application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css.gz
create mode 100644 public/assets/cooperative-04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js
create mode 100644 public/assets/cooperative-04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js.gz
create mode 100644 public/assets/cooperative-a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3.css
create mode 100644 public/assets/cooperative-a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3.css.gz
diff --git a/app/assets/javascripts/common.js b/app/assets/javascripts/common.js
index 8ff5c7bb7..66158b17e 100644
--- a/app/assets/javascripts/common.js
+++ b/app/assets/javascripts/common.js
@@ -64,4 +64,12 @@ function customConfirm(opts){
}
}
return $.confirm($.extend({}, defaultOpts, opts))
+}
+
+function show_success_flash(){
+ $.notify({
+ message: '操作成功'
+ },{
+ type: 'success'
+ });
}
\ No newline at end of file
diff --git a/app/assets/javascripts/cooperative.js b/app/assets/javascripts/cooperative.js
new file mode 100644
index 000000000..77e0477eb
--- /dev/null
+++ b/app/assets/javascripts/cooperative.js
@@ -0,0 +1,91 @@
+//= 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.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 () {
+});
diff --git a/app/assets/javascripts/cooperative/laboratory_settings/edit.js b/app/assets/javascripts/cooperative/laboratory_settings/edit.js
new file mode 100644
index 000000000..50bb96ac9
--- /dev/null
+++ b/app/assets/javascripts/cooperative/laboratory_settings/edit.js
@@ -0,0 +1,86 @@
+$(document).on('turbolinks:load', function() {
+ if ($('body.cooperative-laboratory-settings-edit-page, body.cooperative-laboratory-settings-update-page').length > 0) {
+ var $container = $('.edit-laboratory-setting-container');
+ var $form = $container.find('.edit_laboratory');
+
+ $('.logo-item-left').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);
+ }
+ });
+ })
+ }
+});
\ No newline at end of file
diff --git a/app/assets/javascripts/cooperative/sidebar.js b/app/assets/javascripts/cooperative/sidebar.js
new file mode 100644
index 000000000..dea677d54
--- /dev/null
+++ b/app/assets/javascripts/cooperative/sidebar.js
@@ -0,0 +1,16 @@
+$(document).on('turbolinks:load', function(){
+ $('#sidebarCollapse').on('click', function () {
+ $(this).toggleClass('active');
+ $('#sidebar').toggleClass('active');
+ $.cookie('cooperative_sidebar_collapse', $(this).hasClass('active'), {path: '/cooperative'});
+ });
+
+ 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');
+ }
+});
\ No newline at end of file
diff --git a/app/assets/stylesheets/admins/laboratories.scss b/app/assets/stylesheets/admins/laboratories.scss
index ad5c8c5a8..69f4586d1 100644
--- a/app/assets/stylesheets/admins/laboratories.scss
+++ b/app/assets/stylesheets/admins/laboratories.scss
@@ -31,6 +31,7 @@
display: block;
width: 80px;
height: 80px;
+ background: #f0f0f0;
}
&-upload {
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
deleted file mode 100644
index fad1eb25d..000000000
--- a/app/assets/stylesheets/application.css
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * This is a manifest file that'll be compiled into application.css, which will include all the files
- * listed below.
- *
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
- * vendor/assets/stylesheets directory can be referenced here using a relative path.
- *
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
- * files in this directory. Styles in this file should be added after the last require_* statement.
- * It is generally better to create a new file per style scope.
- *
- *= require_tree .
- *= require_self
-
- */
diff --git a/app/assets/stylesheets/cooperative.scss b/app/assets/stylesheets/cooperative.scss
new file mode 100644
index 000000000..56984b96b
--- /dev/null
+++ b/app/assets/stylesheets/cooperative.scss
@@ -0,0 +1,54 @@
+@import "bootstrap";
+@import "font-awesome-sprockets";
+@import "font-awesome";
+@import "select2.min";
+@import "select2-bootstrap4.min";
+@import "bootstrap-datepicker";
+@import "bootstrap-datepicker.standalone";
+@import "jquery.mloading";
+@import "jquery-confirm.min";
+
+@import "codemirror/lib/codemirror";
+@import "editormd/css/editormd.min";
+@import "dragula/dragula";
+
+@import "common";
+@import "cooperative/*";
+
+body {
+ width: 100vw;
+ height: 100vh;
+ max-width: 100vw;
+ max-height: 100vh;
+ display: flex;
+ align-items: stretch;
+ font-size: 14px;
+ background: #efefef;
+ overflow: hidden;
+}
+
+.simple_form {
+ .form-group {
+ .collection_radio_buttons {
+ margin-bottom: 0px;
+ }
+
+ .form-check-inline {
+ height: calc(1.5em + 0.75rem + 2px)
+ }
+ }
+}
+
+input.form-control {
+ font-size: 14px;
+}
+
+.btn-default{
+ color: #666;
+ background: #e1e1e1!important;
+}
+.export-absolute{
+ right:20px;
+ position: absolute;
+}
+
diff --git a/app/assets/stylesheets/cooperative/common.scss b/app/assets/stylesheets/cooperative/common.scss
new file mode 100644
index 000000000..488dd4caa
--- /dev/null
+++ b/app/assets/stylesheets/cooperative/common.scss
@@ -0,0 +1,126 @@
+.cooperative-body-container {
+ padding: 20px;
+ flex: 1;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ overflow-y: scroll;
+
+ & > .content {
+ flex: 1;
+ font-size: 14px;
+
+ .box {
+ padding: 20px;
+ border-radius: 5px;
+ background: #fff;
+ }
+ }
+
+ /* 面包屑 */
+ .breadcrumb {
+ padding-left: 5px;
+ font-size: 20px;
+ background: unset;
+ }
+
+ /* 内容表格 */
+ table {
+ table-layout: fixed;
+
+ td {
+ vertical-align: middle;
+ }
+
+ tr {
+ &.no-data {
+ &:hover {
+ color: darkgrey;
+ background: unset;
+ }
+
+ & > td {
+ text-align: center;
+ height: 300px;
+ }
+ }
+ }
+ }
+
+ .action-container {
+ & > .action {
+ padding: 0 3px;
+ }
+
+ .more-action-dropdown {
+ .dropdown-item {
+ font-size: 14px;
+ }
+ }
+ }
+
+ /* 分页 */
+ .paginate-container {
+ margin-top: 20px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .paginate-total {
+ margin-bottom: 10px;
+ color: darkgrey;
+ }
+
+ .pagination {
+ margin-bottom: 0px;
+ }
+ }
+
+ /* 搜索表单 */
+ .search-form-container {
+ display: flex;
+ margin-bottom: 20px;
+
+ .search-form {
+ flex: 1;
+
+ * { font-size: 14px; }
+
+ select, input {
+ margin-right: 10px;
+ font-size: 14px;
+ }
+ }
+ }
+
+ .global-error {
+ color: grey;
+ min-height: 300px;
+
+ &-code {
+ font-size: 80px;
+ }
+
+ &-text {
+ font-size: 24px;
+ }
+ }
+
+ .nav-tabs {
+ .nav-link {
+ padding: 0.5rem 2rem;
+ }
+ }
+
+ .CodeMirror {
+ border: 1px solid #ced4da;
+ }
+
+ .batch-action-container {
+ margin-bottom: -15px;
+ padding: 10px 20px 0;
+ background: #fff;
+ }
+}
+
diff --git a/app/assets/stylesheets/cooperative/laboratory_settings.scss b/app/assets/stylesheets/cooperative/laboratory_settings.scss
new file mode 100644
index 000000000..fde0cddc3
--- /dev/null
+++ b/app/assets/stylesheets/cooperative/laboratory_settings.scss
@@ -0,0 +1,76 @@
+.cooperative-laboratory-settings-edit-page, .cooperative-laboratory-settings-update-page {
+ .edit-laboratory-setting-container {
+ .logo-item {
+ display: flex;
+
+ &-img {
+ display: block;
+ width: 80px;
+ height: 80px;
+ background: #f0f0f0;
+ }
+
+ &-upload {
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ width: 80px;
+ height: 80px;
+ background: #F5F5F5;
+ border: 1px solid #E5E5E5;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 27px;
+ left: 39px;
+ width: 2px;
+ height: 26px;
+ background: #E5E5E5;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: 39px;
+ left: 27px;
+ width: 26px;
+ height: 2px;
+ background: #E5E5E5;
+ }
+ }
+
+ &-left {
+ position: relative;
+ width: 80px;
+ height: 80px;
+
+ &.has-img {
+ .logo-item-upload {
+ display: none;
+ }
+
+ &:hover {
+ .logo-item-upload {
+ display: block;
+ background: rgba(145, 145, 145, 0.8);
+ }
+ }
+ }
+ }
+
+ &-right {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ color: #777777;
+ font-size: 12px;
+ }
+
+ &-title {
+ color: #23272B;
+ font-size: 14px;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/assets/stylesheets/cooperative/sidebar.scss b/app/assets/stylesheets/cooperative/sidebar.scss
new file mode 100644
index 000000000..e943acd90
--- /dev/null
+++ b/app/assets/stylesheets/cooperative/sidebar.scss
@@ -0,0 +1,235 @@
+#sidebar {
+ min-width: 200px;
+ max-width: 200px;
+ background: #272822;
+ color: #fff;
+ transition: all 0.5s;
+ overflow-y: scroll;
+
+ &::-webkit-scrollbar {
+ display:none
+ }
+
+ &.active {
+ min-width: 60px;
+ max-width: 60px;
+ text-align: center;
+
+ .sidebar-header {
+ padding: 10px;
+ display: flex;
+ flex-direction: column;
+
+ &-logo {
+ overflow: hidden;
+ margin-bottom: 10px;
+
+ & > .logo-label {
+ display: none;
+ }
+ }
+ }
+
+ ul li a {
+ padding: 10px;
+ text-align: center;
+ font-size: 0.85em;
+ display: flex;
+ justify-content: center;
+
+ span { display: none }
+
+ i {
+ margin-right: 0;
+ display: block;
+ font-size: 1.8em;
+ margin-bottom: 5px;
+ width: 30px;
+ height: 20px;
+ }
+ }
+
+ .dropdown-toggle::after {
+ top: auto;
+ bottom: 10px;
+ right: 50%;
+ -webkit-transform: translateX(50%);
+ -ms-transform: translateX(50%);
+ transform: translateX(50%);
+ }
+
+ ul ul a {
+ padding: 10px !important;
+
+ span { display: none }
+
+ i {
+ margin-left: 0px;
+ display: block;
+ font-size: 0.8em;
+ width: 30px;
+ height: 10px;
+ }
+ }
+ }
+
+ .sidebar-header {
+ padding: 20px;
+ background: #272822;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+
+ &-logo {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ & > img {
+ width: 40px;
+ height: auto;
+ }
+
+ & > .logo-label {
+ font-size: 18px;
+ color: darkgrey;
+ margin-left: 10px;
+ }
+ }
+ }
+
+ #sidebarCollapse {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ text-align: right;
+
+ &.active {
+ width: 40px;
+ height: 30px;
+ background: #3f3f3f;
+ border: 1px solid grey;
+ border-radius: 3px;
+
+ i.fold { display: none; }
+ i.unfold { display: block; }
+ }
+
+ i.fold {
+ display: block;
+ }
+ i.unfold { display: none; }
+ }
+
+ a, a:hover, a:focus {
+ color: inherit;
+ text-decoration: none;
+ transition: all 0.3s;
+ }
+
+ & > ul > li > a > i {
+ width: 14px;
+ height: 14px;
+ }
+
+ ul {
+ &.components {
+ padding: 20px 0;
+ border-bottom: 1px solid #3f3f3f;
+ }
+
+ p {
+ color: #fff;
+ padding: 10px;
+ }
+
+ li > a {
+ padding: 10px;
+ font-size: 1em;
+ display: block;
+ text-align: left;
+
+ i {
+ margin-right: 10px;
+ font-size: 1em;
+ margin-bottom: 5px;
+ }
+ }
+
+ li a {
+ &:hover, &.active {
+ color: #fff;
+ background: #276891;
+ }
+ }
+
+ li.active > a, a[aria-expanded="true"] {
+ color: #fff;
+ //background: #276891;
+ }
+
+ ul a {
+ font-size: 0.9em !important;
+ padding-left: 30px !important;
+ background: #3f3f3f;
+ }
+ }
+}
+
+@media (max-width: 768px) {
+ #sidebar {
+ &.active {
+ padding: 10px 5px;
+ min-width: 40px;
+ max-width: 40px;
+ text-align: center;
+ margin-left: 0;
+ transform: none;
+
+ .sidebar-header {
+ padding: 0px;
+
+ .sidebar-header-logo {
+ display: none;
+ }
+
+ #sidebarCollapse {
+ width: 30px;
+ height: 20px;
+ }
+ }
+
+ ul li a {
+ padding: 10px;
+ font-size: 0.85em;
+
+ i {
+ margin-right: 0;
+ display: block;
+ margin-bottom: 5px;
+ }
+ }
+
+ & > ul > li > a > i {
+ font-size: 1.8em;
+ }
+
+ ul ul a {
+ padding: 10px !important;
+ }
+ }
+
+ .sidebar-header {
+ }
+ }
+
+ .dropdown-toggle::after {
+ top: auto;
+ bottom: 10px;
+ right: 50%;
+ -webkit-transform: translateX(50%);
+ -ms-transform: translateX(50%);
+ transform: translateX(50%);
+ }
+}
diff --git a/app/controllers/admins/base_controller.rb b/app/controllers/admins/base_controller.rb
index 345df3e31..e2e3babae 100644
--- a/app/controllers/admins/base_controller.rb
+++ b/app/controllers/admins/base_controller.rb
@@ -1,7 +1,7 @@
class Admins::BaseController < ApplicationController
- include Admins::PaginateHelper
+ include Base::PaginateHelper
include Admins::RenderHelper
- include Admins::ErrorRescueHandler
+ include Base::ErrorRescueHandler
layout 'admin'
diff --git a/app/controllers/concerns/admins/render_helper.rb b/app/controllers/concerns/admins/render_helper.rb
index 0f136b62d..a43a094d3 100644
--- a/app/controllers/concerns/admins/render_helper.rb
+++ b/app/controllers/concerns/admins/render_helper.rb
@@ -1,39 +1,7 @@
module Admins::RenderHelper
extend ActiveSupport::Concern
- def render_by_format(hash)
- format = request.format.symbol
- hash.key?(format) ? hash[format].call : hash[:html].call
- end
-
- def render_forbidden
- render_by_format(html: -> { current_user&.business? ? render('admins/shared/403') : redirect_to('/403') },
- json: -> { render status: 403, json: { messages: I18n.t('error.forbidden') } } )
- end
-
- def render_not_found
- render_by_format(html: -> { render 'admins/shared/404' },
- js: -> { render_js_error('资源未找到') },
- json: -> { render status: 404, json: { message: '资源未找到' } })
- end
-
- def render_unprocessable_entity(message, type: :alert)
- render_by_format(html: -> { render 'admins/shared/422' },
- js: -> { render_js_error(message, type: type) },
- json: -> { render status: 422, json: { message: message } })
- end
- alias_method :render_error, :render_unprocessable_entity
-
- def internal_server_error(message = '系统错误')
- @message = message
- render_by_format(html: -> { render 'admins/shared/500' },
- js: -> { render_js_error(message) },
- json: -> { render status: 500, json: { message: message } })
- end
-
- def render_js_template(template, **opts)
- render({ template: template, formats: :js }.merge(opts))
- end
+ include Base::RenderHelper
def render_delete_success
render_js_template 'admins/shared/delete'
diff --git a/app/controllers/concerns/admins/error_rescue_handler.rb b/app/controllers/concerns/base/error_rescue_handler.rb
similarity index 94%
rename from app/controllers/concerns/admins/error_rescue_handler.rb
rename to app/controllers/concerns/base/error_rescue_handler.rb
index ceb810f36..d64ce4356 100644
--- a/app/controllers/concerns/admins/error_rescue_handler.rb
+++ b/app/controllers/concerns/base/error_rescue_handler.rb
@@ -1,4 +1,4 @@
-module Admins::ErrorRescueHandler
+module Base::ErrorRescueHandler
extend ActiveSupport::Concern
included do
diff --git a/app/controllers/concerns/admins/paginate_helper.rb b/app/controllers/concerns/base/paginate_helper.rb
similarity index 94%
rename from app/controllers/concerns/admins/paginate_helper.rb
rename to app/controllers/concerns/base/paginate_helper.rb
index da7652584..a10d7eb2e 100644
--- a/app/controllers/concerns/admins/paginate_helper.rb
+++ b/app/controllers/concerns/base/paginate_helper.rb
@@ -1,4 +1,4 @@
-module Admins::PaginateHelper
+module Base::PaginateHelper
extend ActiveSupport::Concern
def offset
diff --git a/app/controllers/concerns/base/render_helper.rb b/app/controllers/concerns/base/render_helper.rb
new file mode 100644
index 000000000..e0aa49ac1
--- /dev/null
+++ b/app/controllers/concerns/base/render_helper.rb
@@ -0,0 +1,37 @@
+module Base::RenderHelper
+ extend ActiveSupport::Concern
+
+ def render_by_format(hash)
+ format = request.format.symbol
+ hash.key?(format) ? hash[format].call : hash[:html].call
+ end
+
+ def render_forbidden
+ render_by_format(html: -> { current_user&.business? ? render('shared/403') : redirect_to('/403') },
+ json: -> { render status: 403, json: { messages: I18n.t('error.forbidden') } } )
+ end
+
+ def render_not_found
+ render_by_format(html: -> { render 'shared/404' },
+ js: -> { render_js_error('资源未找到') },
+ json: -> { render status: 404, json: { message: '资源未找到' } })
+ end
+
+ def render_unprocessable_entity(message, type: :alert)
+ render_by_format(html: -> { render 'shared/422' },
+ js: -> { render_js_error(message, type: type) },
+ json: -> { render status: 422, json: { message: message } })
+ end
+ alias_method :render_error, :render_unprocessable_entity
+
+ def internal_server_error(message = '系统错误')
+ @message = message
+ render_by_format(html: -> { render 'shared/500' },
+ js: -> { render_js_error(message) },
+ json: -> { render status: 500, json: { message: message } })
+ end
+
+ def render_js_template(template, **opts)
+ render({ template: template, formats: :js }.merge(opts))
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/concerns/cooperative/render_helper.rb b/app/controllers/concerns/cooperative/render_helper.rb
new file mode 100644
index 000000000..3110ca304
--- /dev/null
+++ b/app/controllers/concerns/cooperative/render_helper.rb
@@ -0,0 +1,16 @@
+module Cooperative::RenderHelper
+ include Base::RenderHelper
+
+ def render_delete_success
+ render_js_template 'cooperative/shared/delete'
+ end
+ alias_method :render_success_js, :render_delete_success
+
+ def render_js_error(message, type: :alert)
+ if type == :notify
+ render js: "$.notify({ message: '#{message}' },{ type: 'danger', delay: 5000 });"
+ else
+ render_js_template 'cooperative/shared/error', locals: { message: message }
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/cooperative/base_controller.rb b/app/controllers/cooperative/base_controller.rb
new file mode 100644
index 000000000..e91f52b91
--- /dev/null
+++ b/app/controllers/cooperative/base_controller.rb
@@ -0,0 +1,58 @@
+class Cooperative::BaseController < ApplicationController
+ include Base::PaginateHelper
+ include Cooperative::RenderHelper
+ include Base::ErrorRescueHandler
+
+ layout 'cooperative'
+
+ skip_before_action :verify_authenticity_token
+
+ before_action :laboratory_exist!, :require_login, :require_cooperative_manager!
+
+ after_action :rebind_event_if_ajax_render_partial
+
+ helper_method :current_laboratory, :current_setting_or_default
+
+ private
+
+ def current_laboratory
+ @_current_laboratory ||= Laboratory.find_by_subdomain(request.subdomain)
+ end
+
+ def current_setting_or_default(name)
+ current_laboratory.public_send(name) || default_setting.public_send(name)
+ end
+
+ def laboratory_exist!
+ return if current_laboratory.present?
+
+ redirect_to '/nopage'
+ end
+
+ def require_login
+ return if User.current.logged?
+
+ redirect_to "/login?back_url=#{CGI::escape(request.fullpath)}"
+ end
+
+ def require_cooperative_manager!
+ return if current_user.blank? || !current_user.logged?
+ return if current_user.admin_or_business?
+ return if current_laboratory.laboratory_users.exists?(user_id: current_user.id)
+
+ render_forbidden
+ end
+
+ # 触发after ajax render partial hooks,执行一些因为局部刷新后失效的绑定事件
+ def rebind_event_if_ajax_render_partial
+ return if request.format.symbol != :js
+ return if response.content_type != 'text/javascript'
+
+ path = Rails.root.join('app/views/shared/after_render_js_hook.js.erb')
+ return unless File.exists?(path)
+
+ append_js = ERB.new(File.open(path).read).result
+ response.body += append_js
+ end
+
+end
\ No newline at end of file
diff --git a/app/controllers/cooperative/dashboards_controller.rb b/app/controllers/cooperative/dashboards_controller.rb
new file mode 100644
index 000000000..4a9a11330
--- /dev/null
+++ b/app/controllers/cooperative/dashboards_controller.rb
@@ -0,0 +1,4 @@
+class Cooperative::DashboardsController < Cooperative::BaseController
+ def show
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/cooperative/laboratory_settings_controller.rb b/app/controllers/cooperative/laboratory_settings_controller.rb
new file mode 100644
index 000000000..d9ba70d9d
--- /dev/null
+++ b/app/controllers/cooperative/laboratory_settings_controller.rb
@@ -0,0 +1,14 @@
+class Cooperative::LaboratorySettingsController < Cooperative::BaseController
+ def edit
+ @laboratory = current_laboratory
+ end
+
+ def update
+ Admins::SaveLaboratorySettingService.call(current_laboratory, form_params)
+ render_ok
+ end
+
+ def form_params
+ params.permit(:identifier, :name, :nav_logo, :login_logo, :tab_logo, :footer, navbar: %i[name link hidden])
+ end
+end
\ No newline at end of file
diff --git a/app/helpers/admins/base_helper.rb b/app/helpers/admins/base_helper.rb
index d79456ac8..95e54db46 100644
--- a/app/helpers/admins/base_helper.rb
+++ b/app/helpers/admins/base_helper.rb
@@ -1,110 +1,3 @@
module Admins::BaseHelper
- def sidebar_item_group(url, text, **opts)
- link_opts = url.start_with?('/') ? {} : { 'data-toggle': 'collapse', 'aria-expanded': false }
- content =
- link_to url, link_opts do
- content_tag(:i, '', class: "fa fa-#{opts[:icon]}", 'data-toggle': 'tooltip', 'data-placement': 'right', 'data-boundary': 'window', title: text) +
- content_tag(:span, text)
- end
-
- content +=
- content_tag(:ul, id: url[1..-1], class: 'collapse list-unstyled', "data-parent": '#sidebar') do
- yield
- end
-
- raw content
- end
-
- def sidebar_item(url, text, **opts)
- content =
- link_to url, 'data-controller': opts[:controller] do
- content_tag(:i, '', class: "fa fa-#{opts[:icon]} fa-fw", 'data-toggle': 'tooltip', 'data-placement': 'right', 'data-boundary': 'window', title: text) +
- content_tag(:span, text)
- end
-
- raw content
- end
-
- def admin_sidebar_controller
- key = params[:controller].to_s.gsub(/\//, '-')
- SidebarUtil.controller_name(key) || key
- end
-
- def define_admin_breadcrumbs(&block)
- content_for(:setup_admin_breadcrumb, &block)
- end
-
- def add_admin_breadcrumb(text, url = nil)
- @_admin_breadcrumbs ||= []
- @_admin_breadcrumbs << OpenStruct.new(text: text, url: url)
- end
-
- def display_text(str, default = '--')
- str.presence || default
- end
-
- def overflow_hidden_span(text, width: 300)
- opts = { class: 'd-inline-block text-truncate', style: "max-width: #{width}px" }
- opts.merge!('data-toggle': 'tooltip', title: text) if text != '--'
-
- content_tag(:span, text, opts)
- end
-
- def sort_tag(content = '', **opts)
- options = {}
- options[:sort_by] = opts.delete(:name)
- is_current_sort = params[:sort_by].to_s == options[:sort_by]
- options[:sort_direction] = is_current_sort && params[:sort_direction].to_s == 'desc' ? 'asc' : 'desc'
-
- path = opts.delete(:path) + "?" + unsafe_params.merge(options).to_query
- arrow_class = case params[:sort_direction].to_s
- when 'desc' then 'fa-sort-amount-desc'
- when 'asc' then 'fa-sort-amount-asc'
- else ''
- end
- opts[:style] = "#{opts[:style]} ;position: relative;"
-
- content_tag(:span, opts) do
- link_to path, remote: true do
- content = content_tag(:span) { yield } if block_given?
-
- content += content_tag(:i, '', class: "fa color-light-green ml-1 #{arrow_class}", style: 'position: absolute;top:0;') if is_current_sort
- raw content
- end
- end
- end
-
- def javascript_void_link(name, **opts)
- raw link_to(name, 'javascript:void(0)', opts)
- end
-
- def agree_link(name, url, **opts)
- klass = ['action agree-action', opts.delete(:class)].compact.join(' ')
-
- refresh_url_data = "refresh_url=#{CGI::escape(request.fullpath)}"
- url = url + (url.index('?') ? '&' : '?') + refresh_url_data
-
- raw link_to(name, url, { method: :post, remote: true, class: klass, 'data-confirm': '确认审核通过?'}.merge(opts))
- end
-
- def delete_link(name, url, **opts, &block)
- klass = ['action delete-action', opts.delete(:class)].compact.join(' ')
-
- refresh_url_data = "refresh_url=#{CGI::escape(request.fullpath)}"
- url = url + (url.index('?') ? '&' : '?') + refresh_url_data
-
- if block_given?
- raw link_to(url, { method: :delete, remote: true, class: klass, 'data-confirm': '确认删除?'}.merge(opts), &block)
- else
- raw link_to(name, url, { method: :delete, remote: true, class: klass, 'data-confirm': '确认删除?'}.merge(opts))
- end
- end
-
- def unsafe_params
- params.except(:controller, :action).to_unsafe_h
- end
-
- def list_index_no(page,index)
- (page - 1) * 20 + index + 1
- end
+ include ManageBackHelper
end
\ No newline at end of file
diff --git a/app/helpers/cooperative/base_helper.rb b/app/helpers/cooperative/base_helper.rb
new file mode 100644
index 000000000..de95813f1
--- /dev/null
+++ b/app/helpers/cooperative/base_helper.rb
@@ -0,0 +1,3 @@
+module Cooperative::BaseHelper
+ include ManageBackHelper
+end
\ No newline at end of file
diff --git a/app/helpers/manage_back_helper.rb b/app/helpers/manage_back_helper.rb
new file mode 100644
index 000000000..cfc67d714
--- /dev/null
+++ b/app/helpers/manage_back_helper.rb
@@ -0,0 +1,115 @@
+module ManageBackHelper
+ extend ActiveSupport::Concern
+
+ def sidebar_item_group(url, text, **opts)
+ link_opts = url.start_with?('/') ? {} : { 'data-toggle': 'collapse', 'aria-expanded': false }
+ content =
+ link_to url, link_opts do
+ content_tag(:i, '', class: "fa fa-#{opts[:icon]}", 'data-toggle': 'tooltip', 'data-placement': 'right', 'data-boundary': 'window', title: text) +
+ content_tag(:span, text)
+ end
+
+ content +=
+ content_tag(:ul, id: url[1..-1], class: 'collapse list-unstyled', "data-parent": '#sidebar') do
+ yield
+ end
+
+ raw content
+ end
+
+ def sidebar_item(url, text, **opts)
+ content =
+ link_to url, 'data-controller': opts[:controller] do
+ content_tag(:i, '', class: "fa fa-#{opts[:icon]} fa-fw", 'data-toggle': 'tooltip', 'data-placement': 'right', 'data-boundary': 'window', title: text) +
+ content_tag(:span, text)
+ end
+
+ raw content
+ end
+
+ def admin_sidebar_controller
+ key = params[:controller].to_s.gsub(/\//, '-')
+ SidebarUtil.controller_name(key) || key
+ end
+ alias_method :sidebar_controller, :admin_sidebar_controller
+
+ def define_admin_breadcrumbs(&block)
+ content_for(:setup_admin_breadcrumb, &block)
+ end
+ alias_method :define_breadcrumbs, :define_admin_breadcrumbs
+
+ def add_admin_breadcrumb(text, url = nil)
+ @_breadcrumbs ||= []
+ @_breadcrumbs << OpenStruct.new(text: text, url: url)
+ end
+ alias_method :add_breadcrumb, :add_admin_breadcrumb
+
+ def display_text(str, default = '--')
+ str.presence || default
+ end
+
+ def overflow_hidden_span(text, width: 300)
+ opts = { class: 'd-inline-block text-truncate', style: "max-width: #{width}px" }
+ opts.merge!('data-toggle': 'tooltip', title: text) if text != '--'
+
+ content_tag(:span, text, opts)
+ end
+
+ def sort_tag(content = '', **opts)
+ options = {}
+ options[:sort_by] = opts.delete(:name)
+ is_current_sort = params[:sort_by].to_s == options[:sort_by]
+ options[:sort_direction] = is_current_sort && params[:sort_direction].to_s == 'desc' ? 'asc' : 'desc'
+
+ path = opts.delete(:path) + "?" + unsafe_params.merge(options).to_query
+ arrow_class = case params[:sort_direction].to_s
+ when 'desc' then 'fa-sort-amount-desc'
+ when 'asc' then 'fa-sort-amount-asc'
+ else ''
+ end
+ opts[:style] = "#{opts[:style]} ;position: relative;"
+
+ content_tag(:span, opts) do
+ link_to path, remote: true do
+ content = content_tag(:span) { yield } if block_given?
+
+ content += content_tag(:i, '', class: "fa color-light-green ml-1 #{arrow_class}", style: 'position: absolute;top:0;') if is_current_sort
+ raw content
+ end
+ end
+ end
+
+ def javascript_void_link(name, **opts)
+ raw link_to(name, 'javascript:void(0)', opts)
+ end
+
+ def agree_link(name, url, **opts)
+ klass = ['action agree-action', opts.delete(:class)].compact.join(' ')
+
+ refresh_url_data = "refresh_url=#{CGI::escape(request.fullpath)}"
+ url = url + (url.index('?') ? '&' : '?') + refresh_url_data
+
+ raw link_to(name, url, { method: :post, remote: true, class: klass, 'data-confirm': '确认审核通过?'}.merge(opts))
+ end
+
+ def delete_link(name, url, **opts, &block)
+ klass = ['action delete-action', opts.delete(:class)].compact.join(' ')
+
+ refresh_url_data = "refresh_url=#{CGI::escape(request.fullpath)}"
+ url = url + (url.index('?') ? '&' : '?') + refresh_url_data
+
+ if block_given?
+ raw link_to(url, { method: :delete, remote: true, class: klass, 'data-confirm': '确认删除?'}.merge(opts), &block)
+ else
+ raw link_to(name, url, { method: :delete, remote: true, class: klass, 'data-confirm': '确认删除?'}.merge(opts))
+ end
+ end
+
+ def unsafe_params
+ params.except(:controller, :action).to_unsafe_h
+ end
+
+ def list_index_no(page,index)
+ (page - 1) * 20 + index + 1
+ end
+end
\ No newline at end of file
diff --git a/app/models/laboratory.rb b/app/models/laboratory.rb
index 00f5adabf..35965dc0d 100644
--- a/app/models/laboratory.rb
+++ b/app/models/laboratory.rb
@@ -10,6 +10,8 @@ class Laboratory < ApplicationRecord
validates :identifier, uniqueness: { case_sensitive: false }, allow_nil: true
+ delegate :name, :navbar, :footer, :login_logo_url, :nav_logo_url, :tab_logo_url, :default_navbar, to: :laboratory_setting
+
def site
rails_env = EduSetting.get('rails_env')
suffix = rails_env && rails_env != 'production' ? ".#{rails_env}.educoder.net" : '.educoder.net'
diff --git a/app/views/admins/shared/error.js.erb b/app/views/admins/shared/error.js.erb
index 261796d0b..93d1752e7 100644
--- a/app/views/admins/shared/error.js.erb
+++ b/app/views/admins/shared/error.js.erb
@@ -1,4 +1,4 @@
-$('.admin-alert-container').html('<%= j( render partial: 'admins/shared/alert', locals: { message: message } ) %>');
+$('.admin-alert-container').html('<%= j( render partial: 'shared/alert', locals: { message: message } ) %>');
setTimeout(function() {
if ($('.admin-alert-container button.close').length > 0) {
diff --git a/app/views/cooperative/dashboards/show.html.erb b/app/views/cooperative/dashboards/show.html.erb
new file mode 100644
index 000000000..790e830a7
--- /dev/null
+++ b/app/views/cooperative/dashboards/show.html.erb
@@ -0,0 +1,3 @@
+<% define_breadcrumbs do %>
+ <% add_breadcrumb('概览') %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/cooperative/kaminari/_first_page.html.erb b/app/views/cooperative/kaminari/_first_page.html.erb
new file mode 100644
index 000000000..148fc3f1c
--- /dev/null
+++ b/app/views/cooperative/kaminari/_first_page.html.erb
@@ -0,0 +1,11 @@
+<%# Link to the "First" page
+ - available local variables
+ url: url to the first page
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+-%>
+
+ <%= link_to_unless current_page.first?, t('views.pagination.first').html_safe, url, remote: remote, class: 'page-link' %>
+
diff --git a/app/views/cooperative/kaminari/_gap.html.erb b/app/views/cooperative/kaminari/_gap.html.erb
new file mode 100644
index 000000000..59236c8f6
--- /dev/null
+++ b/app/views/cooperative/kaminari/_gap.html.erb
@@ -0,0 +1,13 @@
+<%# Non-link tag that stands for skipped pages...
+ - available local variables
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+-%>
+
+ <%= link_to 'javascript:void(0)', { class: 'page-link' } do %>
+ <%= t('views.pagination.truncate').html_safe %>
+ (current)
+ <% end %>
+
diff --git a/app/views/cooperative/kaminari/_last_page.html.erb b/app/views/cooperative/kaminari/_last_page.html.erb
new file mode 100644
index 000000000..3e8a524a0
--- /dev/null
+++ b/app/views/cooperative/kaminari/_last_page.html.erb
@@ -0,0 +1,11 @@
+<%# Link to the "Last" page
+ - available local variables
+ url: url to the last page
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+-%>
+
+ <%= link_to_unless(current_page.last?, t('views.pagination.last').html_safe, url, remote: remote, class: 'page-link') %>
+
diff --git a/app/views/cooperative/kaminari/_next_page.html.erb b/app/views/cooperative/kaminari/_next_page.html.erb
new file mode 100644
index 000000000..211ddd423
--- /dev/null
+++ b/app/views/cooperative/kaminari/_next_page.html.erb
@@ -0,0 +1,11 @@
+<%# Link to the "Next" page
+ - available local variables
+ url: url to the next page
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+-%>
+
+ <%= link_to_unless current_page.last?, t('views.pagination.next').html_safe, url, rel: 'next', remote: remote, class: 'page-link' %>
+
diff --git a/app/views/cooperative/kaminari/_page.html.erb b/app/views/cooperative/kaminari/_page.html.erb
new file mode 100644
index 000000000..10a8374c7
--- /dev/null
+++ b/app/views/cooperative/kaminari/_page.html.erb
@@ -0,0 +1,19 @@
+<%# Link showing page number
+ - available local variables
+ page: a page object for "this" page
+ url: url to this page
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+-%>
+
+ <% if page.current? %>
+ <%= link_to url, {remote: remote, rel: page.rel, class: 'page-link'} do %>
+ <%= page %>
+ (current)
+ <% end %>
+ <% else %>
+ <%= link_to page, url, {remote: remote, rel: page.rel, class: 'page-link'} %>
+ <% end %>
+
diff --git a/app/views/cooperative/kaminari/_paginator.html.erb b/app/views/cooperative/kaminari/_paginator.html.erb
new file mode 100644
index 000000000..8d090b129
--- /dev/null
+++ b/app/views/cooperative/kaminari/_paginator.html.erb
@@ -0,0 +1,27 @@
+<%# The container tag
+ - available local variables
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+ paginator: the paginator that renders the pagination tags inside
+-%>
+<%= paginator.render do -%>
+
+
+
+<% end -%>
diff --git a/app/views/cooperative/kaminari/_prev_page.html.erb b/app/views/cooperative/kaminari/_prev_page.html.erb
new file mode 100644
index 000000000..90c38dd36
--- /dev/null
+++ b/app/views/cooperative/kaminari/_prev_page.html.erb
@@ -0,0 +1,11 @@
+<%# Link to the "Previous" page
+ - available local variables
+ url: url to the previous page
+ current_page: a page object for the currently displayed page
+ total_pages: total number of pages
+ per_page: number of items to fetch per page
+ remote: data-remote
+-%>
+
+ <%= link_to_unless current_page.first?, t('views.pagination.previous').html_safe, url, rel: 'prev', remote: remote, class: 'page-link' %>
+
diff --git a/app/views/cooperative/laboratory_settings/edit.html.erb b/app/views/cooperative/laboratory_settings/edit.html.erb
new file mode 100644
index 000000000..c070ee014
--- /dev/null
+++ b/app/views/cooperative/laboratory_settings/edit.html.erb
@@ -0,0 +1,129 @@
+<% define_breadcrumbs do %>
+ <% add_breadcrumb('网站设置') %>
+<% end %>
+
+
+ <%= simple_form_for(@laboratory, url: cooperative_laboratory_setting_path(@laboratory), method: 'patch', html: { enctype: 'multipart/form-data' }) do |f| %>
+ <% setting = @laboratory.laboratory_setting %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%= javascript_void_link '保存', class: 'btn btn-primary mr-3 px-4 submit-btn' %>
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/cooperative/shared/_no_data_for_table.html.erb b/app/views/cooperative/shared/_no_data_for_table.html.erb
new file mode 100644
index 000000000..1899f8d2e
--- /dev/null
+++ b/app/views/cooperative/shared/_no_data_for_table.html.erb
@@ -0,0 +1 @@
+暂无数据
\ No newline at end of file
diff --git a/app/views/cooperative/shared/_paginate.html.erb b/app/views/cooperative/shared/_paginate.html.erb
new file mode 100644
index 000000000..47f7ff580
--- /dev/null
+++ b/app/views/cooperative/shared/_paginate.html.erb
@@ -0,0 +1,6 @@
+
+ <% if objects && objects.size.nonzero? %>
+
<%= page_entries_info objects %>
+ <% end %>
+ <%= paginate objects, views_prefix: 'cooperative', remote: true %>
+
\ No newline at end of file
diff --git a/app/views/cooperative/shared/_sidebar.html.erb b/app/views/cooperative/shared/_sidebar.html.erb
new file mode 100644
index 000000000..a39a84e3a
--- /dev/null
+++ b/app/views/cooperative/shared/_sidebar.html.erb
@@ -0,0 +1,20 @@
+<% sidebar_collapse = request.cookies['cooperative_sidebar_collapse'].to_s == 'true' %>
+
\ No newline at end of file
diff --git a/app/views/cooperative/shared/after_render_js_hook.js.erb b/app/views/cooperative/shared/after_render_js_hook.js.erb
new file mode 100644
index 000000000..b0823d34a
--- /dev/null
+++ b/app/views/cooperative/shared/after_render_js_hook.js.erb
@@ -0,0 +1,4 @@
+;
+$('[data-toggle="tooltip"]').tooltip({ trigger : 'hover' });
+$('[data-toggle="popover"]').popover();
+$('img.preview-image').bootstrapViewer();
\ No newline at end of file
diff --git a/app/views/cooperative/shared/delete.js.erb b/app/views/cooperative/shared/delete.js.erb
new file mode 100644
index 000000000..0da435fd7
--- /dev/null
+++ b/app/views/cooperative/shared/delete.js.erb
@@ -0,0 +1,27 @@
+var deleteRow = $('<%= params[:element] %>');
+var refreshUrl = '<%= params[:refresh_url] %>';
+var notRefresh = <%= !!params[:not_refresh] %>;
+
+$.notify({ message: '操作成功' },{ type: 'success' });
+
+if (!notRefresh) {
+ var refreshFunc = function(url) {
+ $.ajax({
+ url: url.length > 0 ? url : window.location.href,
+ method: 'GET',
+ dataType: "script"
+ })
+ }
+
+ if(deleteRow.length > 0){
+ var needRefresh = deleteRow.siblings().length == 0;
+
+ deleteRow.remove();
+
+ if(needRefresh){ refreshFunc(refreshUrl); }
+ } else {
+ refreshFunc(refreshUrl);
+ }
+} else {
+ deleteRow.remove();
+}
\ No newline at end of file
diff --git a/app/views/cooperative/shared/error.js.erb b/app/views/cooperative/shared/error.js.erb
new file mode 100644
index 000000000..4fdc69021
--- /dev/null
+++ b/app/views/cooperative/shared/error.js.erb
@@ -0,0 +1,10 @@
+$('.cooperative-alert-container').html('<%= j( render partial: 'shared/alert', locals: { message: message } ) %>');
+
+setTimeout(function() {
+ if ($('.cooperative-alert-container button.close').length > 0) {
+ $('.cooperative-alert-container button.close').trigger('click');
+ }
+}, 5000)
+$(".cooperative-body-container").animate({
+ scrollTop: 0
+}, 200);
\ No newline at end of file
diff --git a/app/views/cooperative/shared/modal/_message_modal.html.erb b/app/views/cooperative/shared/modal/_message_modal.html.erb
new file mode 100644
index 000000000..70f16c1ae
--- /dev/null
+++ b/app/views/cooperative/shared/modal/_message_modal.html.erb
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/app/views/cooperative/shared/modal/_upload_file_modal.html.erb b/app/views/cooperative/shared/modal/_upload_file_modal.html.erb
new file mode 100644
index 000000000..036f1122a
--- /dev/null
+++ b/app/views/cooperative/shared/modal/_upload_file_modal.html.erb
@@ -0,0 +1,32 @@
+
\ No newline at end of file
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb
index 330ca8fc0..f61aaba4f 100644
--- a/app/views/layouts/admin.html.erb
+++ b/app/views/layouts/admin.html.erb
@@ -21,12 +21,12 @@
- <%= render 'admins/shared/flash_notice' %>
+ <%= render 'shared/flash_notice' %>
<%= yield :setup_admin_breadcrumb %>
- <%= render(partial: 'admins/shared/breadcrumb') %>
+ <%= render(partial: 'shared/breadcrumb') %>
diff --git a/app/views/layouts/cooperative.html.erb b/app/views/layouts/cooperative.html.erb
new file mode 100644
index 000000000..bc6050b7b
--- /dev/null
+++ b/app/views/layouts/cooperative.html.erb
@@ -0,0 +1,42 @@
+
+
+
+
<%= current_laboratory.school&.name %>-后台管理
+
+
+
+
+ <%= csrf_meta_tags %>
+ <%= csp_meta_tag %>
+
+ <%= stylesheet_link_tag 'cooperative', media: 'all','data-turbolinks-track': 'reload' %>
+ <%= javascript_include_tag 'cooperative', 'data-turbolinks-track': 'reload' %>
+
+
+ <% body_class = [params[:controller].gsub(/\//, '-').gsub('_', '-'), params[:action], 'page'].join('-') %>
+
+
+ <%= render partial: 'cooperative/shared/sidebar' %>
+
+
+
+
+ <%= render 'shared/flash_notice' %>
+
+
+
+ <%= yield :setup_breadcrumb %>
+ <%= render(partial: 'shared/breadcrumb') %>
+
+
+
+ <%= yield %>
+
+
+
+
+
+
+ <%= render 'cooperative/shared/modal/message_modal' %>
+
+
diff --git a/app/views/admins/shared/403.html.erb b/app/views/shared/403.html.erb
similarity index 100%
rename from app/views/admins/shared/403.html.erb
rename to app/views/shared/403.html.erb
diff --git a/app/views/admins/shared/404.html.erb b/app/views/shared/404.html.erb
similarity index 100%
rename from app/views/admins/shared/404.html.erb
rename to app/views/shared/404.html.erb
diff --git a/app/views/admins/shared/422.html.erb b/app/views/shared/422.html.erb
similarity index 100%
rename from app/views/admins/shared/422.html.erb
rename to app/views/shared/422.html.erb
diff --git a/app/views/admins/shared/500.html.erb b/app/views/shared/500.html.erb
similarity index 100%
rename from app/views/admins/shared/500.html.erb
rename to app/views/shared/500.html.erb
diff --git a/app/views/admins/shared/_alert.html.erb b/app/views/shared/_alert.html.erb
similarity index 100%
rename from app/views/admins/shared/_alert.html.erb
rename to app/views/shared/_alert.html.erb
diff --git a/app/views/admins/shared/_breadcrumb.html.erb b/app/views/shared/_breadcrumb.html.erb
similarity index 61%
rename from app/views/admins/shared/_breadcrumb.html.erb
rename to app/views/shared/_breadcrumb.html.erb
index 8aea89871..e811b414e 100644
--- a/app/views/admins/shared/_breadcrumb.html.erb
+++ b/app/views/shared/_breadcrumb.html.erb
@@ -1,8 +1,8 @@
-<% if @_admin_breadcrumbs.present? %>
+<% if @_breadcrumbs.present? %>
- <% @_admin_breadcrumbs&.each_with_index do |item, index| %>
- <% if item.url.present? && index != @_admin_breadcrumbs.size - 1 %>
+ <% @_breadcrumbs&.each_with_index do |item, index| %>
+ <% if item.url.present? && index != @_breadcrumbs.size - 1 %>
<%= link_to item.text, item.url %>
<% else %>
<%= item.text %>
diff --git a/app/views/admins/shared/_flash_notice.html.erb b/app/views/shared/_flash_notice.html.erb
similarity index 100%
rename from app/views/admins/shared/_flash_notice.html.erb
rename to app/views/shared/_flash_notice.html.erb
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index 8e1afe9f8..ef056bbef 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -12,5 +12,5 @@ Rails.application.config.assets.paths << Rails.root.join('vendor/assets')
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in the app/assets
# folder are already added.
-Rails.application.config.assets.precompile += %w( admin.js admin.css college.js college.css )
+Rails.application.config.assets.precompile += %w( admin.js admin.css college.js college.css cooperative.js cooperative.css )
diff --git a/config/routes.rb b/config/routes.rb
index a2e7337b1..09c821766 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1005,6 +1005,14 @@ Rails.application.routes.draw do
end
end
+ namespace :cooperative do
+ get '/', to: 'dashboards#show'
+ resource :laboratory_setting, only: [:edit, :update]
+ resource :carousels, only: [:index, :create, :update, :destroy] do
+ post :drag, on: :collection
+ end
+ end
+
resources :colleges, only: [] do
member do
get :statistics
diff --git a/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json b/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json
index 28728f8a0..e65dcbdd3 100644
--- a/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json
+++ b/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json
@@ -1 +1 @@
-{"files":{"admin-cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121.js":{"logical_path":"admin.js","mtime":"2019-09-11T16:20:07+08:00","size":4350881,"digest":"cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121","integrity":"sha256-zZyousyXPOLbrOMMl/bEC8COLC7kSXL2aOc44ZAsASE="},"admin-a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa.css":{"logical_path":"admin.css","mtime":"2019-09-11T16:20:07+08:00","size":773445,"digest":"a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa","integrity":"sha256-obM1bv5Q/0cXzyJHVjm1MzxTVLoD/RB8m3qNSudvR6o="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2019-08-14T17:22:43+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2019-08-14T17:22:43+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2019-08-14T17:22:43+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2019-08-14T17:22:43+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2019-08-14T17:22:43+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js":{"logical_path":"college.js","mtime":"2019-09-26T14:40:40+08:00","size":3352744,"digest":"18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287","integrity":"sha256-GPXoQAMxY06JijWswhh4FcCWwl4Kt0q6NBrpFhZs0oc="},"college-944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9.css":{"logical_path":"college.css","mtime":"2019-09-11T16:20:07+08:00","size":546841,"digest":"944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9","integrity":"sha256-lE1Cc/YsdTg2i5AX/dM4e1476jGoeHN3DrIxMkVG1Nk="},"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png":{"logical_path":"logo.png","mtime":"2019-09-03T08:55:53+08:00","size":2816,"digest":"7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423","integrity":"sha256-f/ESVocJv5f5iY/ockm3qPIA/x9I1TfYWvhyFfGHBCM="},"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js":{"logical_path":"application.js","mtime":"2019-09-26T14:40:40+08:00","size":600706,"digest":"9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb","integrity":"sha256-nPvD15JZmh0N5ce4QgnhwrLmAzbw8B4Z8FgWY5GHCPs="},"application-5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2.css":{"logical_path":"application.css","mtime":"2019-09-11T16:20:07+08:00","size":1844002,"digest":"5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2","integrity":"sha256-Xrh8bhNnbQGDMX3rzhf63ifmjErO4oxBlDjaFdU8lPI="},"admin-c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4.js":{"logical_path":"admin.js","mtime":"2019-09-21T15:28:08+08:00","size":4382031,"digest":"c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4","integrity":"sha256-yeXr5hkVSFUOJ1FBluoSXPu0AoIOwSWgyaz5nS03j+Q="},"admin-59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38.css":{"logical_path":"admin.css","mtime":"2019-09-21T14:49:04+08:00","size":840093,"digest":"59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38","integrity":"sha256-WcWfjK6L70qDWShsmFRYEQydA+oSFRZZXJiJQ/RxfDg="},"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css":{"logical_path":"college.css","mtime":"2019-09-16T13:56:09+08:00","size":579109,"digest":"38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437","integrity":"sha256-OPlT1rpbhdP6tjyzwrvw0FfMxkVNB8+q+sOwbaN7hDc="},"application-646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3.css":{"logical_path":"application.css","mtime":"2019-09-21T14:49:04+08:00","size":1988767,"digest":"646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3","integrity":"sha256-ZGsRWKTowfE+aE1v6QJavHX407pSVuRAgCwDmCIzdPM="},"admin-a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:33:05+08:00","size":4383107,"digest":"a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751","integrity":"sha256-pH43wOx89fIjgCSXdtHoLWW2tqonLtc4kYWqIA+kB1E="},"admin-432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:35:20+08:00","size":4383103,"digest":"432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9","integrity":"sha256-QyxOrAmwNsV/8eiNkCuKp9+BFk5LQZusVXzxNmwdOtk="},"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js":{"logical_path":"admin.js","mtime":"2019-09-30T14:43:41+08:00","size":4387200,"digest":"978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a","integrity":"sha256-l45c5gf3fCaBShdPSA2nmsJGwiAYaO+EZUqgO7Zye1o="},"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css":{"logical_path":"admin.css","mtime":"2019-09-30T14:43:41+08:00","size":842269,"digest":"896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7","integrity":"sha256-iWKB9HMXIrDAhNuxryHQ80pbwULViv9Xs5GGSrcd3Kc="},"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css":{"logical_path":"application.css","mtime":"2019-09-30T14:43:41+08:00","size":1993118,"digest":"97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd","integrity":"sha256-l/MT6bt9JUdmSffXIVlZz0IUgP0KN4XRlWlTv5Sh6L0="},"admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js":{"logical_path":"admin.js","mtime":"2019-10-11T14:38:33+08:00","size":4394616,"digest":"2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888","integrity":"sha256-LNsjRC+nNQJThbiPKQDfBP7zi2FTAEGm2+N17w8K6Ig="},"admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css":{"logical_path":"admin.css","mtime":"2019-10-10T17:12:05+08:00","size":846514,"digest":"2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc","integrity":"sha256-LChUuaAhWN7VqAmq9xRKhjCxA1SrTlb+zE3/zHE3lsw="},"application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css":{"logical_path":"application.css","mtime":"2019-10-10T17:12:05+08:00","size":2001607,"digest":"50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af","integrity":"sha256-UAWa6SmGYEO0cBUShwL8+6U9MqLfFI5k4dlhwQZRxq8="},"admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js":{"logical_path":"admin.js","mtime":"2019-10-16T16:11:32+08:00","size":4394790,"digest":"992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2","integrity":"sha256-mSzeCbbRfwCklXauLZ8c7RJyRLpAHvW31nfKuXQWiNI="},"admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css":{"logical_path":"admin.css","mtime":"2019-10-16T19:25:40+08:00","size":846676,"digest":"84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257","integrity":"sha256-hPKneR4nXW+CBRQ3Cz+WgXa5lLnde4w7qL9IM2sD8lc="},"application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css":{"logical_path":"application.css","mtime":"2019-10-16T19:25:40+08:00","size":2001931,"digest":"ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997","integrity":"sha256-72urhIUrqvaakf5q+HW24bEYxVtMfRZWZcSI+sgMSZc="}},"assets":{"admin.js":"admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js","admin.css":"admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js","college.css":"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css","logo.png":"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png","application.js":"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js","application.css":"application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css"}}
\ No newline at end of file
+{"files":{"admin-cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121.js":{"logical_path":"admin.js","mtime":"2019-09-11T16:20:07+08:00","size":4350881,"digest":"cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121","integrity":"sha256-zZyousyXPOLbrOMMl/bEC8COLC7kSXL2aOc44ZAsASE="},"admin-a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa.css":{"logical_path":"admin.css","mtime":"2019-09-11T16:20:07+08:00","size":773445,"digest":"a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa","integrity":"sha256-obM1bv5Q/0cXzyJHVjm1MzxTVLoD/RB8m3qNSudvR6o="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2019-08-14T17:22:43+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2019-08-14T17:22:43+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2019-08-14T17:22:43+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2019-08-14T17:22:43+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2019-08-14T17:22:43+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js":{"logical_path":"college.js","mtime":"2019-10-17T09:44:58+08:00","size":3352744,"digest":"18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287","integrity":"sha256-GPXoQAMxY06JijWswhh4FcCWwl4Kt0q6NBrpFhZs0oc="},"college-944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9.css":{"logical_path":"college.css","mtime":"2019-09-11T16:20:07+08:00","size":546841,"digest":"944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9","integrity":"sha256-lE1Cc/YsdTg2i5AX/dM4e1476jGoeHN3DrIxMkVG1Nk="},"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png":{"logical_path":"logo.png","mtime":"2019-09-03T08:55:53+08:00","size":2816,"digest":"7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423","integrity":"sha256-f/ESVocJv5f5iY/ockm3qPIA/x9I1TfYWvhyFfGHBCM="},"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js":{"logical_path":"application.js","mtime":"2019-10-17T09:44:58+08:00","size":600706,"digest":"9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb","integrity":"sha256-nPvD15JZmh0N5ce4QgnhwrLmAzbw8B4Z8FgWY5GHCPs="},"application-5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2.css":{"logical_path":"application.css","mtime":"2019-09-11T16:20:07+08:00","size":1844002,"digest":"5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2","integrity":"sha256-Xrh8bhNnbQGDMX3rzhf63ifmjErO4oxBlDjaFdU8lPI="},"admin-c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4.js":{"logical_path":"admin.js","mtime":"2019-09-21T15:28:08+08:00","size":4382031,"digest":"c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4","integrity":"sha256-yeXr5hkVSFUOJ1FBluoSXPu0AoIOwSWgyaz5nS03j+Q="},"admin-59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38.css":{"logical_path":"admin.css","mtime":"2019-09-21T14:49:04+08:00","size":840093,"digest":"59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38","integrity":"sha256-WcWfjK6L70qDWShsmFRYEQydA+oSFRZZXJiJQ/RxfDg="},"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css":{"logical_path":"college.css","mtime":"2019-09-16T13:56:09+08:00","size":579109,"digest":"38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437","integrity":"sha256-OPlT1rpbhdP6tjyzwrvw0FfMxkVNB8+q+sOwbaN7hDc="},"application-646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3.css":{"logical_path":"application.css","mtime":"2019-09-21T14:49:04+08:00","size":1988767,"digest":"646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3","integrity":"sha256-ZGsRWKTowfE+aE1v6QJavHX407pSVuRAgCwDmCIzdPM="},"admin-a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:33:05+08:00","size":4383107,"digest":"a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751","integrity":"sha256-pH43wOx89fIjgCSXdtHoLWW2tqonLtc4kYWqIA+kB1E="},"admin-432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:35:20+08:00","size":4383103,"digest":"432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9","integrity":"sha256-QyxOrAmwNsV/8eiNkCuKp9+BFk5LQZusVXzxNmwdOtk="},"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js":{"logical_path":"admin.js","mtime":"2019-09-30T14:43:41+08:00","size":4387200,"digest":"978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a","integrity":"sha256-l45c5gf3fCaBShdPSA2nmsJGwiAYaO+EZUqgO7Zye1o="},"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css":{"logical_path":"admin.css","mtime":"2019-09-30T14:43:41+08:00","size":842269,"digest":"896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7","integrity":"sha256-iWKB9HMXIrDAhNuxryHQ80pbwULViv9Xs5GGSrcd3Kc="},"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css":{"logical_path":"application.css","mtime":"2019-09-30T14:43:41+08:00","size":1993118,"digest":"97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd","integrity":"sha256-l/MT6bt9JUdmSffXIVlZz0IUgP0KN4XRlWlTv5Sh6L0="},"admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js":{"logical_path":"admin.js","mtime":"2019-10-11T14:38:33+08:00","size":4394616,"digest":"2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888","integrity":"sha256-LNsjRC+nNQJThbiPKQDfBP7zi2FTAEGm2+N17w8K6Ig="},"admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css":{"logical_path":"admin.css","mtime":"2019-10-10T17:12:05+08:00","size":846514,"digest":"2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc","integrity":"sha256-LChUuaAhWN7VqAmq9xRKhjCxA1SrTlb+zE3/zHE3lsw="},"application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css":{"logical_path":"application.css","mtime":"2019-10-10T17:12:05+08:00","size":2001607,"digest":"50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af","integrity":"sha256-UAWa6SmGYEO0cBUShwL8+6U9MqLfFI5k4dlhwQZRxq8="},"admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js":{"logical_path":"admin.js","mtime":"2019-10-16T16:11:32+08:00","size":4394790,"digest":"992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2","integrity":"sha256-mSzeCbbRfwCklXauLZ8c7RJyRLpAHvW31nfKuXQWiNI="},"admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css":{"logical_path":"admin.css","mtime":"2019-10-16T19:25:40+08:00","size":846676,"digest":"84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257","integrity":"sha256-hPKneR4nXW+CBRQ3Cz+WgXa5lLnde4w7qL9IM2sD8lc="},"application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css":{"logical_path":"application.css","mtime":"2019-10-16T19:25:40+08:00","size":2001931,"digest":"ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997","integrity":"sha256-72urhIUrqvaakf5q+HW24bEYxVtMfRZWZcSI+sgMSZc="},"admin-c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js":{"logical_path":"admin.js","mtime":"2019-10-17T09:44:58+08:00","size":4394897,"digest":"c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a","integrity":"sha256-yZAw0wVmL3QKqEtskloa27qtqgf9dOJlXmTUS0uX/Eo="},"admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css":{"logical_path":"admin.css","mtime":"2019-10-17T10:22:41+08:00","size":846699,"digest":"534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d","integrity":"sha256-U0vehx1n9Nb8jaYRkX14vkBm/HWTulPukqoXBooZnW0="},"cooperative-04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js":{"logical_path":"cooperative.js","mtime":"2019-10-17T10:17:56+08:00","size":4330072,"digest":"04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7","integrity":"sha256-BM1qYNQSINOO5FzkCx0ATh0LzYfBMvsae6thRMHeuNc="},"cooperative-a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3.css":{"logical_path":"cooperative.css","mtime":"2019-10-17T10:21:41+08:00","size":830628,"digest":"a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3","integrity":"sha256-o0W7/Y44twyShezBdHAS/83kKRh5g+KupWV6u1a5tPM="},"application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css":{"logical_path":"application.css","mtime":"2019-09-03T08:55:53+08:00","size":442932,"digest":"0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8","integrity":"sha256-DkF0eNVvQkZ+hXzRhrKcu8DWx8boXIpvQvOaxhiUPeg="}},"assets":{"admin.js":"admin-c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js","admin.css":"admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js","college.css":"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css","logo.png":"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png","application.js":"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js","application.css":"application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css","cooperative.js":"cooperative-04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js","cooperative.css":"cooperative-a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3.css"}}
\ No newline at end of file
diff --git a/public/assets/admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css b/public/assets/admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css
similarity index 99%
rename from public/assets/admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css
rename to public/assets/admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css
index c04cc9081..1779feb9c 100644
--- a/public/assets/admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css
+++ b/public/assets/admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css
@@ -25315,9 +25315,10 @@ input.form-control {
display: block;
width: 80px;
height: 80px;
+ background: #f0f0f0;
}
-/* line 36, app/assets/stylesheets/admins/laboratories.scss */
+/* line 37, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload {
cursor: pointer;
position: absolute;
@@ -25328,7 +25329,7 @@ input.form-control {
border: 1px solid #E5E5E5;
}
-/* line 45, app/assets/stylesheets/admins/laboratories.scss */
+/* line 46, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload::before, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload::before {
content: '';
position: absolute;
@@ -25339,7 +25340,7 @@ input.form-control {
background: #E5E5E5;
}
-/* line 55, app/assets/stylesheets/admins/laboratories.scss */
+/* line 56, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload::after, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload::after {
content: '';
position: absolute;
@@ -25350,25 +25351,25 @@ input.form-control {
background: #E5E5E5;
}
-/* line 66, app/assets/stylesheets/admins/laboratories.scss */
+/* line 67, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left {
position: relative;
width: 80px;
height: 80px;
}
-/* line 72, app/assets/stylesheets/admins/laboratories.scss */
+/* line 73, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left.has-img .logo-item-upload, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left.has-img .logo-item-upload {
display: none;
}
-/* line 77, app/assets/stylesheets/admins/laboratories.scss */
+/* line 78, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left.has-img:hover .logo-item-upload, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left.has-img:hover .logo-item-upload {
display: block;
background: rgba(145, 145, 145, 0.8);
}
-/* line 85, app/assets/stylesheets/admins/laboratories.scss */
+/* line 86, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-right, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-right {
display: -webkit-box;
display: flex;
@@ -25381,7 +25382,7 @@ input.form-control {
font-size: 12px;
}
-/* line 93, app/assets/stylesheets/admins/laboratories.scss */
+/* line 94, app/assets/stylesheets/admins/laboratories.scss */
.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-title, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-title {
color: #23272B;
font-size: 14px;
diff --git a/public/assets/admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css.gz b/public/assets/admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css.gz
similarity index 97%
rename from public/assets/admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css.gz
rename to public/assets/admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css.gz
index df379d4f8c6e4f5b6314099c9c3b230a8b433e04..26a606a1cdd894ccc4611e9693d69dc4acc4d5b9 100644
GIT binary patch
delta 2121
zcmV-P2)6g>z69>R1P33B2mo==r-28x2LVJEe`}TePFWkFely!DVcRw}gBhl!BspnaOH_MtU8(fMv*-|VElJ?7A*5#+}WlJ!r{rFQFbCX{l
zrCYH)6)VvB_EsRR0JG5rSQds^eg4xKPb$*(^7G#-~DzjAv&y0O*`#dP{dSt
zf5&8PvFbN9Tdgq)7=3!Ot6U7VCQ`GfeUr17xZFI;9P(guIF9UTX8C4h8Zxx}OKNHP
zTpZfBbGKc*P!*|4
zPuZz+0jQrIOZSmK|Cy>lDrYEu-b|hsf5MXU&uUdGXyjvTK3e1Tq&WL{7zG8SAEMoQ
zQlvfKHE>WwyF!;$t011D8`uBYa;P&3M;*srX=Y!^AwTphiao8f+>b|r%n!DkCLW^5
z4n?kMWmU@Un4G_0>Q3-_x-Mv>laFJJsJMXIHilN*Y!yZo(5Hx
zUL3GHv$Qc+&C2z(!#2xhjn?4+2(1_rT0vkVyVmrQeOYLJ5xn>mMzL>jP>(l|eS?E~
zys?aczahfJ&s1a}_%QxxUNsu}e^xVjtCCCNz4KIT={GPEC}#B=7|O~lY^|26-q}m+
z=2h+B#k{jyp*6)xZqo<*#y>0mb1x2qZl&IJ%PhN{l1uY*VwyO`Fa6K3W@@f8d`g)OnaM6z(ObRm$)D@Pg$oA++_yZ>q91KWIxl1f^C?
z4wV?UH*Zp^A14SW9D#wyu5A`_Cl(cW+EZYd{*q8|vfMxaOo)tSU|vud#{4}0@@7#^
z>?mV5z?n=+w~LS+si-B*$HA1cQ_8)K;+uQcw5Dke)o<0f_h5#!e}3656YI!dOy74&
zLoAqBPP3Tuc8cywZTZ5}Jw=OaPZx?JRuz^hkPqk42@Gd}daGV&)?pW#T&S4_etsQLm;FVikK646d7Ui4wZ2pM@W447R+aAt)w;F8BKrL
z&DyP>Bv9s&AxRZp_E~~db~w>Aut~~tQpv7w7wZvJZANuSf2v*g7wOOPaXQ6hU;PgF
zD6H0yh?_One@wr-0l1M
zp=(4zR-0fsW9(bu_f_@c(%M9PQAy>9O0<2wTsYhj{YXjDqW0*I32jPE0qp{XDQDq%
zF#AW~(wg8NnFJ>c$^<4`nRdx}FZCbk5zmEVE04gYf8piSK#3g7FYY8Oj~RQm+G~m7
z&$65azJ9?NWbfcowGCNS0dTWc%!|e6iF1B%@*`0yAGoAFOC<`+S71@PT3;?;^~gm`
zVgH!B8z`IiYvfy~iSGz!X=3w-7oi{FL?N0(GG|$R)COKK&pD>CkEex#p@o`IMFyKg
zO9`I8f0|;`LXDRh4F;J~@9q_Yy38fC_9z;SD&0wCB^TP9QL3cuKu)c)Y^)ZYi_CZ2
zRv`_gSM>5v#lvhtbh#%ze(Y7ucfQ6`8LSEqma8`@QP(0eJ$Pg)+2@idRJM!e5Yqr=
zDXXcexVkxdnLHXjI5eyTkqT8t71iLWE^_$Qe+PZk<5$gBRBKc6z%`J`S=@ypRYD%L
zB0XSTM4Fg_E~c!FDe7ZZ)yRl-GIUgH8I2>IIiuBCE#udOX3MHqp2Tka+(Q5`9Y6OF
zYOTk$t3Z>0lrd(lIRxXD_0zc3r&|(Xz~aG{2*jT=&KPkD6Cy#TN|2?ud)z@Tx@@&B
zf6BoLg|eK5YnU4=TyFt_89Gfm^_X$f?{geAm9nFzQW;LOmhlH>*z~A8X4v%m5A{#2
z5AT2*BUQ_wM-P;CvZ83%&AS#B(h8)XYtDTw1)CAF>~fr_*|SR5>HL$Y@?w7yT%r8b
zp9I;JJ<;nf!3Bym$#Eg8?CdsgDoLv4e`JKl#Y?mermRk~rGwDNp)uyF>NC$vvBm{q
z91rPFwVis63Tv4v)`T6l@z1euHA|FEVR=c3+t?F{s>t1+^@xxvCs-x7zuJ8?_&8@f
ztAP~O+RnYtM>xP`RDRnEx2`)B_bcm0}4YwHXEU%@6V
delta 2116
zcmV-K2)p<0z69yM1P33B2mmzxrhx~w2LVJEf0uM_YWJI&r
zc`8<*^X;ubTIyw^3$UyJv-hdkIE)*^eFSz;NPQn2M;QcHWarosEk
zrkttLH#MiM^M^|;Pv*(;ASdWd4yh!KR3VQodwpa@;sKOO}#KiF=Xc!(l96#1Z)
zbtboCa{hv;JHhKIwV;tsK8`V>ilHQ8xZwL!c2`bo=4EnR6w_SD?Pnee%3Dgbf2sn>
zMYBLrnT1%Zw1S{qCDWucu#@ZwWgzrMjiJ>C-b4G!w@Rxtwp
zh6ocsQ;~t-!}z0l)oAEj&E&00e=dpl&Qr0a-@r(qnALA!C@ZtDwGv>xSC`nItJ;%`
zxnZ|LYl@R3rVn<4e^&hGUL5b-O5Ny|>2y0K-{t4TH1U34I=-i>;8NT}eR_vY;>ps5
zBJ$BJ2O~X!fq5;T)6L97MuD-Ij95*SJt@_y|FrC@lg-;%AEI7OXkR0_95q7eahX8OxPx%!3=5rvRfwBf04hKzVDKTSTM1i
zW-+(z6y25D@)f3giWV1{E>u6PsvwVSo5oEB#ZvLv_Nv@4>(~W&LtLKzxYu;ld%6hrbim$zZ9l)-C`ofSLfC!;G4$S
zGR@d#UKb`=@1$CXe`93R@<^z9U8+M=G8e4W(vtG;PveljR*ITchfevKnj@+9p@3D{
z_oVMD-DI+atfj@%T-XqK0a`6Mew7p`?MDw|nFA(tM9i
zyI$^+rs|b9@x4q#kFH*lmtHNdYR=QO^24sMIOM;IL%?Hnf4VXh$Q3qUSA_y*l`|L@
zZ{VukC#AcOv(HM`Qt!bSi|K_T<^&!^Mwq-qWt_(m65qWA^O;&JI}LY6(_eP8cIzjJ
zh-Qm+MsY`*6FvYOEENF(d^NWYsXse7*GWl|@^P2@B>{t>ve
z__s$U!3l#hfytJjU2@(_{YQGlb8*+oBd}?BIW!c+t3~G`^BuQUNJHrr
zz5G-0FkAUt?n#dydlmDYFXmJRtHOij>P<@2wTMg)9+^t^xg-je?V>rvG=N#kYHBL3
zZjN3ik46s;4J$#ULX}ZPHF&Cv9De=wa3RWYeKVS)hkb8H-7FR0GN)SdkD4GS{LQughKtz
zf5J7)jTNr90Kp8MW|w-*xas#fj+#o@QB$c5r&-JR12b%TR30;I`u&Icr`Csez>Sfr
zWzeGsN;_FmH0UptWpOe>$i9}W8?$3HeNR<<;lEl9*8PN*he89eLinl54DJNo@*>SoN~7V-~QIV1n>pZ#B}rPqQ~>kI&ffk62H
diff --git a/public/assets/admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js.gz b/public/assets/admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js.gz
deleted file mode 100644
index 6d9fdd94c90684051b55be4709639fa060d67c83..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 961106
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 {d`0b_12|RJnUhUE`37YMQam
zsW&i9fidWiI?N7NUbYN6GMS7Bu#G4Zb%eSlnmEV69q6v>sCS8*dna~HvSOMdtgtqV
zt~p?RqMT)JTORl+so9Re&A+2@CL1QyN1+9Xi&p3If^7H10*moou7A2E}Rdr&(?0_rCoC?3Fs
zqw7G|&J__bq2j|+P#%^=hw3ku8JX>YdZ3NcqUa46YhH3>C5l|e#I4gne1y`C4A((J
zMs6h3Xd6?~K__;Pk~Vl5ICjg^U?yArfX2batoO&N)ZAoTn