From 997abf460e56c60bcb0687a96b05f56c0978fad3 Mon Sep 17 00:00:00 2001 From: Mathieu Lagace Date: Sat, 21 Dec 2019 18:40:01 -0500 Subject: [PATCH 1/8] begin of schedule editor --- app/Http/Controllers/OCOMController.php | 702 ++++++++++++++++++ .../Controllers/ScheduleEditorController.php | 23 + app/OCOM.php | 10 + app/Providers/AppServiceProvider.php | 5 + ...19_12_21_165529_create_o_c_o_m_s_table.php | 36 + public/css/contextLoader.min.css | 1 + public/css/custom.css | 58 ++ public/js/plugins/contextLoader.min.js | 2 + public/js/plugins/schedule/editor.js | 38 + resources/custom.css | 58 ++ .../assets/js/plugins/bootstrap-switch.js | 614 +++++++++++++++ .../admin/schedule/editor/course.blade.php | 36 + .../admin/schedule/editor/template.blade.php | 63 ++ .../views/admin/schedule/event/add.blade.php | 154 +++- .../views/admin/schedule/modal/add.blade.php | 362 ++++----- resources/views/layouts/admin/head.blade.php | 2 +- .../views/layouts/admin/scripts.blade.php | 1 + routes/api.php | 8 +- routes/web.php | 6 +- 19 files changed, 1954 insertions(+), 225 deletions(-) create mode 100644 app/Http/Controllers/OCOMController.php create mode 100644 app/Http/Controllers/ScheduleEditorController.php create mode 100644 app/OCOM.php create mode 100644 database/migrations/2019_12_21_165529_create_o_c_o_m_s_table.php create mode 100644 public/css/contextLoader.min.css create mode 100644 public/js/plugins/contextLoader.min.js create mode 100644 public/js/plugins/schedule/editor.js create mode 100644 resources/theme/material-dashboard/assets/js/plugins/bootstrap-switch.js create mode 100644 resources/views/admin/schedule/editor/course.blade.php create mode 100644 resources/views/admin/schedule/editor/template.blade.php diff --git a/app/Http/Controllers/OCOMController.php b/app/Http/Controllers/OCOMController.php new file mode 100644 index 00000000..e0c4c129 --- /dev/null +++ b/app/Http/Controllers/OCOMController.php @@ -0,0 +1,702 @@ +nbPeriode = $nbPeriode; + + $obj_competence = str_replace(",".$nbPeriode,'',$obj_competence); + + $newocom->ocom = $ocom[0]; + $newocom->oren = $oren[0]; + $newocom->objectif_competence = $obj_competence; + $newocom->objectif_rendement = $orens[$oren[0]]; + $newocom->save(); + } + dd(\App\OCOM::all()); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param \App\OCOM $oCOM + * @return \Illuminate\Http\Response + */ + public function show(OCOM $oCOM) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\OCOM $oCOM + * @return \Illuminate\Http\Response + */ + public function edit(OCOM $oCOM) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\OCOM $oCOM + * @return \Illuminate\Http\Response + */ + public function update(Request $request, OCOM $oCOM) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \App\OCOM $oCOM + * @return \Illuminate\Http\Response + */ + public function destroy(OCOM $oCOM) + { + // + } +} diff --git a/app/Http/Controllers/ScheduleEditorController.php b/app/Http/Controllers/ScheduleEditorController.php new file mode 100644 index 00000000..3dd8a495 --- /dev/null +++ b/app/Http/Controllers/ScheduleEditorController.php @@ -0,0 +1,23 @@ + $periode, 'niveau' => $niveau]); + } + + public function getTemplate() + { + return view('admin.schedule.editor.template'); + } +} diff --git a/app/OCOM.php b/app/OCOM.php new file mode 100644 index 00000000..9e796e66 --- /dev/null +++ b/app/OCOM.php @@ -0,0 +1,10 @@ +
'; + }); } /** diff --git a/database/migrations/2019_12_21_165529_create_o_c_o_m_s_table.php b/database/migrations/2019_12_21_165529_create_o_c_o_m_s_table.php new file mode 100644 index 00000000..b88a2806 --- /dev/null +++ b/database/migrations/2019_12_21_165529_create_o_c_o_m_s_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('ocom'); + $table->string('objectif_competence'); + $table->string('nbPeriode'); + $table->string('objectif_rendement'); + $table->string('oren'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('o_c_o_m_s'); + } +} diff --git a/public/css/contextLoader.min.css b/public/css/contextLoader.min.css new file mode 100644 index 00000000..6fb3472e --- /dev/null +++ b/public/css/contextLoader.min.css @@ -0,0 +1 @@ +.timeline-item{background: #fff;border: 1px solid;border-color: #e5e6e9 #dfe0e4 #d0d1d5;border-radius: 3px;padding: 2%;margin: 0 auto;width: 100%;height: 100%;}@keyframes placeHolderShimmer{0%{ background-position: -468px 0;} 100%{background-position: 468px 0;}}.animated-background{animation-duration: 1s;animation-fill-mode: forwards;animation-iteration-count: infinite;animation-name: placeHolderShimmer;animation-timing-function: linear;background: #f6f7f8;background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%);background-size: 800px 104px;height: 96px;position: relative;}.background-masker{background: #fff;position: absolute;}.background-masker.header-top,.background-masker.header-bottom,.background-masker.subheader-bottom{top: 0;left: 40px;right: 0px;height: 10px;}.background-masker.header-left,.background-masker.subheader-left,.background-masker.header-right,.background-masker.subheader-right{top: 10px;left: 40px;height: 8px;width: 10px;}.background-masker.header-bottom{top: 18px;height: 6px;}.background-masker.subheader-left,.background-masker.subheader-right{top: 24px;height: 6px;}.background-masker.header-right,.background-masker.subheader-right{width: auto;left: 300px;right: 0px;}.background-masker.subheader-right{left: 230px;}.background-masker.subheader-bottom{top: 30px;height: 10px;}.background-masker.content-top,.background-masker.content-second-line,.background-masker.content-third-line,.background-masker.content-second-end,.background-masker.content-third-end,.background-masker.content-first-end{top: 40px;left: 0;right: 0;height: 6px;}.background-masker.content-top{height: 20px;}.background-masker.content-first-end,.background-masker.content-second-end,.background-masker.content-third-end{width: auto;left: 380px;right: 0;top: 60px;height: 8px;}.background-masker.content-second-line{top: 68px;}.background-masker.content-second-end{left: 420px;top: 74px;}.background-masker.content-third-line{top: 82px;}.background-masker.content-third-end{left: 300px;top: 88px;} \ No newline at end of file diff --git a/public/css/custom.css b/public/css/custom.css index f595d6ba..c85e0091 100644 --- a/public/css/custom.css +++ b/public/css/custom.css @@ -3,6 +3,64 @@ word-break: break-word; } +.lds-ellipsis { + display: inline-block; + position: relative; + width: 80px; + height: 80px; +} +.lds-ellipsis div { + position: absolute; + top: 33px; + width: 13px; + height: 13px; + border-radius: 50%; + background: #dee2e6; + animation-timing-function: cubic-bezier(0, 1, 1, 0); +} +.lds-ellipsis div:nth-child(1) { + left: 8px; + animation: lds-ellipsis1 0.6s infinite; +} +.lds-ellipsis div:nth-child(2) { + left: 8px; + animation: lds-ellipsis2 0.6s infinite; +} +.lds-ellipsis div:nth-child(3) { + left: 32px; + animation: lds-ellipsis2 0.6s infinite; +} +.lds-ellipsis div:nth-child(4) { + left: 56px; + animation: lds-ellipsis3 0.6s infinite; +} + +@keyframes lds-ellipsis1 { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + } +} +@keyframes lds-ellipsis3 { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0); + } +} +@keyframes lds-ellipsis2 { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(24px, 0); + } +} + + .container-fluid { padding: 0px; } diff --git a/public/js/plugins/contextLoader.min.js b/public/js/plugins/contextLoader.min.js new file mode 100644 index 00000000..036b34fe --- /dev/null +++ b/public/js/plugins/contextLoader.min.js @@ -0,0 +1,2 @@ + +contextLoader={};contextLoader.htmlContent='
';contextLoader.addLoader = function(theDiv){document.querySelector(theDiv).innerHTML = contextLoader.htmlContent;} diff --git a/public/js/plugins/schedule/editor.js b/public/js/plugins/schedule/editor.js new file mode 100644 index 00000000..31a7ba25 --- /dev/null +++ b/public/js/plugins/schedule/editor.js @@ -0,0 +1,38 @@ +function initScheduleEditor(id, periode, niveau) +{ + $.ajax({ + type: 'GET', + url: '/api/schedule/editor/init?api_token='+api_token, + success: function (template) { + $("#"+id).html(template); + for (let pniveau = 1; pniveau <= 3; pniveau++) { + for (let pperiode = 1; pperiode <= 3; pperiode++) { + loadCourse(pniveau,pperiode); + } + } + initAutoComplete("AutoComplete"); + }, + error: function () { + showNotification('error','Impossible d\'initialiser l\'éditeur d\'horaire ...','top', 'center') + } + }) +} + +function loadTemplate(id) +{ + $.get('/api/schedule/editor/init?api_token='+api_token, function ( data ) {$("#"+id).html(data);}); +} + +function loadCourse(periode,niveau) +{ + $.ajax({ + type: 'GET', + url: '/api/schedule/editor/course/'+niveau+'/'+periode+'?api_token='+api_token, + success: function (course) { + $("#container-"+niveau+"-"+periode).html(course); + }, + error: function () { + showNotification('error','Impossible de charger les cours ...','top', 'center') + } + }) +} \ No newline at end of file diff --git a/resources/custom.css b/resources/custom.css index f595d6ba..c85e0091 100644 --- a/resources/custom.css +++ b/resources/custom.css @@ -3,6 +3,64 @@ word-break: break-word; } +.lds-ellipsis { + display: inline-block; + position: relative; + width: 80px; + height: 80px; +} +.lds-ellipsis div { + position: absolute; + top: 33px; + width: 13px; + height: 13px; + border-radius: 50%; + background: #dee2e6; + animation-timing-function: cubic-bezier(0, 1, 1, 0); +} +.lds-ellipsis div:nth-child(1) { + left: 8px; + animation: lds-ellipsis1 0.6s infinite; +} +.lds-ellipsis div:nth-child(2) { + left: 8px; + animation: lds-ellipsis2 0.6s infinite; +} +.lds-ellipsis div:nth-child(3) { + left: 32px; + animation: lds-ellipsis2 0.6s infinite; +} +.lds-ellipsis div:nth-child(4) { + left: 56px; + animation: lds-ellipsis3 0.6s infinite; +} + +@keyframes lds-ellipsis1 { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + } +} +@keyframes lds-ellipsis3 { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0); + } +} +@keyframes lds-ellipsis2 { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(24px, 0); + } +} + + .container-fluid { padding: 0px; } diff --git a/resources/theme/material-dashboard/assets/js/plugins/bootstrap-switch.js b/resources/theme/material-dashboard/assets/js/plugins/bootstrap-switch.js new file mode 100644 index 00000000..32af33de --- /dev/null +++ b/resources/theme/material-dashboard/assets/js/plugins/bootstrap-switch.js @@ -0,0 +1,614 @@ +import jquery from 'jquery' + +const $ = jquery || window.jQuery || window.$ + +class BootstrapSwitch { + constructor (element, options = {}) { + this.$element = $(element) + this.options = $.extend( + {}, + $.fn.bootstrapSwitch.defaults, + this._getElementOptions(), + options + ) + this.prevOptions = {} + this.$wrapper = $('
', { + class: () => { + const classes = [] + classes.push(this.options.state ? 'on' : 'off') + if (this.options.size) { + classes.push(this.options.size) + } + if (this.options.disabled) { + classes.push('disabled') + } + if (this.options.readonly) { + classes.push('readonly') + } + if (this.options.indeterminate) { + classes.push('indeterminate') + } + if (this.options.inverse) { + classes.push('inverse') + } + if (this.$element.attr('id')) { + classes.push(`id-${this.$element.attr('id')}`) + } + return classes + .map(this._getClass.bind(this)) + .concat([this.options.baseClass], this._getClasses(this.options.wrapperClass)) + .join(' ') + } + }) + this.$container = $('
', { class: this._getClass('container') }) + this.$on = $('', { + html: this.options.onText, + class: `${this._getClass('handle-on')} ${this._getClass(this.options.onColor)}` + }) + this.$off = $('', { + html: this.options.offText, + class: `${this._getClass('handle-off')} ${this._getClass(this.options.offColor)}` + }) + this.$label = $('', { + html: this.options.labelText, + class: this._getClass('label') + }) + + this.$element.on('init.bootstrapSwitch', this.options.onInit.bind(this, element)) + this.$element.on('switchChange.bootstrapSwitch', (...args) => { + if (this.options.onSwitchChange.apply(element, args) === false) { + if (this.$element.is(':radio')) { + $(`[name="${this.$element.attr('name')}"]`).trigger('previousState.bootstrapSwitch', true) + } else { + this.$element.trigger('previousState.bootstrapSwitch', true) + } + } + }) + + this.$container = this.$element.wrap(this.$container).parent() + this.$wrapper = this.$container.wrap(this.$wrapper).parent() + this.$element + .before(this.options.inverse ? this.$off : this.$on) + .before(this.$label) + .before(this.options.inverse ? this.$on : this.$off) + + if (this.options.indeterminate) { + this.$element.prop('indeterminate', true) + } + + this._init() + this._elementHandlers() + this._handleHandlers() + this._labelHandlers() + this._formHandler() + this._externalLabelHandler() + this.$element.trigger('init.bootstrapSwitch', this.options.state) + } + + setPrevOptions () { + this.prevOptions = { ...this.options } + } + + state (value, skip) { + if (typeof value === 'undefined') { return this.options.state } + if ( + (this.options.disabled || this.options.readonly) || + (this.options.state && !this.options.radioAllOff && this.$element.is(':radio')) + ) { return this.$element } + if (this.$element.is(':radio')) { + $(`[name="${this.$element.attr('name')}"]`).trigger('setPreviousOptions.bootstrapSwitch') + } else { + this.$element.trigger('setPreviousOptions.bootstrapSwitch') + } + if (this.options.indeterminate) { + this.indeterminate(false) + } + this.$element + .prop('checked', Boolean(value)) + .trigger('change.bootstrapSwitch', skip) + return this.$element + } + + toggleState (skip) { + if (this.options.disabled || this.options.readonly) { return this.$element } + if (this.options.indeterminate) { + this.indeterminate(false) + return this.state(true) + } else { + return this.$element.prop('checked', !this.options.state).trigger('change.bootstrapSwitch', skip) + } + } + + size (value) { + if (typeof value === 'undefined') { return this.options.size } + if (this.options.size != null) { + this.$wrapper.removeClass(this._getClass(this.options.size)) + } + if (value) { + this.$wrapper.addClass(this._getClass(value)) + } + this._width() + this._containerPosition() + this.options.size = value + return this.$element + } + + animate (value) { + if (typeof value === 'undefined') { return this.options.animate } + if (this.options.animate === Boolean(value)) { return this.$element } + return this.toggleAnimate() + } + + toggleAnimate () { + this.options.animate = !this.options.animate + this.$wrapper.toggleClass(this._getClass('animate')) + return this.$element + } + + disabled (value) { + if (typeof value === 'undefined') { return this.options.disabled } + if (this.options.disabled === Boolean(value)) { return this.$element } + return this.toggleDisabled() + } + + toggleDisabled () { + this.options.disabled = !this.options.disabled + this.$element.prop('disabled', this.options.disabled) + this.$wrapper.toggleClass(this._getClass('disabled')) + return this.$element + } + + readonly (value) { + if (typeof value === 'undefined') { return this.options.readonly } + if (this.options.readonly === Boolean(value)) { return this.$element } + return this.toggleReadonly() + } + + toggleReadonly () { + this.options.readonly = !this.options.readonly + this.$element.prop('readonly', this.options.readonly) + this.$wrapper.toggleClass(this._getClass('readonly')) + return this.$element + } + + indeterminate (value) { + if (typeof value === 'undefined') { return this.options.indeterminate } + if (this.options.indeterminate === Boolean(value)) { return this.$element } + return this.toggleIndeterminate() + } + + toggleIndeterminate () { + this.options.indeterminate = !this.options.indeterminate + this.$element.prop('indeterminate', this.options.indeterminate) + this.$wrapper.toggleClass(this._getClass('indeterminate')) + this._containerPosition() + return this.$element + } + + inverse (value) { + if (typeof value === 'undefined') { return this.options.inverse } + if (this.options.inverse === Boolean(value)) { return this.$element } + return this.toggleInverse() + } + + toggleInverse () { + this.$wrapper.toggleClass(this._getClass('inverse')) + const $on = this.$on.clone(true) + const $off = this.$off.clone(true) + this.$on.replaceWith($off) + this.$off.replaceWith($on) + this.$on = $off + this.$off = $on + this.options.inverse = !this.options.inverse + return this.$element + } + + onColor (value) { + if (typeof value === 'undefined') { return this.options.onColor } + if (this.options.onColor) { + this.$on.removeClass(this._getClass(this.options.onColor)) + } + this.$on.addClass(this._getClass(value)) + this.options.onColor = value + return this.$element + } + + offColor (value) { + if (typeof value === 'undefined') { return this.options.offColor } + if (this.options.offColor) { + this.$off.removeClass(this._getClass(this.options.offColor)) + } + this.$off.addClass(this._getClass(value)) + this.options.offColor = value + return this.$element + } + + onText (value) { + if (typeof value === 'undefined') { return this.options.onText } + this.$on.html(value) + this._width() + this._containerPosition() + this.options.onText = value + return this.$element + } + + offText (value) { + if (typeof value === 'undefined') { return this.options.offText } + this.$off.html(value) + this._width() + this._containerPosition() + this.options.offText = value + return this.$element + } + + labelText (value) { + if (typeof value === 'undefined') { return this.options.labelText } + this.$label.html(value) + this._width() + this.options.labelText = value + return this.$element + } + + handleWidth (value) { + if (typeof value === 'undefined') { return this.options.handleWidth } + this.options.handleWidth = value + this._width() + this._containerPosition() + return this.$element + } + + labelWidth (value) { + if (typeof value === 'undefined') { return this.options.labelWidth } + this.options.labelWidth = value + this._width() + this._containerPosition() + return this.$element + } + + baseClass (value) { + return this.options.baseClass + } + + wrapperClass (value) { + if (typeof value === 'undefined') { return this.options.wrapperClass } + if (!value) { + value = $.fn.bootstrapSwitch.defaults.wrapperClass + } + this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(' ')) + this.$wrapper.addClass(this._getClasses(value).join(' ')) + this.options.wrapperClass = value + return this.$element + } + + radioAllOff (value) { + if (typeof value === 'undefined') { return this.options.radioAllOff } + const val = Boolean(value) + if (this.options.radioAllOff === val) { return this.$element } + this.options.radioAllOff = val + return this.$element + } + + onInit (value) { + if (typeof value === 'undefined') { return this.options.onInit } + if (!value) { + value = $.fn.bootstrapSwitch.defaults.onInit + } + this.options.onInit = value + return this.$element + } + + onSwitchChange (value) { + if (typeof value === 'undefined') { + return this.options.onSwitchChange + } + if (!value) { + value = $.fn.bootstrapSwitch.defaults.onSwitchChange + } + this.options.onSwitchChange = value + return this.$element + } + + destroy () { + const $form = this.$element.closest('form') + if ($form.length) { + $form.off('reset.bootstrapSwitch').removeData('bootstrap-switch') + } + this.$container + .children() + .not(this.$element) + .remove() + this.$element + .unwrap() + .unwrap() + .off('.bootstrapSwitch') + .removeData('bootstrap-switch') + return this.$element + } + + _getElementOptions () { + return { + state: this.$element.is(':checked'), + size: this.$element.data('size'), + animate: this.$element.data('animate'), + disabled: this.$element.is(':disabled'), + readonly: this.$element.is('[readonly]'), + indeterminate: this.$element.data('indeterminate'), + inverse: this.$element.data('inverse'), + radioAllOff: this.$element.data('radio-all-off'), + onColor: this.$element.data('on-color'), + offColor: this.$element.data('off-color'), + onText: this.$element.data('on-text'), + offText: this.$element.data('off-text'), + labelText: this.$element.data('label-text'), + handleWidth: this.$element.data('handle-width'), + labelWidth: this.$element.data('label-width'), + baseClass: this.$element.data('base-class'), + wrapperClass: this.$element.data('wrapper-class') + } + } + + _width () { + const $handles = this.$on + .add(this.$off) + .add(this.$label) + .css('width', '') + const handleWidth = this.options.handleWidth === 'auto' + ? Math.round(Math.max(this.$on.width(), this.$off.width())) + : this.options.handleWidth + $handles.width(handleWidth) + this.$label.width((index, width) => { + if (this.options.labelWidth !== 'auto') { return this.options.labelWidth } + if (width < handleWidth) { return handleWidth } + return width + }) + this._handleWidth = this.$on.outerWidth() + this._labelWidth = this.$label.outerWidth() + this.$container.width((this._handleWidth * 2) + this._labelWidth) + return this.$wrapper.width(this._handleWidth + this._labelWidth) + } + + _containerPosition (state = this.options.state, callback) { + this.$container.css('margin-left', () => { + const values = [0, `-${this._handleWidth}px`] + if (this.options.indeterminate) { + return `-${this._handleWidth / 2}px` + } + if (state) { + if (this.options.inverse) { + return values[1] + } else { + return values[0] + } + } else { + if (this.options.inverse) { + return values[0] + } else { + return values[1] + } + } + }) + } + + _init () { + const init = () => { + this.setPrevOptions() + this._width() + this._containerPosition() + setTimeout(() => { + if (this.options.animate) { + return this.$wrapper.addClass(this._getClass('animate')) + } + }, 50) + } + if (this.$wrapper.is(':visible')) { + init() + return + } + const initInterval = window.setInterval(() => { + if (this.$wrapper.is(':visible')) { + init() + return window.clearInterval(initInterval) + } + }, 50) + } + + _elementHandlers () { + return this.$element.on({ + 'setPreviousOptions.bootstrapSwitch': this.setPrevOptions.bind(this), + + 'previousState.bootstrapSwitch': () => { + this.options = this.prevOptions + if (this.options.indeterminate) { + this.$wrapper.addClass(this._getClass('indeterminate')) + } + this.$element + .prop('checked', this.options.state) + .trigger('change.bootstrapSwitch', true) + }, + + 'change.bootstrapSwitch': (event, skip) => { + event.preventDefault() + event.stopImmediatePropagation() + const state = this.$element.is(':checked') + this._containerPosition(state) + if (state === this.options.state) { + return + } + this.options.state = state + this.$wrapper + .toggleClass(this._getClass('off')) + .toggleClass(this._getClass('on')) + if (!skip) { + if (this.$element.is(':radio')) { + $(`[name="${this.$element.attr('name')}"]`) + .not(this.$element) + .prop('checked', false) + .trigger('change.bootstrapSwitch', true) + } + this.$element.trigger('switchChange.bootstrapSwitch', [state]) + } + }, + + 'focus.bootstrapSwitch': event => { + event.preventDefault() + this.$wrapper.addClass(this._getClass('focused')) + }, + + 'blur.bootstrapSwitch': event => { + event.preventDefault() + this.$wrapper.removeClass(this._getClass('focused')) + }, + + 'keydown.bootstrapSwitch': event => { + if (!event.which || this.options.disabled || this.options.readonly) { + return + } + if (event.which === 37 || event.which === 39) { + event.preventDefault() + event.stopImmediatePropagation() + this.state(event.which === 39) + } + } + }) + } + + _handleHandlers () { + this.$on.on('click.bootstrapSwitch', event => { + event.preventDefault() + event.stopPropagation() + this.state(false) + return this.$element.trigger('focus.bootstrapSwitch') + }) + return this.$off.on('click.bootstrapSwitch', event => { + event.preventDefault() + event.stopPropagation() + this.state(true) + return this.$element.trigger('focus.bootstrapSwitch') + }) + } + + _labelHandlers () { + const handlers = { + click (event) { event.stopPropagation() }, + + 'mousedown.bootstrapSwitch touchstart.bootstrapSwitch': event => { + if (this._dragStart || this.options.disabled || this.options.readonly) { + return + } + event.preventDefault() + event.stopPropagation() + this._dragStart = (event.pageX || event.originalEvent.touches[0].pageX) - parseInt(this.$container.css('margin-left'), 10) + if (this.options.animate) { + this.$wrapper.removeClass(this._getClass('animate')) + } + this.$element.trigger('focus.bootstrapSwitch') + }, + + 'mousemove.bootstrapSwitch touchmove.bootstrapSwitch': event => { + if (this._dragStart == null) { return } + const difference = (event.pageX || event.originalEvent.touches[0].pageX) - this._dragStart + event.preventDefault() + if (difference < -this._handleWidth || difference > 0) { return } + this._dragEnd = difference + this.$container.css('margin-left', `${this._dragEnd}px`) + }, + + 'mouseup.bootstrapSwitch touchend.bootstrapSwitch': event => { + if (!this._dragStart) { return } + event.preventDefault() + if (this.options.animate) { + this.$wrapper.addClass(this._getClass('animate')) + } + if (this._dragEnd) { + const state = this._dragEnd > -(this._handleWidth / 2) + this._dragEnd = false + this.state(this.options.inverse ? !state : state) + } else { + this.state(!this.options.state) + } + this._dragStart = false + }, + + 'mouseleave.bootstrapSwitch': () => { + this.$label.trigger('mouseup.bootstrapSwitch') + } + } + this.$label.on(handlers) + } + + _externalLabelHandler () { + const $externalLabel = this.$element.closest('label') + $externalLabel.on('click', event => { + event.preventDefault() + event.stopImmediatePropagation() + if (event.target === $externalLabel[0]) { + this.toggleState() + } + }) + } + + _formHandler () { + const $form = this.$element.closest('form') + if ($form.data('bootstrap-switch')) { + return + } + $form + .on('reset.bootstrapSwitch', () => { + window.setTimeout(() => { + $form.find('input') + .filter(function () { return $(this).data('bootstrap-switch') }) + .each(function () { return $(this).bootstrapSwitch('state', this.checked) }) + }, 1) + }) + .data('bootstrap-switch', true) + } + + _getClass (name) { + return `${this.options.baseClass}-${name}` + } + + _getClasses (classes) { + if (!$.isArray(classes)) { + return [this._getClass(classes)] + } + return classes.map(this._getClass.bind(this)) + } +} + +$.fn.bootstrapSwitch = function (option, ...args) { + function reducer (ret, next) { + const $this = $(next) + const existingData = $this.data('bootstrap-switch') + const data = existingData || new BootstrapSwitch(next, option) + if (!existingData) { + $this.data('bootstrap-switch', data) + } + if (typeof option === 'string') { + return data[option].apply(data, args) + } + return ret + } + return Array.prototype.reduce.call(this, reducer, this) +} +$.fn.bootstrapSwitch.Constructor = BootstrapSwitch +$.fn.bootstrapSwitch.defaults = { + state: true, + size: null, + animate: true, + disabled: false, + readonly: false, + indeterminate: false, + inverse: false, + radioAllOff: false, + onColor: 'primary', + offColor: 'default', + onText: 'ON', + offText: 'OFF', + labelText: ' ', + handleWidth: 'auto', + labelWidth: 'auto', + baseClass: 'bootstrap-switch', + wrapperClass: 'wrapper', + onInit: () => {}, + onSwitchChange: () => {} +} diff --git a/resources/views/admin/schedule/editor/course.blade.php b/resources/views/admin/schedule/editor/course.blade.php new file mode 100644 index 00000000..74cb0673 --- /dev/null +++ b/resources/views/admin/schedule/editor/course.blade.php @@ -0,0 +1,36 @@ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/resources/views/admin/schedule/editor/template.blade.php b/resources/views/admin/schedule/editor/template.blade.php new file mode 100644 index 00000000..6ef641b3 --- /dev/null +++ b/resources/views/admin/schedule/editor/template.blade.php @@ -0,0 +1,63 @@ +
+
+ + Niveau/Periode + +
+ @for($i = 1; $i <= 3; $i++) +
+
+ + +
+
+ @endfor +
+ +
+
+@for($j = 1; $j <= 3; $j++) +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ @for($i = 1; $i <= 3; $i++) +
+ @loaderDot +
+ @endfor +
+ +
+
+@endfor +
+
+ +
+
\ No newline at end of file diff --git a/resources/views/admin/schedule/event/add.blade.php b/resources/views/admin/schedule/event/add.blade.php index a2f7622c..db23c9cf 100644 --- a/resources/views/admin/schedule/event/add.blade.php +++ b/resources/views/admin/schedule/event/add.blade.php @@ -2,54 +2,128 @@ @section('content')
-
-
-

Ajouter un événement à l'horaire

-
-
-
- @csrf +
+
+
+

Ajouter un événement à l'horaire

+
+
+ + @csrf -
-
-
- - -
+
+
+
+ + +
+
+
+
+ +
+ + +
+
+
+
+
+
+

Options

+
+
+
+ + L'activité est-elle obligatoire pour tout les cadets ? +
+
-
- +
+ + Inclure des messages de la semaine avec l'activité ? +
+ +
- - +
+ + Inclure un horaire avec l'activité ? +
+ +
+
+
@endsection @section('custom_scripts') - - - + + + + + + @endsection \ No newline at end of file diff --git a/resources/views/admin/schedule/modal/add.blade.php b/resources/views/admin/schedule/modal/add.blade.php index 084beaad..59695a07 100644 --- a/resources/views/admin/schedule/modal/add.blade.php +++ b/resources/views/admin/schedule/modal/add.blade.php @@ -1,198 +1,208 @@ -
-

Information Générale

-
-
-
- - - Veuillez entrer le nom de l'événement -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - - Veuillez entrer le lieu de l'événement -
-
-
-
-
- + -
-

Options Supplémentaires

-
-
- -
-
-
- - -
-
-
+ +
-
-
- - -
-
- - + + + Veuillez entrer le nom de l'événement +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + Veuillez entrer le lieu de l'événement +
+
+
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ @loaderDot +
+
+
+
-@if ($activity->id == 1) +@if ($activity->id == 99)

Horaire d'instruction

-
-
- @for ($i = 1; $i <= \App\Config::getData('admin_level_in_schedule_nb'); $i++) -
- - -
-
- - @for ($p = 1; $p <= \App\Config::getData('admin_periode_nb'); $p++) -

Période {{$p}}

-
-
-
- - - Veuillez entrer le nom du cours -
-
-
-
- -
- +
+
+ @for ($i = 1; $i <= \App\Config::getData('admin_level_in_schedule_nb'); $i++) +
+ + +
+
+ + @for ($p = 1; $p <= \App\Config::getData('admin_periode_nb'); $p++) +

Période {{$p}}

+
+
+
+ + + Veuillez entrer le nom du cours +
+
+
+
+ +
+ +
+ Veuillez entrer le nom de l'instructeur +
+
+
+
+ + + Veuillez entrer l'OCOM +
+
+
+
+ + + Veuillez entrer le lieux
- Veuillez entrer le nom de l'instructeur
-
-
- - - Veuillez entrer l'OCOM -
-
-
-
- - - Veuillez entrer le lieux -
-
-
-
- @endfor +
+ @endfor +
-
- @endfor + @endfor +
-
- + @endif - \ No newline at end of file diff --git a/resources/views/layouts/admin/head.blade.php b/resources/views/layouts/admin/head.blade.php index 1c73d5cc..0a0a4b71 100644 --- a/resources/views/layouts/admin/head.blade.php +++ b/resources/views/layouts/admin/head.blade.php @@ -26,7 +26,7 @@ - + \ No newline at end of file diff --git a/resources/views/layouts/admin/scripts.blade.php b/resources/views/layouts/admin/scripts.blade.php index fc8c1830..58ece41e 100644 --- a/resources/views/layouts/admin/scripts.blade.php +++ b/resources/views/layouts/admin/scripts.blade.php @@ -30,6 +30,7 @@ + - - + + + From e5d28d796a081c6b04cd2d0981eb2e96c255db16 Mon Sep 17 00:00:00 2001 From: Mathieu Lagace Date: Sun, 22 Dec 2019 12:57:35 -0500 Subject: [PATCH 4/8] Turn off perfect-scrollbar --- public/js/material-dashboard.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/js/material-dashboard.js b/public/js/material-dashboard.js index 30fc10b9..b7986449 100644 --- a/public/js/material-dashboard.js +++ b/public/js/material-dashboard.js @@ -20,11 +20,11 @@ if (isWindows) { // if we are on windows OS we activate the perfectScrollbar function - $('.sidebar .sidebar-wrapper, .main-panel').perfectScrollbar(); + //$('.sidebar .sidebar-wrapper, .main-panel').perfectScrollbar(); - $('html').addClass('perfect-scrollbar-on'); + //$('html').addClass('perfect-scrollbar-on'); } else { - $('html').addClass('perfect-scrollbar-off'); + //$('html').addClass('perfect-scrollbar-off'); } })(); From 047633c2ceddccd0fda607024c85a5bc8f1cc4aa Mon Sep 17 00:00:00 2001 From: Mathieu Lagace Date: Sun, 22 Dec 2019 13:10:57 -0500 Subject: [PATCH 5/8] Turn on perfect-scrollbar --- public/js/material-dashboard.js | 6 +++--- resources/views/admin/schedule/event/add.blade.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/js/material-dashboard.js b/public/js/material-dashboard.js index b7986449..30fc10b9 100644 --- a/public/js/material-dashboard.js +++ b/public/js/material-dashboard.js @@ -20,11 +20,11 @@ if (isWindows) { // if we are on windows OS we activate the perfectScrollbar function - //$('.sidebar .sidebar-wrapper, .main-panel').perfectScrollbar(); + $('.sidebar .sidebar-wrapper, .main-panel').perfectScrollbar(); - //$('html').addClass('perfect-scrollbar-on'); + $('html').addClass('perfect-scrollbar-on'); } else { - //$('html').addClass('perfect-scrollbar-off'); + $('html').addClass('perfect-scrollbar-off'); } })(); diff --git a/resources/views/admin/schedule/event/add.blade.php b/resources/views/admin/schedule/event/add.blade.php index db23c9cf..4a80d822 100644 --- a/resources/views/admin/schedule/event/add.blade.php +++ b/resources/views/admin/schedule/event/add.blade.php @@ -124,6 +124,6 @@ ) @endsection \ No newline at end of file From 2c18dc8c1dcc2c558840232cd63ae9a58df7c210 Mon Sep 17 00:00:00 2001 From: Mathieu Lagace Date: Sun, 22 Dec 2019 17:45:44 -0500 Subject: [PATCH 6/8] Update schedule editor --- app/EventType.php | 12 ++ app/Http/Controllers/EventTypeController.php | 85 +++++++++ .../Controllers/ScheduleEditorController.php | 60 ++++++- ..._12_22_145445_create_event_types_table.php | 44 +++++ public/js/plugins/schedule/editor.js | 131 +++++++++++++- .../admin/schedule/editor/template.blade.php | 22 +-- .../views/admin/schedule/event/add.blade.php | 168 +++++++++++------- routes/api.php | 3 +- routes/web.php | 2 +- 9 files changed, 448 insertions(+), 79 deletions(-) create mode 100644 app/EventType.php create mode 100644 app/Http/Controllers/EventTypeController.php create mode 100644 database/migrations/2019_12_22_145445_create_event_types_table.php diff --git a/app/EventType.php b/app/EventType.php new file mode 100644 index 00000000..9d98e112 --- /dev/null +++ b/app/EventType.php @@ -0,0 +1,12 @@ + 'array', + ]; +} diff --git a/app/Http/Controllers/EventTypeController.php b/app/Http/Controllers/EventTypeController.php new file mode 100644 index 00000000..231cb37e --- /dev/null +++ b/app/Http/Controllers/EventTypeController.php @@ -0,0 +1,85 @@ + $periode, 'niveau' => $niveau]); } - public function getTemplate() + public function getTemplate(int $id) { - return view('admin.schedule.editor.template'); + return view('admin.schedule.editor.template',["eventType" => \App\EventType::find($id)]); + } + + public function getEventTemplate(int $id) + { + $eventType = \App\EventType::find($id); + + return json_encode($eventType); + } + + public function test() + { + $evenType = new \App\EventType(); + + $evenType->name = "Soirée d'instruction régulière"; + $evenType->admin_desc = "Veuillez modifier la description admin par défaut"; + $evenType->calendar_color = "orange"; + $evenType->calendar_icon = "fas fa-book"; + $evenType->begin_time = "12:00"; + $evenType->end_time = "18:00"; + $evenType->location = "Escadron"; + $evenType->is_mandatory = true; + $evenType->use_weekly_msg = true; + $evenType->weekly_msg_publication_time = "-5days"; + $evenType->use_schedule = true; + $evenType->schedule_model = [ + "periodes" => [ + 0 => [ + "name" => "Periode 1", + "begin_time" => "19:00", + "end_time" => "20:10" + ], + 1 => [ + "name" => "Pause", + "begin_time" => "20:10", + "end_time" => "20:30" + ], + 2 => [ + "name" => "Periode 1", + "begin_time" => "20:30", + "end_time" => "21:20" + ] + ], + "niveaux" => [ + 0 => [ + "name" => "Niveau 1" + ], + 1 => [ + "name" => "Niveau 2" + ], + 2 => [ + "name" => "Niveau 3" + ] + ] + ]; + $evenType->is_promoted = true; + //$evenType->save(); } } diff --git a/database/migrations/2019_12_22_145445_create_event_types_table.php b/database/migrations/2019_12_22_145445_create_event_types_table.php new file mode 100644 index 00000000..210d134d --- /dev/null +++ b/database/migrations/2019_12_22_145445_create_event_types_table.php @@ -0,0 +1,44 @@ +bigIncrements('id'); + $table->string('name'); + $table->text('admin_desc'); + $table->string('calendar_color')->default('blue'); + $table->string('calendar_icon')->default(''); + $table->string('begin_time')->default('12:00'); + $table->string('end_time')->default('13:00'); + $table->string('location')->default('Escadron'); + $table->boolean('is_mandatory')->default(false); + $table->boolean('use_weekly_msg')->default(false); + $table->string('weekly_msg_publication_time')->default('-5day'); + $table->boolean('use_schedule')->default(false); + $table->text('schedule_model'); + $table->boolean('is_promoted')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('event_types'); + } +} diff --git a/public/js/plugins/schedule/editor.js b/public/js/plugins/schedule/editor.js index 31a7ba25..7289e417 100644 --- a/public/js/plugins/schedule/editor.js +++ b/public/js/plugins/schedule/editor.js @@ -1,8 +1,8 @@ -function initScheduleEditor(id, periode, niveau) +function initScheduleEditor(id, eventType) { $.ajax({ type: 'GET', - url: '/api/schedule/editor/init?api_token='+api_token, + url: '/api/schedule/editor/init/'+eventType+'?api_token='+api_token, success: function (template) { $("#"+id).html(template); for (let pniveau = 1; pniveau <= 3; pniveau++) { @@ -16,11 +16,49 @@ function initScheduleEditor(id, periode, niveau) showNotification('error','Impossible d\'initialiser l\'éditeur d\'horaire ...','top', 'center') } }) + $('.datetimepicker').datetimepicker({ + icons: { + time: "fa fa-clock-o", + date: "fa fa-calendar", + up: "fa fa-chevron-up", + down: "fa fa-chevron-down", + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-screenshot', + clear: 'fa fa-trash', + close: 'fa fa-remove' + } + }); + $('.richeditor').trumbowyg({ + lang: 'fr' + }); + $('select').selectpicker(); } -function loadTemplate(id) +function switchUseWeeklyMsg() { - $.get('/api/schedule/editor/init?api_token='+api_token, function ( data ) {$("#"+id).html(data);}); + + if($('#use_weekly_msg').is(":checked")) + { + $('#collmessagedelasemaine').removeClass('d-none'); + } + else + { + $('#collmessagedelasemaine').addClass('d-none'); + } + +} + +function switchUseSchedule() +{ + if($('#use_schedule').is(":checked")) + { + $('#collschedule').removeClass('d-none'); + } + else + { + $('#collschedule').addClass('d-none'); + } } function loadCourse(periode,niveau) @@ -35,4 +73,89 @@ function loadCourse(periode,niveau) showNotification('error','Impossible de charger les cours ...','top', 'center') } }) +} + +function loadEventType(date) +{ + var selectInput = $('#type'); + var id = selectInput.val(); + $.ajax({ + type: 'GET', + url: '/api/schedule/editor/template/'+id+'?api_token='+api_token, + success: function (data) { + var result = JSON.parse(data); + initScheduleEditor("scheduleEditor",id) + $.each(result, function (i, val) { + if(i == "is_mandatory" || i == "use_schedule" || i == "use_weekly_msg") + { + if(val == 1) + { + $('#'+i).prop( "checked", true ); + } + else + { + $('#'+i).prop( "checked", false ); + } + switchUseSchedule(); + switchUseWeeklyMsg(); + } + else if(i == "begin_time" || i == "end_time") + { + var foo = $('#'+i); + var mdate = moment(date+" "+val); + foo.data("DateTimePicker").destroy(); + foo.datetimepicker({ + icons: { + time: "fa fa-clock-o", + date: "fa fa-calendar", + up: "fa fa-chevron-up", + down: "fa fa-chevron-down", + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-screenshot', + clear: 'fa fa-trash', + close: 'fa fa-remove' + }, + date: new Date(mdate) + }); + + } + else if(i == "weekly_msg_publication_time") + { + var foo = $('#'+i); + var mdate = moment(date+" "+result["begin_time"]); + mdate.subtract(5, 'days'); + foo.data("DateTimePicker").destroy(); + foo.datetimepicker({ + icons: { + time: "fa fa-clock-o", + date: "fa fa-calendar", + up: "fa fa-chevron-up", + down: "fa fa-chevron-down", + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-screenshot', + clear: 'fa fa-trash', + close: 'fa fa-remove' + }, + date: new Date(mdate) + }); + + } + else if(i == "location" || i == "name") + { + var foo = $('#'+i); + foo.val(val); + } + else if(i == "admin_desc") + { + var foo = $('#'+i); + foo.trumbowyg('html', val); + } + }); + }, + error: function () { + showNotification('error','Impossible de charger le type d\'évenement ...','top', 'center') + } + }) } \ No newline at end of file diff --git a/resources/views/admin/schedule/editor/template.blade.php b/resources/views/admin/schedule/editor/template.blade.php index 6ef641b3..cd64c21d 100644 --- a/resources/views/admin/schedule/editor/template.blade.php +++ b/resources/views/admin/schedule/editor/template.blade.php @@ -4,27 +4,27 @@ Niveau/Periode
- @for($i = 1; $i <= 3; $i++) + @foreach($eventType->schedule_model['niveaux'] as $niveau)
- +
- @endfor + @endforeach
-@for($j = 1; $j <= 3; $j++) +@foreach($eventType->schedule_model['periodes'] as $periode)
- + @@ -32,28 +32,28 @@
- +
- +
- @for($i = 1; $i <= 3; $i++) -
+ @foreach($eventType->schedule_model['niveaux'] as $niveau) +
@loaderDot
- @endfor + @endforeach
-@endfor +@endforeach
@@ -37,12 +116,21 @@

Options

+
+ + Choisir le type d'activité supprimera vos modification actuel + +
L'activité est-elle obligatoire pour tout les cadets ?
@@ -53,7 +141,7 @@ Inclure des messages de la semaine avec l'activité ?
@@ -64,7 +152,7 @@ Inclure un horaire avec l'activité ?
@@ -81,49 +169,9 @@ - - @endsection \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 3d3df645..d7bb23ff 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,8 +19,9 @@ Route::middleware('auth:api')->group(function () { Route::get('/schedule/events/modal/full/{id}/{db_type}','ScheduleController@loadModalFull')->middleware('perm:schedule_see'); Route::get('/schedule/events/add/modal/{type}/{date}','ScheduleController@loadModalDefautType')->middleware('perm:schedule_add'); - Route::get('/schedule/editor/init','ScheduleEditorController@getTemplate')->middleware('perm:schedule_edit'); + Route::get('/schedule/editor/init/{id}','ScheduleEditorController@getTemplate')->middleware('perm:schedule_edit'); Route::get('/schedule/editor/course/{niveau}/{periode}','ScheduleEditorController@getCourseEmpty')->middleware('perm:schedule_edit'); + Route::get('/schedule/editor/template/{id}','ScheduleEditorController@getEventTemplate')->middleware('perm:schedule_add'); Route::post('/schedule/event/delete/{id}','ScheduleController@delete')->middleware('perm:schedule_delete'); /** Booking */ diff --git a/routes/web.php b/routes/web.php index 8f4d3fd9..093884cd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -15,7 +15,7 @@ use Illuminate\Support\Facades\Storage; /* Basic Auth Route */ Auth::routes(); Route::get('logout', 'Auth\LoginController@logout')->name('logout'); -Route::get("/test",'OCOMController@create'); +Route::get("/test/{id}",'ScheduleEditorController@getEventTemplate'); /** Public Route */ From c20024ed96cc68951f79f970006c589e5d5b4865 Mon Sep 17 00:00:00 2001 From: Mathieu Lagace Date: Mon, 23 Dec 2019 17:57:41 -0500 Subject: [PATCH 7/8] Update schedule editor --- app/Http/Controllers/OCOMController.php | 27 ++++++ .../Controllers/ScheduleEditorController.php | 2 +- public/css/material-dashboard.css | 6 +- public/js/plugins/autocomplete.js | 10 ++ public/js/plugins/schedule/editor.js | 82 +++++++++++++++- .../admin/schedule/editor/course.blade.php | 93 +++++++++++++------ .../admin/schedule/editor/template.blade.php | 44 +++++++-- .../views/admin/schedule/event/add.blade.php | 6 +- routes/api.php | 3 +- 9 files changed, 229 insertions(+), 44 deletions(-) diff --git a/app/Http/Controllers/OCOMController.php b/app/Http/Controllers/OCOMController.php index e0c4c129..16e7d2bc 100644 --- a/app/Http/Controllers/OCOMController.php +++ b/app/Http/Controllers/OCOMController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\OCOM; use Illuminate\Http\Request; +use function GuzzleHttp\json_encode; use function GuzzleHttp\Psr7\str; class OCOMController extends Controller @@ -699,4 +700,30 @@ X20,\"Participer à des activités { // } + + public function jsonList() + { + $ocoms = \App\OCOM::all(); + + $name = []; + + foreach ($ocoms as $ocom) { + array_push($name, $ocom->ocom); + } + + return json_encode($name); + } + + public function getName(string $ocom) + { + $foo = \App\OCOM::all()->where('ocom','=',$ocom)->first(); + if($foo != null) + { + return $foo->objectif_competence; + } + else + { + return null; + } + } } diff --git a/app/Http/Controllers/ScheduleEditorController.php b/app/Http/Controllers/ScheduleEditorController.php index 4387b10d..bd4e9664 100644 --- a/app/Http/Controllers/ScheduleEditorController.php +++ b/app/Http/Controllers/ScheduleEditorController.php @@ -56,7 +56,7 @@ class ScheduleEditorController extends Controller "end_time" => "20:30" ], 2 => [ - "name" => "Periode 1", + "name" => "Periode 2", "begin_time" => "20:30", "end_time" => "21:20" ] diff --git a/public/css/material-dashboard.css b/public/css/material-dashboard.css index 223c69a9..4b2dc50c 100644 --- a/public/css/material-dashboard.css +++ b/public/css/material-dashboard.css @@ -3305,9 +3305,9 @@ fieldset:disabled a.btn { } .btn-secondary:hover { - color: #ffffff; - background-color: #5a6268; - border-color: #545b62; + color: #ffffff !important; + background-color: #5a6268 !important; + border-color: #545b62 !important; } .btn-secondary:focus, diff --git a/public/js/plugins/autocomplete.js b/public/js/plugins/autocomplete.js index 2102ed7e..a0c6a0b0 100644 --- a/public/js/plugins/autocomplete.js +++ b/public/js/plugins/autocomplete.js @@ -103,4 +103,14 @@ function initAutoComplete(htmlClass) autocomplete(document.getElementById(this.id), users); }) }); +} + +function initAutoCompleteOCOM(htmlClass) +{ + $.get('/api/ocom/list?api_token='+api_token, function ( data ) { + var ocoms = JSON.parse(data); + $("."+htmlClass).each(function ( index ) { + autocomplete(document.getElementById(this.id), ocoms); + }) + }); } \ No newline at end of file diff --git a/public/js/plugins/schedule/editor.js b/public/js/plugins/schedule/editor.js index 7289e417..67ab97db 100644 --- a/public/js/plugins/schedule/editor.js +++ b/public/js/plugins/schedule/editor.js @@ -1,3 +1,5 @@ +var editorTemplate; + function initScheduleEditor(id, eventType) { $.ajax({ @@ -10,7 +12,8 @@ function initScheduleEditor(id, eventType) loadCourse(pniveau,pperiode); } } - initAutoComplete("AutoComplete"); + initAutoComplete("AutoCompleteUser"); + initAutoCompleteOCOM('AutoCompleteOCOM'); }, error: function () { showNotification('error','Impossible d\'initialiser l\'éditeur d\'horaire ...','top', 'center') @@ -84,6 +87,7 @@ function loadEventType(date) url: '/api/schedule/editor/template/'+id+'?api_token='+api_token, success: function (data) { var result = JSON.parse(data); + editorTemplate = result; initScheduleEditor("scheduleEditor",id) $.each(result, function (i, val) { if(i == "is_mandatory" || i == "use_schedule" || i == "use_weekly_msg") @@ -158,4 +162,80 @@ function loadEventType(date) showNotification('error','Impossible de charger le type d\'évenement ...','top', 'center') } }) +} + +function updateCourseName(niveau, periode) { + setTimeout(function(){ + let val = $('#ocom_n'+niveau+'_p'+periode).val(); + if(val != "") + { + $.ajax({ + type: 'GET', + url: '/api/ocom/'+val+'/name?api_token='+api_token, + success: function (data) { + if(data != null && data != "") + { + $('#name_n'+niveau+'_p'+periode).val(data); + } + }, + error: function () { + showNotification('error','Erreur impossible de charger l\'objectif de rendement ...','top', 'center') + } + }) + } + }, 100); +} + +function selectCourseMode(mode, niveau, periode) +{ + if(mode == "course") + { + $('#descContainer'+niveau+'-'+periode).addClass('d-none'); + $('#isDoneContainer'+niveau+'-'+periode).removeClass('d-none'); + $('#isDoneContainer'+niveau+'-'+periode).addClass('d-flex'); + $('#OCOMContainer'+niveau+'-'+periode).removeClass('d-none'); + $('#nameContainer'+niveau+'-'+periode).removeClass('d-none'); + $('#modeSwitchC'+niveau+'-'+periode).addClass('active'); + $('#modeSwitchO'+niveau+'-'+periode).removeClass('active'); + } + else + { + $('#descContainer'+niveau+'-'+periode).removeClass('d-none'); + $('#isDoneContainer'+niveau+'-'+periode).addClass('d-none'); + $('#isDoneContainer'+niveau+'-'+periode).removeClass('d-flex'); + $('#OCOMContainer'+niveau+'-'+periode).addClass('d-none'); + $('#nameContainer'+niveau+'-'+periode).addClass('d-none'); + $('#modeSwitchC'+niveau+'-'+periode).removeClass('active'); + $('#modeSwitchO'+niveau+'-'+periode).addClass('active'); + } +} + +function selectCourseModePeriode(mode,periode) +{ + $.each(editorTemplate['schedule_model']['niveaux'], function (i, val) { + selectCourseMode(mode,i+1,periode); + }); +} + +function selectCourseModeNiveau(mode,niveau) +{ + $.each(editorTemplate['schedule_model']['periodes'], function (i, val) { + selectCourseMode(mode,niveau,i+1); + }); +} + +function updatePlantext(toggle,id) +{ + if($('#'+toggle).is(":checked")) + { + $('#'+id).removeClass('text-warning'); + $('#'+id).addClass('text-success'); + $('#'+id).html('Plan de cours remis') + } + else + { + $('#'+id).addClass('text-warning'); + $('#'+id).removeClass('text-success'); + $('#'+id).html('Plan de cours non remis') + } } \ No newline at end of file diff --git a/resources/views/admin/schedule/editor/course.blade.php b/resources/views/admin/schedule/editor/course.blade.php index 74cb0673..17a7b53c 100644 --- a/resources/views/admin/schedule/editor/course.blade.php +++ b/resources/views/admin/schedule/editor/course.blade.php @@ -1,36 +1,77 @@ -
-
-
- - +
+
+
+
+ +
+
+ Plan de cours non remis +
-
-
- -
+
+
+
+
+
+ + +
+
+
+
+
+ +
+ +
+
+
+
+ + -
-
-
-
- - -
-
-
-
-
- +
-
+
+ Test +
\ No newline at end of file diff --git a/resources/views/admin/schedule/editor/template.blade.php b/resources/views/admin/schedule/editor/template.blade.php index cd64c21d..d21dd37e 100644 --- a/resources/views/admin/schedule/editor/template.blade.php +++ b/resources/views/admin/schedule/editor/template.blade.php @@ -6,11 +6,24 @@
@foreach($eventType->schedule_model['niveaux'] as $niveau)
-
- -
@endforeach @@ -23,11 +36,24 @@ @foreach($eventType->schedule_model['periodes'] as $periode)
-
- - +
+
+
+ + +
+
+
+ + +
@@ -45,7 +71,7 @@
@foreach($eventType->schedule_model['niveaux'] as $niveau) -
+
@loaderDot
@endforeach diff --git a/resources/views/admin/schedule/event/add.blade.php b/resources/views/admin/schedule/event/add.blade.php index cb2d3c2a..ca482534 100644 --- a/resources/views/admin/schedule/event/add.blade.php +++ b/resources/views/admin/schedule/event/add.blade.php @@ -58,7 +58,7 @@
-