diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/website_slides_survey/static/src | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_slides_survey/static/src')
7 files changed, 300 insertions, 0 deletions
diff --git a/addons/website_slides_survey/static/src/img/certification.svg b/addons/website_slides_survey/static/src/img/certification.svg new file mode 100644 index 00000000..54895cf6 --- /dev/null +++ b/addons/website_slides_survey/static/src/img/certification.svg @@ -0,0 +1 @@ +<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path d="M7.158 11.549a2.005 2.005 0 0 1-3.105-1.286 2.005 2.005 0 0 1-1.286-3.105 2.005 2.005 0 0 1 1.286-3.105 2.005 2.005 0 0 1 3.105-1.286 2.005 2.005 0 0 1 3.105 1.286 2.005 2.005 0 0 1 1.286 3.105 2.005 2.005 0 0 1-1.286 3.105 2.005 2.005 0 0 1-3.105 1.286z" id="a"/><filter filterUnits="objectBoundingBox" id="b"><feMorphology radius=".5" in="SourceAlpha" result="shadowSpreadInner1"/><feOffset in="shadowSpreadInner1" result="shadowOffsetInner1"/><feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0749562937 0" in="shadowInnerInner1"/></filter><path id="d" d="M6.04788912 6.85018391L7.55257375 8.20939291 9.91700506 6 11 6.947144 7.55257375 10 5 7.75171917z"/><filter x="-2.5%" y="-3.8%" width="105%" height="115%" filterUnits="objectBoundingBox" id="c"><feOffset dy=".3" in="SourceAlpha" result="shadowOffsetOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.233200393 0" in="shadowOffsetOuter1"/></filter></defs><g transform="translate(-2 -2)" fill="none" fill-rule="evenodd"><g transform="rotate(22 5.57 9.903)"><use fill="#00C9FF" xlink:href="#a"/><use fill="#000" filter="url(#b)" xlink:href="#a"/><path stroke="#FFF" stroke-width=".7" d="M7.158 11.96a2.355 2.355 0 0 1-3.395-1.407 2.355 2.355 0 0 1-1.406-3.395 2.355 2.355 0 0 1 1.406-3.395 2.355 2.355 0 0 1 3.395-1.406 2.355 2.355 0 0 1 3.395 1.406 2.355 2.355 0 0 1 1.406 3.395 2.355 2.355 0 0 1-1.406 3.395 2.355 2.355 0 0 1-3.395 1.406z"/></g><use fill="#000" filter="url(#c)" xlink:href="#d"/><use fill="#FFF" xlink:href="#d"/></g></svg>
\ No newline at end of file diff --git a/addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js b/addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js new file mode 100644 index 00000000..e258201b --- /dev/null +++ b/addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js @@ -0,0 +1,39 @@ +odoo.define('website_slides_survey.certification_upload_toast', function (require) { +'use strict'; + +var publicWidget = require('web.public.widget'); + +var sessionStorage = window.sessionStorage; +var core = require('web.core'); +var _t = core._t; + + +publicWidget.registry.CertificationUploadToast = publicWidget.Widget.extend({ + selector: '.o_wslides_survey_certification_upload_toast', + + /** + * @override + */ + start: function () { + var self = this; + this._super.apply(this, arguments).then(function () { + var url = sessionStorage.getItem("survey_certification_url"); + if (url) { + self.displayNotification({ + type: 'info', + title: _t('Certification created'), + message: _.str.sprintf( + _t('Follow this link to add questions to your certification. <a href="%s">Edit certification</a>'), + url + ), + sticky: true, + }); + sessionStorage.removeItem("survey_certification_url"); + } + }); + }, +}); + +return publicWidget.registry.CertificationUploadToast; + +}); diff --git a/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js b/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js new file mode 100644 index 00000000..07277be6 --- /dev/null +++ b/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js @@ -0,0 +1,31 @@ +odoo.define('website_slides_survey.fullscreen', function (require) { +"use strict"; + +var core = require('web.core'); +var QWeb = core.qweb; +var Fullscreen = require('website_slides.fullscreen'); + +Fullscreen.include({ + xmlDependencies: (Fullscreen.prototype.xmlDependencies || []).concat( + ["/website_slides_survey/static/src/xml/website_slides_fullscreen.xml"] + ), + + /** + * Extend the _renderSlide method so that slides of type "certification" + * are also taken into account and rendered correctly + * + * @private + * @override + */ + _renderSlide: function (){ + var def = this._super.apply(this, arguments); + var $content = this.$('.o_wslides_fs_content'); + if (this.get('slide').type === "certification"){ + $content.html(QWeb.render('website.slides.fullscreen.certification',{widget: this})); + } + return Promise.all([def]); + }, +}); +}); + + diff --git a/addons/website_slides_survey/static/src/js/slides_upload.js b/addons/website_slides_survey/static/src/js/slides_upload.js new file mode 100644 index 00000000..54dc18da --- /dev/null +++ b/addons/website_slides_survey/static/src/js/slides_upload.js @@ -0,0 +1,141 @@ +odoo.define('website_slides_survey.upload_modal', function (require) { +"use strict"; + +var core = require('web.core'); +var _t = core._t; +var sessionStorage = window.sessionStorage; +var SlidesUpload = require('website_slides.upload_modal'); + +/** + * Management of the new 'certification' slide_type + */ +SlidesUpload.SlideUploadDialog.include({ + events: _.extend({}, SlidesUpload.SlideUploadDialog.prototype.events || {}, { + 'change input#certification_id': '_onChangeCertification' + }), + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Will automatically set the title of the slide to the title of the chosen certification + */ + _onChangeCertification: function (ev) { + if (ev.added && ev.added.text) { + this.$("input#name").val(ev.added.text); + } + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Overridden to add the "certification" slide type + * + * @override + * @private + */ + _setup: function () { + this._super.apply(this, arguments); + this.slide_type_data['certification'] = { + icon: 'fa-trophy', + label: _t('Certification'), + template: 'website.slide.upload.modal.certification', + }; + }, + /** + * Overridden to add certifications management in select2 + * + * @override + * @private + */ + _bindSelect2Dropdown: function () { + this._super.apply(this, arguments); + + var self = this; + this.$('#certification_id').select2(this._select2Wrapper(_t('Certification'), false, + function () { + return self._rpc({ + route: '/slides_survey/certification/search_read', + params: { + fields: ['title'], + } + }); + }, 'title') + ); + }, + /** + * The select2 field makes the "required" input hidden on the interface. + * We need to make the "certification" field required so we override this method + * to handle validation in a fully custom way. + * + * @override + * @private + */ + _formValidate: function () { + var result = this._super.apply(this, arguments); + + var $certificationInput = this.$('#certification_id'); + if ($certificationInput.length !== 0) { + var $select2Container = $certificationInput + .closest('.form-group') + .find('.select2-container'); + $select2Container.removeClass('is-invalid is-valid'); + if ($certificationInput.is(':invalid')) { + $select2Container.addClass('is-invalid'); + } else if ($certificationInput.is(':valid')) { + $select2Container.addClass('is-valid'); + } + } + + return result; + }, + /** + * Overridden to add the 'certification' field into the submitted values + * + * @override + * @private + */ + _getSelect2DropdownValues: function () { + var result = this._super.apply(this, arguments); + + var certificateValue = this.$('#certification_id').select2('data'); + var survey = {}; + if (certificateValue) { + if (certificateValue.create) { + survey.id = false; + survey.title = certificateValue.text; + } else { + survey.id = certificateValue.id; + } + } + result['survey'] = survey; + return result; + }, + + /** + * Overridde to handle certification created on-the-fly: toaster will hold + * survey edit url, need to put it in session to use it in CertificationUploadToast + * + * @override + * @private + */ + _onFormSubmitDone: function (data) { + if (!data.error && data.redirect_to_certification) { + sessionStorage.setItem("survey_certification_url", data.redirect_url); + window.location.reload(); + } else { + this._super.apply(this, arguments); + } + }, +}); + +SlidesUpload.websiteSlidesUpload.include({ + xmlDependencies: (SlidesUpload.websiteSlidesUpload.prototype.xmlDependencies || []).concat( + ["/website_slides_survey/static/src/xml/website_slide_upload.xml"] + ), +}); + +}); diff --git a/addons/website_slides_survey/static/src/scss/website_slides_survey.scss b/addons/website_slides_survey/static/src/scss/website_slides_survey.scss new file mode 100644 index 00000000..3aaa5033 --- /dev/null +++ b/addons/website_slides_survey/static/src/scss/website_slides_survey.scss @@ -0,0 +1,34 @@ +$o_wss_color_1 : #5B7687; +$o_wss_color_2 : #485761; + +// General +// ************************************************** +.o_wss_certification_icon { + @include size(1.4em, auto); +} + +// Course page +// ************************************************** +#wrap.o_wss_certification_channel { + .o_wslides_course_header { + background-image: linear-gradient(120deg, $o_wss_color_1, $o_wss_color_2); + } + + .o_wslides_course_pict { + @include media-breakpoint-up(md) { + border-color: $o_wss_color_2; + } + } + + .o_wslides_nav_tabs .nav-link { + @include media-breakpoint-up(md) { + &, &:hover{ + border-color: $o_wss_color_1; + } + + &.active { + border-color: $gray-100; + } + } + } +} diff --git a/addons/website_slides_survey/static/src/xml/website_slide_upload.xml b/addons/website_slides_survey/static/src/xml/website_slide_upload.xml new file mode 100644 index 00000000..c34a0811 --- /dev/null +++ b/addons/website_slides_survey/static/src/xml/website_slide_upload.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<template> + <t t-name="website.slide.upload.modal.certification"> + <div> + <form class="clearfix"> + <div class="row"> + <div id="o_wslides_js_slide_upload_left_column" class="col-md-6"> + <div class="form-group"> + <label for="certification_id" class="col-form-label">Certification</label> + <input class="form-control" id="certification_id" required="required"/> + </div> + <t t-call="website.slide.upload.modal.common"/> + <canvas id="data_canvas" class="d-none"></canvas> + </div> + + <div id="o_wslides_js_slide_upload_preview_column" class="col-md-6"> + <div class="img-thumbnail h-100"> + <div class="o_slide_tutorial p-3"> + <div class="h5">How to upload a certification on your course?</div> + <div class="mx-3 my-4">You can create your certification from here or use an existing one. Once your certification is created, you can still edit it in backend.</div> + </div> + </div> + </div> + </div> + </form> + </div> + </t> +</template> diff --git a/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml b/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml new file mode 100644 index 00000000..7ca796f6 --- /dev/null +++ b/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<templates> + + <t t-name="website.slides.fullscreen.certification"> + <div class="justify-content-center align-self-center"> + <div t-if="widget.get('slide').type === 'certification' && !widget.get('slide').completed" class=""> + <a class="btn btn-primary" t-att-href="'/slides_survey/slide/get_certification_url?slide_id=' + widget.get('slide').id" target="_blank"> + <i class="fa fa-trophy"/> + <span t-if="widget.get('slide').isMember"> Pass Certification</span> + <span t-else="">Test Certification</span> + </a> + </div> + <div class="" t-if="widget.get('slide').type === 'certification' && widget.get('slide').completed"> + <a role="button" class="btn btn-primary" t-att-href="'/survey/' + widget.get('slide').certificationId + '/get_certification'"> + <i class="fa fa-fw fa-trophy" role="img" aria-label="Download certification" title="Download certification"/> Download certification + </a> + </div> + </div> + </t> + + <t t-extend="website.slides.fullscreen.title"> + <t t-jquery=".o_wslides_fs_slide_title_span" t-operation="before"> + <i t-if="widget.get('slide').type === 'certification'" class="fa fa-trophy mr-2 text"></i> + </t> + </t> +</templates> |
