summaryrefslogtreecommitdiff
path: root/addons/website_slides_survey/static/src
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_slides_survey/static/src
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_slides_survey/static/src')
-rw-r--r--addons/website_slides_survey/static/src/img/certification.svg1
-rw-r--r--addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js39
-rw-r--r--addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js31
-rw-r--r--addons/website_slides_survey/static/src/js/slides_upload.js141
-rw-r--r--addons/website_slides_survey/static/src/scss/website_slides_survey.scss34
-rw-r--r--addons/website_slides_survey/static/src/xml/website_slide_upload.xml28
-rw-r--r--addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml26
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' &amp;&amp; !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' &amp;&amp; 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>